در این سوال از شما میخواهیم فایل پایه را به گونهای تکمیل کنید که با وارد کردن آدرس یک فایل در ``EditText`` موجود در صفحه، پس از لمس دکمه ``Download`` فایل در آدرس مشخصی دانلود شود. پروژه پایه را از [ اینجا](https://blog.quera.ir/wp-content/uploads/2018/10/Downloader-contestant.zip) دانلود کنید.
نمای کلی پروژه پایه:
![](https://blog.quera.ir/wp-content/uploads/2018/10/img.png)
فایلهای دانلودی باید در فولدر ``DCIM`` موجود در حافظه خارجی دستگاه ذخیره شود.
## نکات حیاتی:
+ استفاده از کتابخانههای دانلود فایل امکان پذیر نیست و درصورت افزودن کتابخانه جدید به پروژه پایه و استفاده از آن، نمرهای به شما تعلق نمیگیرد.
+ دقت کنید که فایلها حتما در مکان گفتهشده دانلود شوند.
+ برای ذخیره فایل دانلودی از **نام** و **پسوند** فایل موجود در سرور استفاده کنید.
+ قبل از شروع دانلود، مقدار متغیر ``isDownloadCompleted`` موجود در فایل ``JudgeUtil`` را برابر با ``false`` قرار دهید و پس از اتمام دانلود، مقدار آن را ``true`` کنید.
+ برای جلوگیری از بروز خطای حجم فایل ارسالی، قبل از ساخت و ارسال فایل `zip` دقت کنید که پوشههای `build` در این فایل **وجود نداشته باشند**.
ساختار بخشی از فایل پایه بصورت زیر است. میتوانید فایلهایی به پوشه ``java`` (یا زیر پوشههای آن) اضافه کنید. همچنین مجازید به فایلهایی که با علامت (---->) مشخص شدهاند کدهای خودتان را اضافه کنید (اما مجاز به تغییر یا حذف کدهای موجود نیستید). درنهایت محتویات پوشه ``app`` را در قالب یک فایل فشرده ارسال کنید.
```
app
│
└───src
├───main
│ │ AndroidManifest.xml <------
│ │
│ ├───java
│ │ └───ir
│ │ └───quera
│ │ └───android
│ │ └───downloader
│ │ JudgeUtil.java
│ │ MainActivity.java <------
│ │
│ └───res
│ ├───drawable
│ ├───drawable-v24
│ ├───layout
│ ├───mipmap-anydpi-v26
│ ├───mipmap-hdpi
│ ├───mipmap-mdpi
│ ├───mipmap-xhdpi
│ ├───mipmap-xxhdpi
│ ├───mipmap-xxxhdpi
│ └───values
│ colors.xml
│ strings.xml
│ styles.xml
│
└───test
```
زهرا که معلم زبان است با دیدن اینکه شاگردانش یک سری از کلمات را فراموش میکنند تصمیم گرفت برنامهای طراحی کند تا بتواند به آنها در یادگیری کلمات کمک کند؛ هذف او از طراحی این برنامه این است که شاگردانش کلماتی را که همیشه فراموش میکنند، در آن ذخیره کنند تا به هنگام نیاز به معنی آن دسترسی داشته باشند، اما بدلیل نداشتن دانش برنامه نویسی اندروید از شما کمک میخواهد.
[فایل پایه را از اینجا دانلود کنید](https://blog.quera.ir/wp-content/uploads/2018/10/Dictionary-contestant-1.zip)
![](https://blog.quera.ir/wp-content/uploads/2018/10/screenShot.jpg)
![](https://blog.quera.ir/wp-content/uploads/2018/10/ezgif-4-e89dcf945.gif)
**تعریف پروژه:** شمای کلی برنامه مانند شکل بالا است و عملکرد آن مانند یک فرهنگ لغت فارسی-انگلیسی است، با این تفاوت که لیست لغات توسط کاربر ویرایش میشود. در صفحه ابتدایی برنامه، لغت انگلیسی را در ``EditText`` با متن راهنمای ``word`` و ترجمه آن را در ``EditText`` با متن راهنمای ``defunition`` بنویسید.کلات و معنای آنها باید در یک دیتابیس ``sqLite`` ذخیره شوند.
+ با لمس دکمه ``ADD``، **فقط درصورتی که کلمه در دیتابیس موجود نباشد** به آن اضافه میشود. (هردو فیلد مربوط به لغت و ترجمه باید پر شوند)
+ با لمس دکمه ``Delete``، **فقط درصورتی که کلمه در دیتابیس موجود باشد** از آن حذف میشود. (پر کردن فیلد ``word`` کافی است)
+ با لمس دکمه ``Update`` درصورت وجود کلمه، معنای آن با معنای جدید جایگزین میشود. (هردو فیلد مربوط به لغت و ترجمه باید پر شوند)
+ با لمس دکمه ``View All`` وارد ``Activity`` به نام ``DictionaryPage`` میشویم (شکل سمت چپ) که در آن هر لغت به همراه معنای متناظر با آن به ترتیب جدید به قدیم در لیست نمایش داده میشود.
+ با لمس دکمه ``search`` معنای لغت نوشته شده در ``EditText`` با متن راهنمای ``search_word`` جستجو میشود و درصورت وجود لغت، معنای آن در ``TextView`` پایین صفحه نمایش داده میشود و درصورت عدم وجود لغت در دیتابیس، عبارت ``word doesn't exist`` در آن نمایش داده میشود.
+ با لمس دکمه ``Quiz`` درصورتی که تعداد لغات موجود در دیتابی کمتر از چهار (۴) لغت باشد، هیچ اتفاقی نمیافتد و در صورتی که چهار کلمه یا بیشتر در دیتابیس موجود باشد، برنامه وارد صفحه وارد ``QuizActivity`` میشود. در این صفحه (همانطور که در ``gif`` موجود در صورت سوال میبینید) یک سوال چهارگزینهای از میان لغات موجود در دیتابیس طرح میشود. به این صورت که بطور تصادفی یک کلمه انتخاب میشود و در ``TextView`` با آیدی ``quiz_question`` موجود در بالای صفحه نمایش دادهمیشود و معنای آن کلمه به همراه معنای سه کلمه دیگر (که این معناها هم بصورت تصادفی انتخاب شدهاند) با یک ترتیب تصادفی بر روی چهار ``Button`` موجود در میانه صفحه نمایش داده میشوند. کاربر برای پاسخگویی به هر سوال تنها هشت (۸) ثانیه زمان دارد. درصورتی که در این زمان کاربر هیچ گزینهای را انتخاب نکند، سوال جدیدی ایجاد میشود و نمایش داده میشود. اگر قبل از اتمام زمان پاسخگویی به سوال، کاربر گزینه درست را انتخاب کند، در (۱۰) امتیاز به امتیاز فعلی او اضافه میشود (این امتیاز در پایین صفحه در ``TextView`` با آیدی ``current_score`` نمایش داده میشود). درصورت انتخاب گزینه غلط نیز بدون تغییر در امتیاز، سوال جدیدی نمایش داده میشود.
نکات مهم در پیادهسازی دیتابیس:
+ اطلاعات در دیتابیس با نام ``wordlist.db`` و در جدول ``list`` ذخیره میشوند.
+ دیتابیس را در محل پیشفرض دخیرهسازی دیتابیسها (زیر مجموعه مسیر``/data/data``) ذخیره کنید.
+ برای کار با دیتابیس دسترسی به حافظه را استفاده نکنید.
+ شمای جدول را **دقیقا** به شکل زیر پیادهسازی کنید.
```
ColumnId ---> primary key auto Increment
Definition ---> TEXT
word ---> TEXT
```
# نکات حیاتی:
+ مکان قرارگیری و نام انتخابی برای دیتابیس و جدول مورد استفاده را **دقیقا** برابر با موارد گفتهشده و **بدون هیچ پسوندی** انتخاب کنید.
+ درصورتیکه حجم فایل `zip` ارسالی شما، بیشتر از حد مجاز بود، پوشه(های) `build` را در فایل ارسالی پاک کنید.
+ امکان استفاده از کتابخانههای آماده وجود ندارد و پیادهسازیها باید توسط خودتان انجام شود.
+ آیدی و متنهای نمایشی موجود در فایلهای `activity_main.xml` ، `dictionary_page.xml` و `list_item.xml` را تغییر ندهید (حذف نکنید).
+ درصورتیکه به دسترسیای نیاز دارید که در نسخههای جدید اندروید به شکل متفاوتی از کاربر گرفتهمیشود، **حتما** این تفاوت را درنظر بگیرید و تغییرات لازم را برای **زمان شروع برنامه** اعمال کنید.
+ دیتابیس را **حتما** در مسیر پیشفرض قراردهید. (نیازی به دسترسی خواندن و نوشتن برروی حافظه خارجی ندارید)
+ پیادهسازی سوالات بخش ``Quiz`` باید به گونهای باشد که دو سوال یکسان پشتسر هم نمایشداده نشوند. (منظور از دو سوال یکسان دو سوال با کلمه انگلیسی یکسان و گزینههای یکسان و ترتیب یکسان در گزینهها است)
+ حتما از فایل ```WordListViewHolder.java``` و متغیرهای عضو این کلاس متناسب با نام آنها استفاده کنید. اعمال هرگونه تغییر در این فایل و فایلهای دیگر پروژه که دارای پسوند ```java``` هستند بلامانع است اما از **تغییر نام** یا **حذف** کلاسها، توابع و متغیرهای موجود در فایل پایه خودداری کنید.
ساختار بخشی از فایل پایه بصورت زیر است. میتوانید فایلهایی به پوشه `java` (یا زیر پوشههای آن) اضافه کنید. همچنین مجازید به فایلهایی که با علامت (---->) مشخص شدهاند کدهای خودتان را اضافه کنید (اما مجاز به تغییر یا حذف کدهای موجود نیستید). درنهایت محتویات پوشه `app` را در قالب یک فایل فشرده ارسال کنید.
```
app
│
└───src
└───main
│ AndroidManifest.xml
│
├───java
│ └───com
│ └───quera
│ └───android
│ └───dictionary
│ │ DictionaryPage.java (<----)
│ │ MainActivity.java (<----)
│ │
│ ├───adapters
│ │ WordListAdapter.java (<----)
│ │
│ └───ViewHolders
│ WordListViewHolder.java (<----)
│
└───res
├───drawable
├───layout
│ activity_main.xml
│ dictionary_page.xml
│ list_item.xml
│
├───mipmap-hdpi
│
├───mipmap-mdpi
│
├───mipmap-xhdpi
│
├───mipmap-xxhdpi
│
├───mipmap-xxxhdpi
│
└───values
colors.xml
dimens.xml
strings.xml
styles.xml
```
یادگیری زبان آسان میشود :)
علی و محمد دو دوست هستند که در یک ساختمان زندگی میکنند. آنها میخواهند آخر شب ها با هم چت کنند و تصمیم گرفتهاند راهی پیدا کنند که بتوانند به طور مستقیم به هم متصل شوند و پیام ارسال کنند.
برای این کار، آنها به کمک شما نیاز دارند تا در نوشتن برنامه پیامرسان محلی کمکشان کنید.
فایل پروژه اولیه را از [اینجا](https://blog.quera.ir/wp-content/uploads/2018/10/LocalMessanger-contestant.zip) دریافت کنید.
## کارکرد برنامه:
ابتدا دو کاربر باید به یک ``wifi`` متصل شوند، سپس یکی از آن دو باید در صفحه اصلی گزینه ``connect to me`` و دیگری گزینه ``connect to others`` را انتخاب کند.
با انتخاب گزینه ``connect to me`` دستگاه اندرویدی مانند یک سرور برای چت عمل میکند و کاربر به صفحه ``ServerActivity`` انتقال داده میشود. در این صفحه ``ip`` و ``port`` ای که برای اتصال کاربر دوم درنظر گرفته شده، به ترتیب در ``TextView`` با آیدی ``text_ip`` و ``text_port`` نمایش داده میشوند.
با انتخاب گزینه ``connect to others`` کاربر به صفحه ``ClientActivity`` منتقل میشود. در این صفحه ``ip`` و ``port`` نمایش داده شده توسط دستگاه اول، به ترتیب در ``EditText`` با آیدی ``edit_text_ip`` و ``edit_text_port`` وارد میشوند.
پس از وارد کردن این اطلاعات، با لمس دکمه ``connect`` به محض برقراری ارتباط، هر دو دستگاه وارد صفحه ``MessageActivity`` میشوند که همان صفحه مخصوص چت است.
در صفحه چت با نوشتن متن مورد نظر درون ``EditText`` و لمس دکمه ``send`` در این صفحه، پیام برای کاربر دیگر ارسال میشود.
در صفحه چت، یک ``TextView`` با آیدی ``text_message`` نیز وجود دارد. این ``TextView`` همواره **آخرین** پیامی که کاربر **از دستگاه دیگر** دریافت کرده را نمایش میدهد و تا قبل از دریافت اولین پیام نیز هیچ متنی را نمایش نمیدهد.
نمونه پیام نمایش دادهشده در تلفن همراه:
```
a test message
```
نمونه فرمت پیام ارسالی در شبکه:
```
{"message":"a test message"}
```
## نکات حیاتی:
+ دقت کنید مقادیر نمایش دادهشده در ``ServerActivity`` فاقد هرگونه کاراکتر اضافه باشند زیرا عینا همین مقادیر در ``ClientActivity`` وارد میشوند.
+ هر دو کاربر باید امکان دریافت و ارسال پیام را داشته باشند
+ درصورتیکه به دسترسیای نیاز دارید که در نسخههای جدید اندروید به شکل متفاوتی از کاربر گرفتهمیشود، **حتما** این تفاوت را درنظر بگیرید و تغییرات لازم را برای **زمان شروع برنامه** اعمال کنید.
+ شما مجاز به استفاده از کتابخانههای آماده نیستید و پیادهسازیها باید توسط خودتان انجام شود.
+ برای جلوگیری از بروز خطای حجم فایل ارسالی، قبل از ساخت و ارسال فایل `zip` دقت کنید که پوشههای `build` در این فایل **وجود نداشته باشند**.
ساختار بخشی از فایل پایه بصورت زیر است. میتوانید فایلهایی به پوشه `java` (یا زیر پوشههای آن) اضافه کنید. همچنین مجازید به فایلهایی که با علامت (---->) مشخص شدهاند کدهای خودتان را اضافه کنید (اما مجاز به تغییر یا حذف کدهای موجود نیستید). درنهایت محتویات پوشه `app` را در قالب یک فایل فشرده ارسال کنید.
```
app
│
└───src
└───main
│ AndroidManifest.xml <------
│
├───java
│ └───com
│ └───quera
│ └───messanger
│ └───localmessanger
│ ClientActivity.java <------
│ MainActivity.java <------
│ MessageActivity.java <------
│ ServerActivity.java <------
│
└───res
├───drawable
│
├───drawable-v24
│
├───layout
│ activity_client.xml
│ activity_main.xml
│ activity_message.xml
│ activity_server.xml
│
├───mipmap-anydpi-v26
│
├───mipmap-hdpi
│
├───mipmap-mdpi
│
├───mipmap-xhdpi
│
├───mipmap-xxhdpi
│
├───mipmap-xxxhdpi
│
└───values
colors.xml
strings.xml
styles.xml
```
در این سوال از شما میخواهیم صف آهنگهای درحال پخش یک موزیک پلیر را پیادهسازی کنید. فایل پایه را از [اینجا](https://blog.quera.ir/wp-content/uploads/2018/10/playlist-contestant.zip) دانلود کنید.
شمای کلی پروژه نهایی بصورت زیر است:
![ ](https://blog.quera.ir/wp-content/uploads/2018/09/2018-09-28_19-19-03.gif)
# **تعریف پروژه**:
شمای کلی پروژه نهایی مانند تصاویر بالا است و لیست کارهای شما برای تکمیل این پروژه به شرح زیر است:
+ نمایش لیست آهنگهای در صف پخش
+ امکان ایجاد تغییر در ترتیب آهنگها
+ امکان حذف آهنگ از لیست پخش
# **جزئیات پیادهسازی وظایف**
**نمایش لیست آهنگهای در صف پخش:** برای سادهتر شدن این بخش، کافیست اطلاعات آهنگهای موجود در لیست پخش را از طریق فراخوانی تابع ``getMusicList`` دریافت کنید. این تابع، عضو ``static`` کلاس ``JudgeUtil`` است.
**امکان ایجاد تغییر در ترتیب آهنگها:** با لمس آیکون سمت راست هر عضو لیست که بصورت دو خط افقی نمایش دادهمیشود امکان تغییر مکان آن عنصر در لیست از طریق کشیدن آن به محل دلخواه (``drag`` کردن) وجود دارد. دقت کنید برای این کار نیازی به لمس طولانی آیکون نیست و بهمحض لمس آیکون، امکان تغییر مکان آن وجود دارد. همچنین دقت کنید این امکان فقط برای آیکون گفتهشده فعال باشد تا امکان ``scroll`` کردن لیست آهنگها ازبین نرود.
**امکان حذف آهنگ از لیست پخش:** با کشیدن هریک از آیتمهای لیست به طرف راست یا چپ، آن آیتم باید از لیست حذف شود.
# نکات حیاتی:
+ برای جلوگیری از بروز خطای حجم فایل ارسالی، قبل از ساخت و ارسال فایل `zip` دقت کنید که پوشههای `build` در این فایل **وجود نداشته باشند**.
+ به هیچوجه کدهای **موجود** در هیچیک از فایلهای پروژه را پاک نکنید و یا تغییر ندهید.
+ در هیچ قسمتی از پروژه مجاز به استفاده از کتابخانههای آماده نیستید و پیادهسازیهای خواسته شده را باید شخصا انجام دهید.
+ از اعمال تغییر در فایل ``JudgeUtil`` خودداری کنید.
ساختار بخشی از فایل پایه بصورت زیر است. میتوانید فایلهایی به پوشه `java` (یا زیر پوشههای آن) اضافه کنید. همچنین مجازید به فایلهایی که با علامت (---->) مشخص شدهاند کدهای خودتان را اضافه کنید (اما مجاز به تغییر یا حذف کدهای موجود نیستید). درنهایت محتویات پوشه `app` را در قالب یک فایل فشرده ارسال کنید.
```
app
│
└───src
└───main
│ AndroidManifest.xml
│
├───java
│ └───com
│ └───quera
│ └───android
│ └───playlist
│ ItemModel.java (<-----)
│ JudgeUtil.java (<-----)
│ MainActivity.java (<-----)
│
└───res
├───drawable
│
├───drawable-hdpi
│
├───drawable-mdpi
│
├───drawable-v24
│
├───drawable-xhdpi
│
├───drawable-xxhdpi
│
├───layout
│ activity_main.xml
│ music_item.xml
│
├───mipmap-hdpi
├───mipmap-mdpi
├───mipmap-xhdpi
├───mipmap-xxhdpi
├───mipmap-xxxhdpi
└───values
colors.xml
strings.xml
styles.xml
```