انتخاب بازه‌ای از تاریخ و ساعت در اندروید - داستان ایجاد یک کتابخانه

فکر کنم پیام صادری بود یه بار گفت «هر توسعه‌دهنده ایرانی و یک کتابخانه شمسی» راست هم می‌گفت. اینترنت رو بگردی به ازای هر زبان برنامه‌نویسی چندین و چند کتابخانه برای انتخاب تاریخ شمسی وجود داره. چندی پیش دنبال یکیشون برای اندروید بودم که به کتابخانه‌ای که محمد ایجاد کرده رسیدم.

https://github.com/mohamad-amin/PersianMaterialDateTimePicker

در ابتدا متوجه شدم که از تغییر فونت پشتیبانی نمی‌کنه همانگونه که کتابخانه اصلی که محمد اون رو به شمسی ویرایش کرده ازش پشتیبانی نمی‌کرد. با سماجت دونه دونه گشتم و هرچی المان داشت رو تغییر فونت دادم و یه تابع برای مشخص کردن فایل فونت مورد نظر نوشتم و بهش PR دادم. اما چیزی که هنوز درست نبود راست به چپ بودن ایام هفته و به طبع عدد روزهای هر ماه بود. از خیر اون گذشتم و ازش استفاده کردم. ساعت که از ۱۲ شب گذشت دیدم یه مشکل دیگه داره و اونم اینه که هنوز تاریخ دیروز رو نشون میده و هنوز فردا نشده. خیلی سعی و کوشش کردم که کتابخانه رو درست کنم که متاسفانه موفق نشدم. می‌دونستم هرچی هست به TimeZone ربط داره اما همین که یه بخشش درست می‌شد می‌زد یه جای دیگه رو داغون می‌‌کرد. ولش کردم.

در برنامه‌ای که رووش کار می‌کردم نیاز به یک کتابخانه داشتم که بشه بازه‌ای از زمان رو انتخاب کرد. برای فیلترکردن دیتا بهش نیاز داشتم. کتابخانه‌ی فارسی که از تاریخ شمسی پشتیبانی کنه رو برای این منظور پیدا نکردم. یه کتابخانه میلادی بود که از قضا با کتابخانه محمد پایه مشترکی داشتن. گفتم بشینم این رو ویرایش کنم بشه «کتابخانه انتخاب بازه‌ای تاریخ شمسی و ساعت در اندروید»

اولین کار این بود که کلاس‌های مربوط به Dialog اون رو تغییر نام دادم. چرا که ممکن بود کسی از کتابخانه محمد و این کتابخانه کنار هم استفاده کنه و چون پایه هر دو یکی بود، کلاس‌ها با هم تداخل پیدا می‌کردن. بعدش جاهایی که محمد تاریخ رو از میلادی به شمسی تبدیل کرده بود رو اعمال کردم.

کتابخانه به شکل برنامه محمد در اومد و این موقع بود که دیگه راست به چپ نبودنش رو تاب نیاوردم. کد رو که نگاه کردم در چند بخش مکان هر عدد(روزها) رو به صورت x,y محاسبه می‌کرد و عدد یا نام روز هفته رو در اون مکان قرار می‌داد. سپس در یک حلقه و به تعداد روزهای هفته مقدار x رو اضافه می‌کرد و نقطه بعدی رو قرار می‌داد. با تموم شدن یک هفته مقدار y رو اضافه می‌کرد تا در مکان پایین‌تر هفته بعد رو قرار بده و الا آخر. این روند رو با تغییر چندین خط و محاسبه نقاط جدید، معکوس کردم. با اضافه کردن یک padding به سمت راست تقویم شکلش قابل قبول شد.

سپس روی هر نقطه که کلیک می‌کردم تابع دیگری فراخوانی می‌شد که عدد زیرش رو برگردونه. چون این تابع ویرایش نشده بود دقیقا نقطه قرینه رو انتخاب می‌کرد. مثلا ۱ام رو انتخاب می‌کردم اون ۷ام رو انتخاب می‌کرد. با ویرایش اون تابع هم دیگه مشکل راست به چپ حل شد. تغییر فونتش رو هم که قبلا حل کرده بود و به راحتی در این کتابخانه هم اعمال شد.

اما باز که ساعت ۱۲ شب شد دیدم هنوز دیروزه و فردا نشده. چندین و چند ساعت وقت گذاشتم اما راه حلی یافت نشد. هرچی روش کثیف بود رو امتحان کردم. حتی از کلاس‌های دیگه هم استفاده کردم که تاریخ شمسی رو به میلادی تبدیل می‌کردن.

یوهو یادم افتاد که علی عبدالهی هم کتابخانه‌ای برای انتخاب تاریخ شمسی نوشته. دوباره دانلوش کردم که تستش کنم.

https://github.com/hamsaadev/Persian-Date-Picker-Dialog/

اجرا که کردم دیدم برای علی هم هنوز فردا نشده. هر دو از یک کلاس به نام PersianCalendar استفاده کرده بودن. معلوم شد که مشکل از این کلاسه و با دیباگ کردن فهمیدم که تابع calculatePersianDate تاریخ شمسی رو اشتباه محاسبه می‌کنه. اسم این تابع رو گوگل کنید متوجه می‌شید که خیلی جاها استفاده شده و خب باعث بروز این مشکل میشه. در یکی از همین جستجوها یک شخصی به نام سیاوش راه حل عبور از این مشکل رو ارائه داده بود که با استفاده از کد اون مشکل حل شد. فرصتی بشه حتما سعی می‌کنم این دو کتابخانه رو هم ویرایش کنم تا مشکل اونا هم رفع بشه.

تا الان یه کتابخانه داشتم که تاریخش شمسی شده بود، راست به چپ شده بود و مشکل محاسبات تاریخش هم حل شده بود.

تنها مونده بود انتشارش که در لینک زیر قابل دسترس است. برای حل مشکلات احتمالی و بهبودش به گرمی از pull request شما استقبال می‌شه :-)

https://github.com/bkhezry/PersianDateRangePicker/