# مقدمه
بالاخره به قسمت مهم این آزمون یعنی پیادهسازی پروژه اندرویدی رسیدیم. دقت کنید که در این قسمت تمرکز اصلی ما در ارزیابی بر روی نحوهی پیادهسازی و خوانایی کد شماست. همچنین در بخشهای مختلف قسمتهای امتیازی قرار دادیم که با انجام آنها میتوانید امتیاز بیشتری کسب کنید.
یک پروژه اولیه برای شروع در اختیار شما گذاشته میشود. در ادامه میتوانید برای پیادهسازی قسمت *UI* از `xml` یا `jetpack compose` استفاده کنید توجه کنید که استفاده از کامپوز امتیاز مثبت دارد. درضمن استفاده از کتابخانههای مختلف اندروید که به نیازهای شما پاسخ میدهند به عهده خود شماست.
پروژهای که با هم توسعه میدهیم از چندین بخش تشکیل شده و هر بخش نمرهی جداگانهای دارد پس هر تعدادی از این بخشها را که موفق به پیادهسازی آن شدید، برای ما ارسال کنید.
توجه کنید که در نهایت باید فایلهای پروژهی خودتان را به صورت *ZIP* در سیستم داوری برای ما ارسال کنید.
**[فایل اولیه](https://quera.org/qbox/view/nVDNqAR9ii/ComicFeed.zip) پروژه را میتوانید از این لینک دانلود کنید.**
# تعریف پروژه
در این پروژه میخواهیم یک اپلیکیشن *Feed* برای نشان دادن *Comic* های منتشر شده توسط وبسایت [XKCD](https://xkcd.com/) طراحی کنیم. برای شروع، ابتدا پروژهی اولیه که لینک آن را در مقدمه فرستادیم دانلود کنید و پس از اینکه آن را از حالت *ZIP* خارج کردید در اندروید استودیو اجرا کنید.
**توجه:** برای بیلد کردن این پروژه ممکن است نیاز به تحریمشکن داشته باشید. میتوانید از تحریمشکنهایی مانند [شکن](https://shecan.ir) یا [403](https://403.online) استفاده کنید و بعد از اینکه ریسورسهای مورد نیاز دانلود شد و پروژه سینک شد، میتوانید پروژه را اجرا کنید.
**توجه:** پوشههای مربوط به *build* را در فایل زیپ نگذارید.
برای قسمت اول از شما انتظار داریم که یک لیست قابل *scroll* برای نشان دادن *comic*هایی که اطلاعات آنها به صورت لیست هاردکد شده در کلاس `ComicDataSourceImpl` ذخیره شده است را پیادهسازی کنید. مشابه شکل زیر:
![تصویر سوال](https://quera.org/qbox/view/X49u32N3bd/pasted%20image%200.png)
نیازی نیست که پیادهسازی شما دقیقا مثل شکل بالا باشد. مهم این است که به هر شکلی که ترجیح میدهید عکس و متن آیتمها را در لیست نشان دهید. در این قسمت نیازی به پیادهسازی منو و گزینه جستجو نیست.
### معیارهای امتیازدهی این بخش
+ پیادهسازی `ViewHolder` مناسب (آیتمهای لیست) دارای تمام جزئیاتی که قصد نمایش آنها را داریم
+ لود شدن و نمایش مناسب عکسها که ممکن است دارای ابعاد مختلفی باشند در لیست
+ پرفورمنس مناسب لیست پیادهسازی شده به خصوص لگ نداشتن هنگام اسکرول کردن لیست
+ امتیازی: پیادهسازی `empty state` مناسب برای نمایش تا زمان لود شدن لیست
+ امتیازی: پیادهسازی ظاهری خوب هم امتیاز مثبت دارد.
### آنچه باید آپلود کنید
+ کل پروژه را به صورت *ZIP* آپلود کنید.
+ پوشههای مربوط به `build` را در فایل زیپ نگذارید.
+ اگر میخواهید پروژه را تغییر دهید، باید دوباره ارسال کنید و در نهایت ارسال نهایی خود را از بخش «[همه ارسالها](https://quera.org/contest/assignments/68135/submissions/all)» مشخص کنید.
در این قسمت میخواهیم قابلیت اشتراکگذاری و همچنین لایک را به برنامه اضافه کنیم.
قابلیت به اشتراکگذاری متن کامیک: برای پیاده سازی این قابلیت باید به آیتمهای لیست یک دکمه «به اشتراکگذاری» اضافه کنید و به وسیله آن امکان اشتراکگذاری متن کامیک را فراهم کنید. در خیلی از اپلیکیشنها امکان به اشتراک گذاری محتوا وجود دارد و آیکنی مشابه شکل زیر دارد:
![تصویر سوال](https://quera.org/qbox/view/GcDPbRCn02/pasted%20image%200%20%281%29.png)
قابلیت لایک: یک دکمه برای لایک کردن آیتم در قسمت ui برای هر آیتم اضافه کنید. برای پیادهسازی این قابلیت ممکن است نیاز به ایجاد تغییراتی در کلاس `ComicItem` داشته باشید. دقت کنید انتظار نداریم که لایکها پس از باز و بسته کردن اپ هنوز قابل مشاهده باشند.
### معیارهای امتیازدهی این بخش
+ پیادهسازی قابلیت اشتراکگذاری متن طوری که با زدن اشتراکگذاری بشود متن را در اپلیکیشنهای دیگر مثل پیامرسانها فرستاد.
+ پیادهسازی قابلیت لایک به طوری که هر آیتم نشان بدهد که توسط کاربر لایک شده است یا نه.
+ امتیازی: امکان اشتراکگذاری عکس کامیک را هم فراهم کنید.
+ امتیازی: امکان لایک کردن آیتمها با دوبار کلیک روی هر آیتم را فراهم کنید.
### آنچه باید آپلود کنید
+ کل پروژه را به صورت *ZIP* آپلود کنید.
+ پوشههای مربوط به `build` را در فایل زیپ نگذارید.
+ اگر میخواهید پروژه را تغییر دهید، باید دوباره ارسال کنید و در نهایت ارسال نهایی خود را از بخش «[همه ارسالها](https://quera.org/contest/assignments/68135/submissions/all)» مشخص کنید.
در این بخش انتظار داریم که قابلیت جستجو و فیلتر آیتمها بر اساس متن را به اپلیکیشن اضافه کنید. اینکه ظاهر جستوجو و مکان قرارگیری آن به چه شکل باشد بر عهده شماست. با وارد کردن متن و کلیک روی گزینه یا آیکن جستجو باید آیتمهایی که در صفحه هستند بر اساس اینکه آیا بخشی یا کل `title` یا `transcript` آنها با کوئری وارد شده یکسان است یا نه فیلتر شوند. آیتمهای باقی مانده پس از جستجو باید بر اساس تاریخ مرتب سازی شوند.
### معیارهای امتیازدهی این بخش
+ با وارد کردن متن و زدن روی دکمه جستجو آیتمهای روی صفحه فیلتر شوند.
+ آیتمهای باقی مانده پس از جستجو بر اساس تاریخ مرتب سازی شوند.
### آنچه باید آپلود کنید
+ کل پروژه را به صورت *ZIP* آپلود کنید.
+ پوشههای مربوط به `build` را در فایل زیپ نگذارید.
+ اگر میخواهید پروژه را تغییر دهید، باید دوباره ارسال کنید و در نهایت ارسال نهایی خود را از بخش «[همه ارسالها](https://quera.org/contest/assignments/68135/submissions/all)» مشخص کنید.