[لینک دانلود پروژه اولیه](https://www.dropbox.com/s/h29c6vve5v0yt6i/OnlineQuessWord-contestant.zip?dl=0)
### خلاصه وظایف
+ ارتباط با سرور و فرستادن رکوئست به آن ۸٪ امتیاز سوال
+ ```encode``` کردن صحیح دادههای ارسالی به سرور ۸٪ امتیاز سوال
+ گرفتن پاسخ صحیح از سرور و نمایش آن در جای مناسب ۸٪ امتیاز سوال
+ امکان پردازش چند درخواست بطور همزمان ۱۶٪ امتیاز سوال
+ پایداری ارتباط با سرور درصورت تغییر وضعیت دستگاه (مانند چرخش) ۴۴٪ امتیاز سوال
+ پایداری محتوای مورد نمایش در رابط کاربری درصورت تغییر وضعیت دستگاه (مانند چرخش) ۱۶٪ امتیاز سوال
در این سوال شما باید یک بازی شبیه به بازی بیست سوالی (بدون محدودیت سوال) را پیادهسازی کنید. به این صورت که شما سوالات خود را تایپ و ثبت میکنید، سپس سوال خود را به آدرس سرور ارسال میکنید و پس از پردازش سوال، پاسخی متناسب از طرف سرور به شما برمیگردد (پاسخ سرور صرفا شامل یک رشته بعنوان پاسخ سوال ارسالی است و هیچ ساختار خاصی ندارد). شما باید سوالات و پاسخ ها را در قسمت بالایی صفحه، بصورت گزارشی از تاریخچه عملکرد نمایش دهید؛ به این صورت که هر سوال بلافاصله پس از لمس دکمه ```submit``` به لیست افزوده میشود، آخرین پاسخ ارسالی در ```last_answer_tv``` نمایش داده میشود و با رسیدن پاسخ جدید از سمت سرور، متن موجود در ```last_answer_tv```، به ```history_tv``` منتقل میشود و پاسخ جدید در ```last_answer_tv``` نمایش داده میشود.
# موارد مورد انتظار جهت پیادهسازی
۱- سوال کاربر باید در **EditText** با آیدی **question_et** تایپ شود و با لمس دکمه **Submit** برای پردازش، به سرور ارسال شود تا پاسخ سرور را در قالب یک رشته دریافت کند. دقت کنید **متن سوال نمیتواند خالی باشد**.
نمونه درخواست ارسالی به سرور برای پرسیدن سوال **?what is length of the word**
```
<YOUR_URL>?q=what+is+length+of+the+word%3F
```
نمونه پاسخ ارسالی سرور:
```
it contains 10 characters
```
۲- آخرین پاسخ دریافت شده از سرور باید در **TextView** با آیدی **last_answer_tv** نمایش داده شود.
۳- لیست تاریخچه سوالات کاربر و پاسخ های سرور (بجز آخرین پاسخ سرور) باید در **TextView** با آیدی **history_tv** نمایش داده شود.
۴- برنامه شما باید با تغییر جهت دستگاه، وضعیت فعلی خود (شامل اطلاعات نمایش داده شده به کاربر و اطلاعات موردنیاز جهت ادامه فعالیت بصورت صحیح) را حفظ کند.
۵- درصورتی که در هنگام ارتباط با سرور و انتظار برای پاسخ سرور، جهت دستگاه تغییر کرد (دستگاه **rotate** شد)، نباید خللی در ارتباط با سرور و دریافت پاسخ بوجود آید.
۶- درصورتی که کاربر سوالی را با استفاده از کلید *Submit* ثبت کند و پیش از پاسخگویی سرور، سوال (یا سوالات) دیگری را ثبت کند، ارسال سوالات به سرور باید در لحظه ثبت انجام شود (نباید ارسال سوال جدید و انتظار برای گرفتن پاسخ، تا زمان پاسخگویی سرور به سوال قبلی، به تعویق بیافتد).
# موارد مورد توجه هنگام پیادهسازی:
+ درخواست ها به سرور توسط متد **GET** ارسال میشوند.
+ آدرس پایهای سرور را حتما در متغیر **url** که عضو ثابت کلاس **BaseURL** میباشد،قرار دهید و زمانی که به آن نیاز داشتید، از **BaseURL.url** استفاده کنید. (از بکار گیری آدرس پایه بطور مستقیم در کد، جدا خودداری کنید).
+ به هیچ وجه آیدی (**id**) های موجود در فایل *activity_main.xml* را تغییر ندهید.
## [ فرمت فایل ارسالی ]
# توجه کنید که
+برای بررسی کدهای خود میتوانید از سرور محلی یا کتابخانههای موجود برای اندروید جهت شبیهسازی سرور استفاده کنید.
+ برای ارسال پاسخ، دقت کنید **پوشه `app`** موجود در ریشه فایلهای پروژه، باید **در ریشه فایل زیپ ارسالی** قراربگیرد.
+ نوع، نام و محتویات اولیه کلاسهای موجود در فایل پایه را به هیچ وجه تغییر ندهید/حذف نکنید. (اضافه کردن بلامانع است.)
+ پروژه ارسالی شما میتواند فایل های اضافه بر فایلهای موجود در پروژه پایه داشته باشد؛ این فایل ها باید بطور مستقیم یا غیرمستقیم در پوشه ```main``` قرارگرفته باشند.
+ امکان تغییر در فایل ```manifest``` وجود دارد.
+ درصورت استفاده از کتابخانههای ثالث جهت ارتباط با سرور، کد شما توسط سیستم داوری مردود اعلام میشود.
ساختار فایل ارسالی(فایلهایی که باید تغییر دهید با ----> نمایش داده شده اند، همچنین امکان افزودن فایل به ساختار ارسالی زیر وجود دارد اما از اعمال تغییر در محتویات پوشه ```layout``` جداً خودداری کنید):
```
<your-zip-name>.zip
└───app
├───libs
└───src
└───main
│ AndroidManifest.xml
│
├───java
│ └───quera
│ └───androidchallenge
│ └───com
│ └───onlineguessword
│ │ MainActivity.java <------
│ │
│ └───models
│ BaseURL.java
│
└───res
├───drawable
│
├───drawable-v24
│
├───layout
│ activity_main.xml
│
├───mipmap-anydpi-v26
│
├───mipmap-hdpi
│
├───mipmap-mdpi
│
├───mipmap-xhdpi
│
├───mipmap-xxhdpi
│
├───mipmap-xxxhdpi
│
└───values
colors.xml
strings.xml
styles.xml
```