diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..fd45b12
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,11 @@
+*.iml
+.gradle
+/local.properties
+/.idea/caches/build_file_checksums.ser
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+.DS_Store
+/build
+/captures
+.externalNativeBuild
diff --git a/.gitignore.txt b/.gitignore.txt
new file mode 100644
index 0000000..d509498
--- /dev/null
+++ b/.gitignore.txt
@@ -0,0 +1,11 @@
+*.iml
+.gradle
+/local.properties
+/.idea/caches/build_file_checksums.ser
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+.DS_Store
+/build
+/captures
+.externalNativeBuild
\ No newline at end of file
diff --git a/.idea/caches/gradle_models.ser b/.idea/caches/gradle_models.ser
new file mode 100644
index 0000000..6bf2452
Binary files /dev/null and b/.idea/caches/gradle_models.ser differ
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
new file mode 100644
index 0000000..30aa626
--- /dev/null
+++ b/.idea/codeStyles/Project.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
new file mode 100644
index 0000000..7ac24c7
--- /dev/null
+++ b/.idea/gradle.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..51fa3e5
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml
new file mode 100644
index 0000000..7f68460
--- /dev/null
+++ b/.idea/runConfigurations.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..796b96d
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..6d8e4f2
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,76 @@
+apply plugin: 'com.android.application'
+
+android {
+ compileSdkVersion 28
+ defaultConfig {
+ applicationId "kr.ac.smu.cs.shalendar_java"
+// minSdkVersion 15
+ minSdkVersion 16
+ targetSdkVersion 28
+ versionCode 1
+ versionName "1.0"
+ testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+}
+
+configurations.all {
+ resolutionStrategy.eachDependency { details ->
+ def requested = details.requested
+ if (requested.group == "com.android.support") {
+ if (!requested.name.startsWith("multidex")) {
+ details.useVersion "26.+"
+ }
+// } else if (requested.group == "com.google.android.gms") {
+// details.useVersion '11.8.0'
+// } else if (requested.group == "com.google.firebase") {
+// details.useVersion '11.8.0'
+ }
+ }
+}
+
+dependencies {
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+ implementation 'com.android.support:appcompat-v7:28.0.0'
+ implementation 'com.android.support:recyclerview-v7:28.0.0'
+ implementation 'com.android.support.constraint:constraint-layout:1.1.3'
+// implementation 'com.android.support:support-v4:28+'
+ implementation 'com.android.support:design:28.0.0'
+ testImplementation 'junit:junit:4.12'
+
+ androidTestImplementation 'com.android.support.test:runner:1.0.2'
+ androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
+ implementation 'com.android.support:mediarouter-v7:28.0.0'
+
+ //add ExpandableTextView Library
+ implementation 'com.ms-square:expandableTextView:0.1.4'
+
+ //materialCalendarView
+ implementation 'com.prolificinteractive:material-calendarview:1.4.3'
+
+ //JSON
+ //implementation files('libs/json-simple-1.1.1.jar')
+
+ //Ion Library
+ implementation 'com.koushikdutta.ion:ion:2.+'
+
+ //Firbase 추가
+// implementation 'com.google.firebase:firebase-core:17.0.0'
+
+ //Firebase FCM추가
+// implementation 'com.google.firebase:firebase-messaging:19.0.1'
+ implementation 'com.google.firebase:firebase-messaging:17.3.4'
+
+ // 원 이미지 추가
+ implementation 'de.hdodenhof:circleimageview:2.2.0'
+
+}
+
+// Add to the bottom of the file
+apply plugin: 'com.google.gms.google-services'
diff --git a/app/google-services.json b/app/google-services.json
new file mode 100644
index 0000000..f44dd84
--- /dev/null
+++ b/app/google-services.json
@@ -0,0 +1,40 @@
+{
+ "project_info": {
+ "project_number": "571052306999",
+ "firebase_url": "https://shalendar-7ff5c.firebaseio.com",
+ "project_id": "shalendar-7ff5c",
+ "storage_bucket": "shalendar-7ff5c.appspot.com"
+ },
+ "client": [
+ {
+ "client_info": {
+ "mobilesdk_app_id": "1:571052306999:android:34967914e68aa1d2",
+ "android_client_info": {
+ "package_name": "kr.ac.smu.cs.shalendar_java"
+ }
+ },
+ "oauth_client": [
+ {
+ "client_id": "571052306999-vl8vlrk63bqeimutg6tgm3u6n103flo4.apps.googleusercontent.com",
+ "client_type": 3
+ }
+ ],
+ "api_key": [
+ {
+ "current_key": "AIzaSyDZTen7bzjIV2SVRxvJUYa9xJBI6h3Z0Dc"
+ }
+ ],
+ "services": {
+ "appinvite_service": {
+ "other_platform_oauth_client": [
+ {
+ "client_id": "571052306999-vl8vlrk63bqeimutg6tgm3u6n103flo4.apps.googleusercontent.com",
+ "client_type": 3
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "configuration_version": "1"
+}
\ No newline at end of file
diff --git a/app/libs/json-simple-1.1.1.jar b/app/libs/json-simple-1.1.1.jar
new file mode 100644
index 0000000..66347a6
Binary files /dev/null and b/app/libs/json-simple-1.1.1.jar differ
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..f1b4245
--- /dev/null
+++ b/app/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/app/src/androidTest/java/kr/ac/smu/cs/shalendar_java/ExampleInstrumentedTest.java b/app/src/androidTest/java/kr/ac/smu/cs/shalendar_java/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..31dbcdd
--- /dev/null
+++ b/app/src/androidTest/java/kr/ac/smu/cs/shalendar_java/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.content.Context;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getTargetContext();
+
+ assertEquals("kr.ac.smu.cs.shalendar_java", appContext.getPackageName());
+ }
+}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..dd029dd
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,121 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/BoardActivity.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/BoardActivity.java
new file mode 100644
index 0000000..cb2ed01
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/BoardActivity.java
@@ -0,0 +1,553 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.Manifest;
+import android.app.ProgressDialog;
+import android.content.ActivityNotFoundException;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Handler;
+import android.provider.MediaStore;
+import android.support.design.widget.NavigationView;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.content.ContextCompat;
+import android.support.v4.content.CursorLoader;
+import android.support.v4.view.GravityCompat;
+import android.support.v4.widget.DrawerLayout;
+import android.support.v4.widget.SwipeRefreshLayout;
+import android.support.v7.app.ActionBarDrawerToggle;
+import android.support.v7.app.AlertDialog;
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.Toolbar;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
+import android.widget.AdapterView;
+import android.widget.BaseAdapter;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.ListView;
+import android.widget.ScrollView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.koushikdutta.async.future.FutureCallback;
+import com.koushikdutta.ion.Ion;
+
+import org.json.JSONArray;
+import org.json.simple.JSONObject;
+import org.json.simple.parser.JSONParser;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.concurrent.Future;
+
+import static kr.ac.smu.cs.shalendar_java.CodeNumber.PICK_IMAGE_REQUEST;
+
+/*
+ 등록된 일정에 대하여
+ 게시판 형식으로 보여주는 Activity.
+ 일정 item을 누르면 PlanDetailActivity로 넘어간다.
+ */
+
+public class BoardActivity extends AppCompatActivity implements View.OnClickListener, SwipeRefreshLayout.OnRefreshListener {
+
+ private Button buttonToPlanDtail;
+ private ScrollView scrollView;
+ private BoarderAdapter b_adapter;
+ private Button buttonToHome;
+ private Button buttonToRegisterPlan;
+
+ //서버 통신 위한 url 객체 생성 여기서는 /signin
+ private NetWorkUrl url = new NetWorkUrl();
+
+ //서버로 부터 로그인 성공 시 오는 응답 Token 변수
+ private String userToken;
+
+ //서버로 부터 로그인 실패 시 오는 응답 변수
+ private String responseFromServer;
+
+ private String imageURL;
+
+ private ImageView imageView;
+
+ SwipeRefreshLayout mSwipeRefreshLayout;//새로고침
+
+ int sharePeopleNum;
+
+ //js
+ private Context mContext = BoardActivity.this;
+
+ private ViewGroup mainLayout; //사이드 나왔을때 클릭방지할 영역
+ private ViewGroup viewLayout; //전체 감싸는 영역
+ private ViewGroup sideLayout; //사이드바만 감싸는 영역
+
+ private Boolean isMenuShow = false;
+ private Boolean isExitFlag = false;
+
+
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_board);
+
+ mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.mainswipeRefresh);
+ mSwipeRefreshLayout.setOnRefreshListener(this);
+
+ buttonToHome = (Button) findViewById(R.id.button_home);
+ buttonToRegisterPlan = (Button) findViewById(R.id.main_ToRegister_button);
+
+ buttonToRegisterPlan.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) { Intent intent = new Intent(getApplicationContext(), RegisterPlanActivity.class);
+ startActivityForResult(intent, CodeNumber.TO_REGISTERPLAN_ACTIVITY);
+ }
+ });
+
+
+ buttonToHome.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) { Intent intent = new Intent(getApplicationContext(), MainActivity.class);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ startActivityForResult(intent, CodeNumber.TO_MAIN_ACTIVITY);
+ }
+ });
+
+
+ SharedPreferences pref = getSharedPreferences("pref_USERTOKEN", MODE_PRIVATE);
+ userToken = pref.getString("userToken", "NO_TOKEN");
+ //Log.i("Board화면::넘겨받은 토큰", userToken);
+
+ //JS
+ init();
+
+ //통신코드
+
+ addSideView(); //사이드바 add
+
+ RecyclerView boardRecyclerView = findViewById(R.id.BoarderRecyclerView);
+ //레이아웃 매니져가 null값을 받는다 이유는?
+ LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
+ boardRecyclerView.setLayoutManager(linearLayoutManager);
+
+ //통신코드 시작(initBoard)
+ checkPermissions();
+ //통신 준비
+ Ion.getDefault(getApplicationContext()).configure().setLogging("ion-sample", Log.DEBUG);
+ Ion.getDefault(getApplicationContext()).getConscryptMiddleware().enable(false);
+
+ onRefresh();
+
+
+ //Log.i("누가 먼저 실행되는 거임??333", "BoardActivity Ion 통신 끝");
+ }
+
+ //새로고침
+
+
+ @Override
+ public void onRefresh() {
+ mSwipeRefreshLayout.setRefreshing(true);
+ new Handler().postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ //b_adapter.notifyDataSetChanged();
+ final RecyclerView boardRecyclerView = findViewById(R.id.BoarderRecyclerView);
+ final JsonObject json = new JsonObject();
+
+ json.addProperty("cid", MainActivity.cid);
+ Log.i("게시판 넘어온 cid", Integer.toString(MainActivity.cid));
+
+
+ Future ion = Ion.with(getApplicationContext())
+ .load("POST", url.getServerUrl() + "/initBoard")
+ .setHeader("Content-Type", "application/json")
+ //.progressDialog(progressDialog)
+ .setJsonObjectBody(json)
+ .asJsonObject() //응답
+ .setCallback(new FutureCallback() {
+ @Override
+ public void onCompleted(Exception e, JsonObject result) {
+ //받을 변수
+ String datetime, planname, location, replynum;
+ String id, pw, userName, img_url, calName, calContent;
+ int cid, sid, numOfComments, userCount;
+ String title, sContent, startDate, endDate, area, planDate;
+
+
+ if (e != null) {
+ Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
+
+ } else {
+ //응답 형식이 { "data":{"id":"jacob456@hanmail.net", "cid":1, "sid":10, "title":"korea"}, "message":"success"}
+ //data: 다음에 나오는 것들도 JsonObject형식.
+ //따라서 data를 JsonObject로 받고, 다시 이 data를 이용하여(어찌보면 JsonObject안에 또다른 JsonObject가 있는 것이다.
+ //JSONArray가 아님. 얘는 [,]로 묶여 있어야 함.
+
+ String message = result.get("message").getAsString();
+ sharePeopleNum = result.get("sharePeopleNum").getAsInt();
+
+
+ Log.i("요기요1", Integer.toString(sharePeopleNum));
+
+ //서버로 부터 응답 메세지가 success이면...
+
+ if (message.equals("success")) {
+ //서버 응답 오면 로딩 창 해제
+ //progressDialog.dismiss();
+
+ //shareuserdata: {} 에서 {}안에 있는 것들도 JsonObject
+ JsonArray sharedUserData = result.get("shareUserData").getAsJsonArray();
+
+
+
+ //calendardata: {} 에서 {}안에 있는 것들도 JsonObject
+ JsonObject calendarData = result.get("calendarData").getAsJsonObject();
+ b_adapter = new BoarderAdapter(sharePeopleNum, sharedUserData, calendarData);
+ boardRecyclerView.setAdapter(b_adapter);
+
+
+ //scheduleData: {} 에서 {}안에 있는 것들도 JsonObject
+ JsonArray scheduleData = result.get("scheduleData").getAsJsonArray();
+ //문제없음
+
+ for (int i = 0; i < scheduleData.size(); i++) {
+ JsonObject jsonArr1 = scheduleData.get(i).getAsJsonObject();
+ cid = jsonArr1.get("cid").getAsInt();
+ sid = jsonArr1.get("sid").getAsInt();
+ title = jsonArr1.get("title").getAsString();
+ sContent = jsonArr1.get("sContent").getAsString();
+ startDate = jsonArr1.get("startDate").getAsString();
+ endDate = jsonArr1.get("endDate").getAsString();
+ area = jsonArr1.get("area").getAsString();
+ numOfComments = jsonArr1.get("numOfComments").getAsInt();
+ String numOfCommentsstring = Integer.toString(numOfComments);
+ //date 형식에 맞춰 잘라내기
+ startDate = startDate.substring(0,16);
+ endDate = endDate.substring(0,16);
+ //plan의 일자
+ planDate = startDate+" ~ "+endDate;
+
+ b_adapter.addItem(new BoardPlanItem(planDate, title, area, numOfCommentsstring, sid));
+
+
+ boardRecyclerView.setAdapter(b_adapter);
+ }
+
+ } else {
+ Toast.makeText(getApplicationContext(), "해당 일정이 없습니다.", Toast.LENGTH_LONG).show();
+ }
+ }
+ }
+ });
+ try {
+ ion.get();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ mSwipeRefreshLayout.setRefreshing(false);
+ }
+ },1000);
+ }
+
+ private void init() {
+
+ findViewById(R.id.btn_menu).setOnClickListener(this);
+
+ mainLayout = findViewById(R.id.id_main);
+ viewLayout = findViewById(R.id.fl_silde);
+ sideLayout = findViewById(R.id.view_sildebar);
+
+ }
+
+ private void addSideView() {
+
+ Sidebar sidebar = new Sidebar(mContext);
+ sideLayout.addView(sidebar);
+ //sidebar.setUserID(userName);
+
+ viewLayout.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+
+ }
+ });
+
+ sidebar.setEventListener(new Sidebar.EventListener() {
+
+ @Override
+ public void btnCancel() {
+ closeMenu();
+ }
+
+ @Override
+ public void btnLevel1() {
+ Intent intent2 = new Intent(getApplicationContext(), NoticeActivity.class);
+ startActivityForResult(intent2, CodeNumber.TO_NOTICE_ACTIVITY);
+ }
+
+ @Override
+ public void btnLevel2() {
+ Intent intent2 = new Intent(getApplicationContext(), SettingActivity.class);
+ startActivityForResult(intent2, CodeNumber.TO_SETTING_ACTIVITY);
+ }
+
+ @Override
+ public void btnLevel3() {
+ Intent intent2 = new Intent(getApplicationContext(), CreateCalendarActivity.class);
+ startActivityForResult(intent2, CodeNumber.TO_CREATE_CALENDAR_ACTIVITY);
+ }
+
+ @Override
+ public void btnInvited() {
+ Intent intent3 = new Intent(getApplicationContext(), WaitInvite.class);
+ startActivityForResult(intent3, CodeNumber.TO_CREATE_CALENDAR_ACTIVITY);
+ }
+
+ @Override
+ public void image_profile(){
+ getPictureFromGallery();
+ }
+
+ });
+ }
+
+ private void getPictureFromGallery() {
+ Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
+ intent.setType("image/jpg");
+ try {
+ startActivityForResult(intent, PICK_IMAGE_REQUEST);
+ } catch (ActivityNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private String getPathFromURI(Uri contentUri) {
+ String[] proj = { MediaStore.Images.Media.DATA };
+ Log.d("여기까지", "ㅇ5");
+ CursorLoader loader = new CursorLoader(getApplicationContext(), contentUri, proj, null, null, null);
+ Cursor cursor = loader.loadInBackground();
+ int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
+ cursor.moveToFirst();
+ Log.d("여기까지", "ㅇ6");
+
+ return cursor.getString(column_index);
+ }
+
+
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+
+ try {
+ switch (requestCode) {
+ //사진등록
+ case PICK_IMAGE_REQUEST:
+ if (resultCode == RESULT_OK) {
+ imageURL = getPathFromURI(data.getData());
+ Log.d("사진 경로", imageURL);
+ imageView = findViewById(R.id.image_profile);
+ //Request to Server.
+ setUserProfileImage_Server(imageURL);
+
+ SharedPreferences pref = getSharedPreferences("pref_USERTOKEN", MODE_PRIVATE);
+ SharedPreferences.Editor editor = pref.edit();
+ editor.putString("img_url", imageURL);
+ editor.commit();
+ }
+ }
+
+ }catch (Exception e) {
+ Toast.makeText(this, "오류가 있습니다.", Toast.LENGTH_LONG).show();
+ e.printStackTrace();
+ }
+ }
+
+ public void setUserProfileImage_Server(final String imageUrl) {
+
+ Log.i("프로필 변경", userToken);
+ File file = new File(imageUrl);
+
+ final ProgressDialog progressDialog = new ProgressDialog(BoardActivity.this);
+ progressDialog.setMessage("프로필 사진 등록 중 입니다~");
+ progressDialog.setProgressStyle(progressDialog.STYLE_SPINNER);
+ progressDialog.show();
+
+ Future ion = Ion.with(this)
+ .load("POST",url.getServerUrl() + "/imageChange")
+ //.setHeader("Content-Type", "application/json")
+ .setHeader("Authorization", userToken)
+ .progressDialog(progressDialog)
+ .setMultipartFile("file", file)
+ //응답
+ .asJsonObject()
+ .setCallback(new FutureCallback() {
+ @Override
+ public void onCompleted(Exception e, JsonObject result) {
+
+ if(e != null) {
+ Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
+ }
+
+ else {
+ String message = result.get("message").getAsString();
+
+ if(message.equals("image change success")) {
+ Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
+
+ Ion.with(imageView)
+ .centerCrop()
+ .resize(250, 250)
+ .load(imageUrl);
+ }
+ else {
+ Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
+ }
+ }
+ }
+ });
+ try {
+ ion.get();
+ progressDialog.dismiss();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ private void checkPermissions() {
+ if (ContextCompat.checkSelfPermission(this,
+ Manifest.permission.READ_EXTERNAL_STORAGE)
+ != PackageManager.PERMISSION_GRANTED||
+ ContextCompat.checkSelfPermission(this,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE)
+ != PackageManager.PERMISSION_GRANTED) {
+
+ ActivityCompat.requestPermissions(this,
+ new String[]{
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE
+ },
+ 1052);
+ }
+ }
+
+
+ public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
+ switch (requestCode) {
+ case 1052: {
+ // If request is cancelled, the result arrays are empty.
+ if (grantResults.length > 0
+ && grantResults[0] == PackageManager.PERMISSION_GRANTED
+ && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
+ // permission was granted.
+ } else {
+ // Permission denied - Show a message to inform the user that this app only works
+ // with these permissions granted
+ }
+ return;
+ }
+ }
+ }
+
+
+
+ public void closeMenu() {
+
+ isMenuShow = false;
+ Animation slide = AnimationUtils.loadAnimation(mContext, R.anim.siderbar_hidden);
+ sideLayout.startAnimation(slide);
+ new Handler().postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ viewLayout.setVisibility(View.GONE);
+ viewLayout.setEnabled(false);
+ mainLayout.setEnabled(true);
+ }
+ }, 450);
+ }
+
+
+ public void showMenu() {
+
+ isMenuShow = true;
+ Animation slide = AnimationUtils.loadAnimation(this, R.anim.sidebar_show);
+ sideLayout.startAnimation(slide);
+ viewLayout.setVisibility(View.VISIBLE);
+ viewLayout.setEnabled(true);
+ mainLayout.setEnabled(false);
+ }
+
+
+ @Override
+ public void onClick(View view) {
+ switch (view.getId()) {
+ case R.id.btn_menu:
+ showMenu();
+ break;
+ }
+ }
+
+
+ @Override
+ public boolean onKeyDown(int keyCode, KeyEvent event) {
+
+ if (keyCode == KeyEvent.KEYCODE_BACK) {
+ onBackPressed();
+ return true;
+ }
+ return super.onKeyDown(keyCode, event);
+ }
+
+
+ @Override
+ public void onBackPressed() {
+ if (isMenuShow) {
+ closeMenu();
+ } else {
+
+ if (isExitFlag) {
+ finish();
+ } else {
+
+ isExitFlag = true;
+ new Handler().postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ isExitFlag = false;
+ }
+ }, 2000);
+ }
+ }
+ }
+}
+
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/BoardHeaderAdapter.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/BoardHeaderAdapter.java
new file mode 100644
index 0000000..29e8ef2
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/BoardHeaderAdapter.java
@@ -0,0 +1,64 @@
+package kr.ac.smu.cs.shalendar_java;
+
+
+import android.graphics.drawable.ShapeDrawable;
+import android.graphics.drawable.shapes.OvalShape;
+import android.support.annotation.NonNull;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.koushikdutta.ion.Ion;
+
+import java.util.ArrayList;
+
+
+public class BoardHeaderAdapter extends RecyclerView.Adapter {
+
+ private ArrayList teammateList= new ArrayList<>();
+
+ @NonNull
+ @Override
+ public TeammateHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
+ View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.teammember_recyclerview_item, viewGroup, false);
+ return new TeammateHolder(view);
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull TeammateHolder holder, int position) {
+ holder.onBind(teammateList.get(position));
+ }
+
+ @Override
+ public int getItemCount() {
+ return teammateList.size();
+ }
+
+ void addItem(BoardTeamItem data) {
+ // 외부에서 item을 추가시킬 함수입니다.
+ teammateList.add(data);
+ }
+
+ class TeammateHolder extends RecyclerView.ViewHolder {
+
+ private ImageView teammate_pic;
+ private TextView teammate_name;
+
+ TeammateHolder(View itemView) {
+ super(itemView);
+
+ teammate_pic=itemView.findViewById(R.id.teammember_profile_image);
+ teammate_name=itemView.findViewById(R.id.teammember_profile_name);
+ }
+
+ void onBind(BoardTeamItem data) {
+ Global global = new Global();
+ global.setProfileImage(teammate_pic, data.getTeammate_pic());
+
+ teammate_name.setText(data.getTeammate_name());
+ }
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/BoardPlanItem.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/BoardPlanItem.java
new file mode 100644
index 0000000..0614928
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/BoardPlanItem.java
@@ -0,0 +1,58 @@
+package kr.ac.smu.cs.shalendar_java;
+
+public class BoardPlanItem {
+
+ String dateandtime;
+ String planname;
+ String location;
+ String replynum;
+ int sid;
+
+ public BoardPlanItem(String dateandtime, String planname, String location, String replynum, int sid) {
+ this.dateandtime = dateandtime;
+ this.planname = planname;
+ this.location = location;
+ this.replynum = replynum;
+ this.sid = sid;
+ }
+
+ public int getSid() {
+ return sid;
+ }
+
+ public void setSid(int sid) {
+ this.sid = sid;
+ }
+
+ public String getDateandtime() {
+ return dateandtime;
+ }
+
+ public void setDateandtime(String dateandtime) {
+ this.dateandtime = dateandtime;
+ }
+
+ public String getPlanname() {
+ return planname;
+ }
+
+ public void setPlanname(String planname) {
+ this.planname = planname;
+ }
+
+ public String getLocation() {
+ return location;
+ }
+
+ public void setLocation(String location) {
+ this.location = location;
+ }
+
+ public String getReplynum() {
+ return replynum;
+ }
+
+ public void setReplynum(String replynum) {
+ this.replynum = replynum;
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/BoardTeamItem.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/BoardTeamItem.java
new file mode 100644
index 0000000..24bd045
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/BoardTeamItem.java
@@ -0,0 +1,31 @@
+package kr.ac.smu.cs.shalendar_java;
+
+public class BoardTeamItem {
+
+ private String teammate_name;
+ private String teammate_pic;
+
+ public BoardTeamItem() {
+ }
+
+ public BoardTeamItem(String teammate_name, String teammate_pic) {
+ this.teammate_name = teammate_name;
+ this.teammate_pic = teammate_pic;
+ }
+
+ public String getTeammate_name() {
+ return teammate_name;
+ }
+
+ public void setTeammate_name(String teammate_name) {
+ this.teammate_name = teammate_name;
+ }
+
+ public String getTeammate_pic() {
+ return teammate_pic;
+ }
+
+ public void setTeammate_pic(String teammate_pic) {
+ this.teammate_pic = teammate_pic;
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/BoarderAdapter.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/BoarderAdapter.java
new file mode 100644
index 0000000..5cccd70
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/BoarderAdapter.java
@@ -0,0 +1,398 @@
+package kr.ac.smu.cs.shalendar_java;
+
+
+import android.app.Activity;
+import android.app.Dialog;
+import android.app.ProgressDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v4.widget.SwipeRefreshLayout;
+import android.support.v7.app.AlertDialog;
+import android.support.v7.view.menu.MenuView;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.koushikdutta.async.future.Future;
+import com.koushikdutta.async.future.FutureCallback;
+import com.koushikdutta.ion.Ion;
+
+import java.util.ArrayList;
+
+import static android.content.Context.MODE_PRIVATE;
+
+
+public class BoarderAdapter extends RecyclerView.Adapter {
+
+ private ArrayList boardList = new ArrayList<>();
+ private Context context;
+ private final int TYPE_HEADER = 0;
+ private final int TYPE_ITEM = 1;
+ private final int TYPE_FOOTER = 2;
+ private BoardHeaderAdapter h_adapter;
+ int sharedPeoplenum;
+ JsonArray shareUserData;
+ JsonObject calendarData;
+ String calName;
+ String calContent;
+ ImageView boardHeaderImage;
+ TextView boardHeadertitle;
+ TextView boardHeaderContent;
+
+
+ //BoardActivity boardActivity = new BoardActivity();
+
+ public BoarderAdapter(int sharedPeoplenum, JsonArray shareUserData, JsonObject calendarData) {
+ this.sharedPeoplenum = sharedPeoplenum;
+ this.shareUserData = shareUserData;
+ this.calendarData = calendarData;
+ }
+
+
+ @NonNull
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+
+ context = parent.getContext();
+ RecyclerView.ViewHolder holder;
+ View view;
+
+ if (viewType == TYPE_HEADER) {
+ view = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_boardheader, parent, false);
+ //추가
+ LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context, LinearLayout.HORIZONTAL, false);
+ RecyclerView h_recyclerView = view.findViewById(R.id.header_recycler);
+ h_recyclerView.setLayoutManager(linearLayoutManager);
+
+ //보더헤더 이름과 설명 설정하는 부분
+ boardHeaderImage = view.findViewById(R.id.boardHeaderImage);
+ boardHeadertitle = (TextView) view.findViewById(R.id.boardHeadertitle);
+ boardHeaderContent = (TextView) view.findViewById(R.id.boardHeaderContent);
+
+ Ion.with(boardHeaderImage)
+ .centerCrop()
+ .resize(350, 250)
+ .load(calendarData.get("img_url").getAsString());
+
+
+ calName = calendarData.get("calName").getAsString();
+ calContent = calendarData.get("calContent").getAsString();
+ Toast.makeText(context, calContent, Toast.LENGTH_SHORT).show();
+
+ boardHeadertitle.setText(calName);
+ boardHeaderContent.setText(calContent);
+
+ h_adapter = new BoardHeaderAdapter();
+ h_recyclerView.setAdapter(h_adapter);
+
+ Log.i("넘어온 명수", Integer.toString(sharedPeoplenum));
+
+ for (int i = 0; i < sharedPeoplenum; i++) {
+ JsonObject jsonArr = shareUserData.get(i).getAsJsonObject();
+ //id = jsonArr.get("id").getAsString();
+ String userName = jsonArr.get("userName").getAsString();
+ String userImgURL;
+
+ if (jsonArr.get("img_url").isJsonNull())
+ userImgURL = "DEFAULT :: profile_IMAGE";
+ else
+ userImgURL = jsonArr.get("img_url").getAsString();
+
+ h_adapter.addItem(new BoardTeamItem(userName, userImgURL));
+ }
+
+ Log.i("누가 먼저 실행되는 거임??11", Integer.toString(sharedPeoplenum));
+ h_adapter.notifyDataSetChanged();
+ holder = new HeaderViewHolder(view);
+
+
+ } else {
+ view = LayoutInflater.from(parent.getContext()).inflate(R.layout.boardplan_item, parent, false);
+ holder = new ItemViewHolder(view);
+ }
+ return holder;
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
+ if (holder instanceof HeaderViewHolder) {
+ HeaderViewHolder headerViewHolder = (HeaderViewHolder) holder;
+ } else {
+ ItemViewHolder itemViewHolder = (ItemViewHolder) holder;
+ itemViewHolder.onBind(boardList.get(position - 1), position);
+ }
+ }
+
+ @Override
+ public int getItemCount() {
+ return boardList.size() + 1;
+ }
+
+ void addItem(BoardPlanItem data) {
+ boardList.add(data);
+ }
+
+ class ItemViewHolder extends RecyclerView.ViewHolder {
+
+ //서버 통신
+ private NetWorkUrl url = new NetWorkUrl();
+
+ private TextView planname_text;
+ private TextView plandate_text;
+ private TextView planlocation_text;
+ private TextView planreply_text;
+ private BoardPlanItem data;
+ private int position;
+
+ public ItemViewHolder(@NonNull final View itemView) {
+ super(itemView);
+
+ plandate_text = itemView.findViewById(R.id.dateandtime);
+ planname_text = itemView.findViewById(R.id.planname);
+ planlocation_text = itemView.findViewById(R.id.location);
+ planreply_text = itemView.findViewById(R.id.replynum);
+
+
+ //통신 준비
+ Ion.getDefault(itemView.getContext()).configure().setLogging("ion-sample", Log.DEBUG);
+ Ion.getDefault(itemView.getContext()).getConscryptMiddleware().enable(false);
+
+ /*
+ 해당 item클릭시 서버에서 정보 받고
+ 이 정보들을 intent로 저장 시킨 후
+ PlanDetail로 남긴다.
+ */
+
+ itemView.setOnLongClickListener(new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View v) {
+ Global.setSid(boardList.get(getAdapterPosition() - 1).getSid());
+ //Toast.makeText(v.getContext(), boardList.get(getAdapterPosition() - 1).getPlanname() + "이거 수정한다잉", Toast.LENGTH_SHORT).show();
+
+ AlertDialog.Builder dialog = new AlertDialog.Builder(v.getContext());
+ dialog.setTitle("일정 수정/삭제");
+
+ dialog.setMessage("일정 수정, 삭제하십니까?")
+ .setPositiveButton("수정", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ Intent intent = new Intent(context, UpdatePlanActivity.class);
+ intent.putExtra("sid_update", Global.getSid());
+ context.startActivity(intent);
+ dialog.cancel();
+ }
+ })
+
+ .setNegativeButton("삭제", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+
+ //서버와 통신.
+ Ion.getDefault(itemView.getContext()).configure().setLogging("ion-sample", Log.DEBUG);
+ Ion.getDefault(itemView.getContext()).getConscryptMiddleware().enable(false);
+
+ JsonObject json = new JsonObject();
+
+ json.addProperty("sid", Global.getSid());
+ Log.d("ttt", "가져온 sid는 " + Global.getSid());
+ Ion.with(itemView.getContext())
+ .load("POST", url.getServerUrl() + "/deleteSche")
+ .setHeader("Content-Type", "application/json")
+ .setJsonObjectBody(json)
+ .asJsonObject()
+ .setCallback(new FutureCallback() {
+ @Override
+ public void onCompleted(Exception e, JsonObject result) {
+
+ if (e != null) {
+ Toast.makeText(itemView.getContext(), "Server Connection Error!", Toast.LENGTH_LONG).show();
+ } else {
+
+ String message = result.get("message").getAsString();
+ //서버로 부터 응답 메세지가 success이면...
+
+ if (message.equals("success")) {
+ //서버 응답 오면 로딩 창 해제
+ Toast.makeText(itemView.getContext(), "일정 삭제 성공", Toast.LENGTH_LONG).show();
+
+ } else {
+ Toast.makeText(itemView.getContext(), "일정 삭제 실패", Toast.LENGTH_LONG).show();
+ }
+
+ }
+ }
+ });
+
+ //boardActivity.onRefresh();
+
+ dialog.cancel();
+ }
+ });
+
+ AlertDialog alertDialog = dialog.create();
+ alertDialog.show();
+
+ return false;
+ }
+ });
+
+ itemView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ //Toast.makeText(v.getContext(), boardList.get(getAdapterPosition() - 1).getPlanname(), Toast.LENGTH_SHORT).show();
+
+
+ //sid오류
+ Global.setSid(boardList.get(getAdapterPosition() - 1).getSid());
+ Log.d("어댑터sid", "sid는" + Global.getSid());
+
+
+ JsonObject json = new JsonObject();
+
+ json.addProperty("sid", Global.getSid());
+
+ final ProgressDialog progressDialog = new ProgressDialog(itemView.getContext());
+ progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
+ progressDialog.setMessage("해당 댓글로 이동중~" + boardList.get(getAdapterPosition() - 1).getSid());
+ progressDialog.show();
+
+ Global global = new Global();
+ global.netWork_ShowSche(itemView.getContext(), progressDialog, json, url);
+ }
+ });
+
+ }
+
+
+ public void onBind(BoardPlanItem data, int position) {
+ this.data = data;
+ this.position = position;
+
+ plandate_text.setText(data.getDateandtime());
+ planname_text.setText(data.getPlanname());
+ planlocation_text.setText(data.getLocation());
+ planreply_text.setText(data.getReplynum());
+ }
+
+
+ public void getScheduleFromServer(int sid) {
+
+ JsonObject json = new JsonObject();
+
+ json.addProperty("sid", sid);
+
+ final ProgressDialog progressDialog = new ProgressDialog(itemView.getContext());
+ progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
+ progressDialog.setMessage("해당 댓글로 이동중~" + boardList.get(getAdapterPosition() - 1).getSid());
+ progressDialog.show();
+
+
+ Future ion = Ion.with(itemView.getContext())
+ .load("POST", url.getServerUrl() + "/showSche")
+ .setHeader("Content-Type", "application/json")
+ .setJsonObjectBody(json)
+ .asJsonObject() //응답
+ .setCallback(new FutureCallback() {
+ @Override
+ public void onCompleted(Exception e, JsonObject result) {
+ //응답 받을 변수
+ String userProfile, userName, schedTitle, aboutSched, schedLocation;
+ String startDate, startTime, endDate, endTime, startToEnd;
+
+ if (e != null) {
+ Toast.makeText(itemView.getContext(), "Server Connection Error!", Toast.LENGTH_LONG).show();
+ } else {
+
+ String message = result.get("message").getAsString();
+ //서버로 부터 응답 메세지가 success이면...
+
+ if (message.equals("success")) {
+ //서버 응답 오면 로딩 창 해제
+ progressDialog.dismiss();
+
+ //data: {} 에서 {}안에 있는 것들도 JsonObject
+ JsonObject data = result.get("data").getAsJsonObject();
+
+
+ userName = data.get("userName").getAsString();
+ schedTitle = data.get("title").getAsString();
+ aboutSched = data.get("sContent").getAsString();
+ schedLocation = data.get("area").getAsString();
+ startDate = data.get("startDate").getAsString();
+ //startTime = data.get("startTime").getAsString();
+ endDate = data.get("endDate").getAsString();
+ //endTime = data.get("endTime").getAsString();
+
+ //뒤에 0.000 잘라내기
+ startDate = startDate.substring(0, 16);
+ endDate = endDate.substring(0, 16);
+ startToEnd = startDate + " ~ " + endDate;
+
+ if (data.get("img_url").isJsonNull())
+ userProfile = "DEFAULT :: profile_IMAGE";
+ else
+ userProfile = data.get("img_url").getAsString();
+
+
+ Intent intent = new Intent(context, PlanDetailActivity.class);
+ intent.putExtra("userProfile", userProfile);
+ intent.putExtra("userName", userName);
+ intent.putExtra("schedTitle", schedTitle);
+ intent.putExtra("aboutSched", aboutSched);
+ intent.putExtra("area", schedLocation);
+ intent.putExtra("startToEnd", startToEnd);
+
+ context.startActivity(intent);
+
+ Log.i("result", data.get("id").getAsString());
+ } else {
+
+ Toast.makeText(itemView.getContext(), "해당 일정이 없습니다.", Toast.LENGTH_LONG).show();
+ }
+
+ }
+ }
+ });
+ try {
+ ion.get();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ }
+
+ class HeaderViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
+
+ HeaderViewHolder(View headerView) {
+ super(headerView);
+ }
+
+ @Override
+ public void onClick(View v) {
+
+ }
+ }
+
+ @Override
+ public int getItemViewType(int position) {
+ return position;
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/CodeNumber.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/CodeNumber.java
new file mode 100644
index 0000000..0c7c3fd
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/CodeNumber.java
@@ -0,0 +1,25 @@
+package kr.ac.smu.cs.shalendar_java;
+
+public class CodeNumber {
+
+ public static final int PICK_IMAGE_REQUEST = 1;
+ public static int TO_MAIN_ACTIVITY = 1000;
+ public static int TO_LOGIN_ACTIVITY = 1001;
+ public static int TO_CREATE_MEMBER1 = 1002;
+ public static int TO_CREATE_MEMBER2 = 1020;
+ public static int TO_CREATE_MEMBER3 = 1021;
+ public static int TO_BOARD_ACTIVITY = 1009;
+ public static int TO_REGISTERPLAN_ACTIVITY = 1007;
+ public static int TO_RECOMMANDTIME_ACTIVITY = 1008;
+ public static int TO_PLANDETAIL_ACTIVITY = 1010;
+ public static int TO_UPDATEPLAN_ACTIVITY = 1011;
+ public static int TO_DELETEPLAN_ACTIVITY = 1012;
+ public static int TO_NOTICE_ACTIVITY = 1003;
+ public static int TO_SETTING_ACTIVITY = 1004;
+ public static int TO_INVITE_ACTIVITY = 1005;
+ public static int TO_CREATE_CALENDAR_ACTIVITY = 1006;
+ public static int TO_INVITEBYEMAIL_ACTIVITY = 1014;
+ public static int TO_SEARCH_PLAN_ACTIVITY = 1009;
+ public static int TO_WAITINVITEACTIVITY = 1201;
+
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/CreateCalendarActivity.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/CreateCalendarActivity.java
new file mode 100644
index 0000000..62e6472
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/CreateCalendarActivity.java
@@ -0,0 +1,390 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.Manifest;
+import android.app.Activity;
+import android.app.ProgressDialog;
+import android.content.ActivityNotFoundException;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.content.res.AssetManager;
+import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Environment;
+import android.provider.MediaStore;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.content.ContextCompat;
+import android.support.v4.content.CursorLoader;
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ImageButton;
+import android.widget.ImageView;
+import android.widget.Toast;
+
+import com.google.gson.JsonObject;
+import com.koushikdutta.async.future.Future;
+import com.koushikdutta.async.future.FutureCallback;
+import com.koushikdutta.ion.Ion;
+import com.koushikdutta.ion.ProgressCallback;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import static android.content.Context.MODE_PRIVATE;
+import static kr.ac.smu.cs.shalendar_java.CodeNumber.PICK_IMAGE_REQUEST;
+
+/*
+ 캘린더 생성하는 Activity
+*/
+public class CreateCalendarActivity extends AppCompatActivity {
+
+ public static Activity CreateCalendarclearActivity;
+
+ private EditText calendarName;
+ private EditText aboutCalendar;
+ private Button registerCal;
+ private CreateCalendarActivityDialog dialog;
+ private ImageView imageView;
+
+ //UserToken
+ private String userToken;
+
+ //통신 위한 url가져오기
+ private NetWorkUrl url = new NetWorkUrl();
+
+ //이미지 절대 경로
+ private String imageURL;
+
+ //서버에 보낼 data
+ private String calName;
+ private String aboutCal;
+
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+
+ //삭제를위해
+ CreateCalendarclearActivity = CreateCalendarActivity.this;
+
+ Intent intent = getIntent();
+ int code = intent.getExtras().getInt("where");
+ if (code == 88888) {
+ setContentView(R.layout.activity_create_calendar);
+
+// if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ checkPermissions();
+// }
+
+
+ Ion.getDefault(this).configure().setLogging("ion-sample", Log.DEBUG);
+ Ion.getDefault(this).getConscryptMiddleware().enable(false);
+
+ SharedPreferences pref = getSharedPreferences("pref_USERTOKEN", MODE_PRIVATE);
+ //값이 없으면 default로 0
+ userToken = pref.getString("userToken", "NO_TOKEN");
+ Log.i("C::Sharepref에 저장된 토큰", userToken);
+
+ imageView = findViewById(R.id.imageView_createCal);
+ calendarName = findViewById(R.id.calTitle_EditText_createCal);
+ aboutCalendar = findViewById(R.id.aboutCal_EditText_createCal);
+
+
+ //갤러리에서 사진 가져오기 위한 ImageView리스너 구현
+ imageView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ getPictureFromGallery();
+ }
+ });
+
+
+ registerCal = (Button) findViewById(R.id.register_complete);
+ registerCal.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+
+ calName = calendarName.getText().toString().trim();
+ aboutCal = aboutCalendar.getText().toString().trim();
+
+ File file = new File(imageURL);
+ //서버 통신.
+
+ final ProgressDialog progressDialog = new ProgressDialog(CreateCalendarActivity.this);
+ progressDialog.setMessage("공유 달력을 등록중입니다~");
+ progressDialog.setProgressStyle(progressDialog.STYLE_SPINNER);
+ progressDialog.show();
+
+ final Future ion = Ion.with(getApplicationContext())
+ .load("POST", url.getServerUrl() + "/createCal")
+ //요청 헤더 지정
+ //.setHeader("Content-Type","application/json")
+ .setHeader("Authorization", userToken)
+ .setTimeout(60000)
+ .setMultipartParameter("calName", calName)
+ .setMultipartParameter("calContent", aboutCal)
+ .setMultipartFile("file", file)
+ //응답형식
+ .asJsonObject()
+ .setCallback(new FutureCallback() {
+ @Override
+ public void onCompleted(Exception e, JsonObject result) {
+
+ if (e != null) { //서버 연결 오류
+ Log.i("달력 생성 에러코드", e.getMessage());
+ Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
+ } else {// 서버 연결 성공 시
+ progressDialog.dismiss();
+ String message = result.get("message").getAsString();
+ Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
+
+ if (message.equals("success"))
+ Dialog();
+ else
+ Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
+ }
+ }
+ });
+ }
+ });
+
+
+ ImageButton backButton = findViewById(R.id.btn_back);
+ backButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ onBackPressed();
+ }
+ });
+ }
+ //-----------------수정화면에서 올 경우-----------------------------------------------------
+ else {
+ setContentView(R.layout.activity_modify_calendar);
+ checkPermissions();
+
+ int flag = 0;
+
+ Ion.getDefault(this).configure().setLogging("ion-sample", Log.DEBUG);
+ Ion.getDefault(this).getConscryptMiddleware().enable(false);
+
+ SharedPreferences pref = getSharedPreferences("pref_USERTOKEN", MODE_PRIVATE);
+ //값이 없으면 default로 0
+ userToken = pref.getString("userToken", "NO_TOKEN");
+ Log.i("C::Sharepref에 저장된 토큰", userToken);
+
+ imageView = findViewById(R.id.imageView_createCal);
+ calendarName = findViewById(R.id.calTitle_EditText_createCal);
+ aboutCalendar = findViewById(R.id.aboutCal_EditText_createCal);
+
+ final int cid_old = intent.getIntExtra("cid", 0);
+ final String calImage_old = intent.getStringExtra("calImage");
+ String calName_old = intent.getStringExtra("calName");
+ String calContent_old = intent.getStringExtra("aboutCal");
+
+ //이전 data Set
+ Ion.with(imageView)
+ .centerCrop()
+ .placeholder(R.drawable.tempboardpic)
+ .load(calImage_old);
+
+ calendarName.setText(calName_old);
+ aboutCalendar.setText(calContent_old);
+
+ //갤러리에서 사진 가져오기 위한 ImageView리스너 구현
+ imageView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ getPictureFromGallery();
+ }
+ });
+
+ registerCal = (Button) findViewById(R.id.register_complete);
+ registerCal.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+
+ calName = calendarName.getText().toString().trim();
+ aboutCal = aboutCalendar.getText().toString().trim();
+ String cid_update = Integer.toString(cid_old);
+
+
+ if (imageURL == null) {
+ Toast.makeText(getApplicationContext(), "이미지를 다른 이미지로 선택해주세요", Toast.LENGTH_LONG).show();
+ } else {
+ File file = new File(imageURL);
+ //서버 통신.
+
+ final ProgressDialog progressDialog = new ProgressDialog(CreateCalendarActivity.this);
+ progressDialog.setMessage("공유 달력을 수정 중 입니다~");
+ progressDialog.setProgressStyle(progressDialog.STYLE_SPINNER);
+ progressDialog.show();
+
+ final Future ion = Ion.with(getApplicationContext())
+ .load("POST", url.getServerUrl() + "/updateCal")
+ //요청 헤더 지정
+ //.setHeader("Content-Type","application/json")
+ .setHeader("Authorization", userToken)
+ .setTimeout(60000)
+ .setMultipartFile("file", file)
+ .setMultipartParameter("calName", calName)
+ .setMultipartParameter("calContent", aboutCal)
+ .setMultipartParameter("cid", cid_update)
+ //응답형식
+ .asJsonObject()
+ .setCallback(new FutureCallback() {
+ @Override
+ public void onCompleted(Exception e, JsonObject result) {
+
+ if (e != null) { //서버 연결 오류
+ Log.i("달력 수정 에러코드", e.getMessage());
+ Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
+ } else {// 서버 연결 성공 시
+ progressDialog.dismiss();
+ String message = result.get("message").getAsString();
+ Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
+
+ if (message.equals("success")) {
+ MainActivity.calName = calName;
+ Dialog();
+ } else
+ Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
+ }
+ }
+ });
+ }
+ }
+ });
+
+ ImageButton backButton = findViewById(R.id.btn_back);
+ backButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ onBackPressed();
+ }
+ });
+ }
+
+ }
+
+ public void Dialog() {
+ dialog = new CreateCalendarActivityDialog(CreateCalendarActivity.this, leftListener); // 왼쪽 버튼 이벤트
+ // 오른쪽 버튼 이벤트
+
+ //요청 이 다이어로그를 종료할 수 있게 지정함
+ dialog.setCancelable(true);
+ dialog.getWindow().setGravity(Gravity.CENTER);
+ dialog.show();
+ }
+
+ //다이얼로그 클릭이벤트
+ private View.OnClickListener leftListener = new View.OnClickListener() {
+ public void onClick(View v) {
+ Toast.makeText(CreateCalendarActivity.this, "버튼을 클릭하였습니다.", Toast.LENGTH_SHORT).show();
+ dialog.dismiss();
+ }
+ };
+
+
+ //로컬 폰의 갤러리에서 사진 선택
+ private void getPictureFromGallery() {
+
+ Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
+ intent.setType("image/jpg");
+ try {
+ startActivityForResult(intent, PICK_IMAGE_REQUEST);
+ } catch (ActivityNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ /*
+ 폰에서 사진을 지정하면 해당 사진 주소를 가져온다.
+ */
+ private String getPathFromURI(Uri contentUri) {
+ String[] proj = {MediaStore.Images.Media.DATA};
+ Log.d("여기까지", "ㅇ5");
+ CursorLoader loader = new CursorLoader(getApplicationContext(), contentUri, proj, null, null, null);
+ Cursor cursor = loader.loadInBackground();
+ int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
+ cursor.moveToFirst();
+ Log.d("여기까지", "ㅇ6");
+
+ return cursor.getString(column_index);
+ }
+
+
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+
+ try {
+ switch (requestCode) {
+ //사진등록
+ case PICK_IMAGE_REQUEST:
+ Log.d("여기까지", "ㅇ3");
+ if (resultCode == RESULT_OK) {
+ Log.d("여기까지", "ㅇ4");
+ imageURL = getPathFromURI(data.getData());
+ Log.d("사진 경로", imageURL);
+ imageView.setImageURI(data.getData());
+ }
+
+ //주소받아오기
+
+ }
+ } catch (Exception e) {
+ Toast.makeText(this, "오류가 있습니다.", Toast.LENGTH_LONG).show();
+ e.printStackTrace();
+ }
+ }
+
+
+ private void checkPermissions() {
+ if (ContextCompat.checkSelfPermission(this,
+ Manifest.permission.READ_EXTERNAL_STORAGE)
+ != PackageManager.PERMISSION_GRANTED ||
+ ContextCompat.checkSelfPermission(this,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE)
+ != PackageManager.PERMISSION_GRANTED) {
+
+ ActivityCompat.requestPermissions(this,
+ new String[]{
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE
+ },
+ 1052);
+ }
+ }
+
+ public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
+ switch (requestCode) {
+ case 1052: {
+ // If request is cancelled, the result arrays are empty.
+ if (grantResults.length > 0
+ && grantResults[0] == PackageManager.PERMISSION_GRANTED
+ && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
+ // permission was granted.
+ } else {
+ // Permission denied - Show a message to inform the user that this app only works
+ // with these permissions granted
+ }
+ return;
+ }
+ }
+ }
+}
+
+
+
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/CreateCalendarActivityDialog.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/CreateCalendarActivityDialog.java
new file mode 100644
index 0000000..bd49927
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/CreateCalendarActivityDialog.java
@@ -0,0 +1,49 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.content.Intent;
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.Button;
+
+
+public class CreateCalendarActivityDialog extends Dialog {
+
+
+ private Button gotomain;
+ CreateCalendarActivity Bactivity = (CreateCalendarActivity) CreateCalendarActivity.CreateCalendarclearActivity;
+
+
+ public CreateCalendarActivityDialog(Context context, View.OnClickListener singleListener) {
+ super(context, android.R.style.Theme_Translucent_NoTitleBar);
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+
+ //뒷배경 어둡게 해주기
+ WindowManager.LayoutParams lpWindow = new WindowManager.LayoutParams();
+ lpWindow.flags = WindowManager.LayoutParams.FLAG_DIM_BEHIND;
+ lpWindow.dimAmount = 0.8f;
+ getWindow().setAttributes(lpWindow);
+
+
+ setContentView(R.layout.activity_create_calendar_dialog);
+
+ gotomain = findViewById(R.id.CreateCalendarComplete);
+ gotomain.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent2 = new Intent(getContext(), MainActivity.class);
+ getContext().startActivity(intent2);
+ dismiss();
+ Bactivity.finish();
+ }
+ });
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/CreateMember1.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/CreateMember1.java
new file mode 100644
index 0000000..b289b4c
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/CreateMember1.java
@@ -0,0 +1,87 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.content.Intent;
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.google.gson.JsonObject;
+import com.koushikdutta.async.future.FutureCallback;
+import com.koushikdutta.ion.Ion;
+
+public class CreateMember1 extends AppCompatActivity {
+
+ private EditText editTextUserEmail;
+ private Button buttonToMember2;
+ private String userEmail;
+
+ private NetWorkUrl url = new NetWorkUrl();
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_create_member1);
+
+ editTextUserEmail = (EditText)findViewById(R.id.create_member1_editText1);
+ buttonToMember2 = findViewById(R.id.create_member2_button);
+
+
+ Ion.getDefault(this).configure().setLogging("ion-sample", Log.DEBUG);
+ Ion.getDefault(this).getConscryptMiddleware().enable(false);
+
+ buttonToMember2.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ //회원 가입 2번째로 보낼 userEmail
+ userEmail = editTextUserEmail.getText().toString().trim();
+ Log.d("Email", userEmail);
+
+ if(userEmail.equals("")) {
+ Toast.makeText(getApplicationContext(), "Email을 입력하세요~", Toast.LENGTH_LONG).show();
+ }
+
+ else if(!userEmail.contains("@")) {
+ Toast.makeText(getApplicationContext(), "잘못된 Email형식입니다", Toast.LENGTH_LONG).show();
+ }
+
+ else{
+
+ JsonObject json = new JsonObject();
+ json.addProperty("id", userEmail);
+
+ Ion.with(getApplicationContext())
+ .load("POST", url.getServerUrl() + "/emailCheck")
+ .setHeader("Content-Type","application/json")
+ .setJsonObjectBody(json)
+ .asJsonObject()
+ .setCallback(new FutureCallback() {
+ @Override
+ public void onCompleted(Exception e, JsonObject result) {
+
+ if(e != null) { //서버 연결 오류
+ Toast.makeText(getApplicationContext(), "SEver Error", Toast.LENGTH_LONG).show();
+ }
+
+ else {// 서버 연결 성공 시
+ if(result.get("message").getAsString().equals("available")) {
+ Toast.makeText(getApplicationContext(), result.get("message").getAsString(), Toast.LENGTH_LONG).show();
+
+ Intent intent = new Intent(getApplicationContext(), CreateMember2.class);
+ intent.putExtra("userEmail", userEmail);
+ startActivityForResult(intent, CodeNumber.TO_CREATE_MEMBER2);
+ }
+ else
+ Toast.makeText(getApplicationContext(), "해당 이메일은 사용할 수 없습니다.", Toast.LENGTH_LONG).show();
+ }
+ }
+ });
+ }
+ }
+ });
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/CreateMember2.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/CreateMember2.java
new file mode 100644
index 0000000..28a3fc1
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/CreateMember2.java
@@ -0,0 +1,168 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.app.ProgressDialog;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.AsyncTask;
+import android.renderscript.ScriptGroup;
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ProgressBar;
+import android.widget.Toast;
+
+import com.google.firebase.iid.FirebaseInstanceId;
+import com.google.gson.JsonObject;
+import com.koushikdutta.async.future.FutureCallback;
+import com.koushikdutta.ion.Ion;
+
+import org.json.simple.parser.JSONParser;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import org.json.simple.JSONObject;
+
+public class CreateMember2 extends AppCompatActivity {
+
+ private Button buttonToMember3;
+ private EditText editTextUserName;
+ private EditText editTextUserPassword;
+ private EditText editTextReEntPassword;
+
+ //CreateMember3로 보낼 data
+ private String userEmail;
+ private String userName;
+ private String userPassword;
+ private String reEntPassword;
+
+
+ //서버 URL을 위한 객체 생성
+ private NetWorkUrl url = new NetWorkUrl();
+
+
+ //Firebase를 위한 device Token값
+ private String deviceToken;
+
+
+ public String getUserName() {
+ return this.userName;
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_create_member2);
+
+ buttonToMember3 = findViewById(R.id.create_member3_button);
+ editTextUserName = findViewById(R.id.create_mem2_userName_editText1);
+ editTextUserPassword = findViewById(R.id.create_mem2_password_editText2);
+ editTextReEntPassword = findViewById(R.id.create_mem2_checkPassword_editText3);
+
+
+ Intent intent = getIntent();
+ userEmail = intent.getStringExtra("userEmail");
+ Toast.makeText(getApplicationContext(), userEmail, Toast.LENGTH_LONG).show();
+
+
+ try {
+ deviceToken = FirebaseInstanceId.getInstance().getToken();
+ Log.i("Device Token", deviceToken);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+
+ buttonToMember3.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+
+ userName = editTextUserName.getText().toString().trim();
+ userPassword = editTextUserPassword.getText().toString().trim();
+ reEntPassword = editTextReEntPassword.getText().toString().trim();
+
+
+ if(userName.equals("") || userName.length() < 2) {
+ Toast.makeText(getApplicationContext(), "이름은 3글자 이상으로 해주세요",Toast.LENGTH_LONG).show();
+ }
+ else if(userPassword.equals("") || userPassword.length() < 5) {
+ Toast.makeText(getApplicationContext(), "비밀번호는 5자 이상이어야 합니다.",Toast.LENGTH_LONG).show();
+ }
+ else if(!(userPassword.equals(reEntPassword))) {
+ Toast.makeText(getApplicationContext(), "입력한 비밀번호가 맞지 않습니다",Toast.LENGTH_LONG).show();
+ }
+ else {
+
+ serverNetwork();
+ }
+ }
+ });
+ }
+
+ public void serverNetwork() {
+
+ JsonObject json = new JsonObject();
+ json.addProperty("id", userEmail);
+ json.addProperty("pw", userPassword);
+ json.addProperty("userName", userName);
+ /////////////////////////////////////////////////
+ //divce토큰 은 로그인 할 때 준다! 변경 필요.
+ /////////////////////////////////////////////////
+ //json.addProperty("deviceToken", deviceToken);
+
+ final ProgressDialog progressDialog = new ProgressDialog(CreateMember2.this);
+ progressDialog.setMessage("회원 정보를 등록중입니다~");
+ progressDialog.setProgressStyle(progressDialog.STYLE_SPINNER);
+ progressDialog.show();
+
+
+ Ion.with(getApplicationContext())
+ .load("POST", url.getServerUrl() + "/signup")
+ .setHeader("Content-Type", "application/json")
+ .progressDialog(progressDialog)
+ .setJsonObjectBody(json)
+ .asJsonObject()
+ .setCallback(new FutureCallback() {
+
+ @Override
+ public void onCompleted(Exception e, JsonObject result) {
+
+ if(e != null) {
+ Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
+ Log.i("회원등록 NetworkErrorCode", e.getMessage());
+ }
+
+ else {
+ progressDialog.dismiss();
+ parseFromServer(result);
+ }
+ }
+ });
+ }
+
+
+ public void parseFromServer(JsonObject result) {
+
+ String message = result.get("message").getAsString();
+ if(message.equals("success")) {
+ Toast.makeText(getApplicationContext(), "회원 등록 " + message, Toast.LENGTH_LONG).show();
+ Intent intent = new Intent(getApplicationContext(), CreateMember3.class);
+ startActivity(intent);
+ }
+
+ else {
+ Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
+ }
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/CreateMember3.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/CreateMember3.java
new file mode 100644
index 0000000..28bed46
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/CreateMember3.java
@@ -0,0 +1,35 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.content.Intent;
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+
+public class CreateMember3 extends AppCompatActivity {
+
+ private String userEmail;
+ private String userName;
+ private String userPassword;
+ private Button buttonToLogin;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_create_member3);
+
+ buttonToLogin = findViewById(R.id.loginpage_button);
+
+ buttonToLogin.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+
+ Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ startActivity(intent);
+
+ }
+ });
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/CustomEventDecorator.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/CustomEventDecorator.java
new file mode 100644
index 0000000..e86f38f
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/CustomEventDecorator.java
@@ -0,0 +1,63 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.text.style.LineBackgroundSpan;
+import android.util.Log;
+
+/*
+ EventDecorator에서 부른다.
+ drawBackground에서 점의 위치, 색깔 지정 가능
+ */
+
+public class CustomEventDecorator implements LineBackgroundSpan {
+
+ private int pivotNum;
+ private int radius;
+ private int color;
+ //점의 개수 count max = 3;
+// public static int[] eventCount = new int[3];
+
+
+
+ public CustomEventDecorator(int radius, int color) {
+ this.radius = radius;
+ this.color = color;
+ }
+
+ public CustomEventDecorator(int pivotNum, int radius, int color) {
+ this(radius, color);
+ this.pivotNum = pivotNum;
+ }
+
+ @Override
+ public void drawBackground(Canvas canvas, Paint paint, int left, int right, int top, int baseline,
+ int bottom, CharSequence text, int start, int end, int lnum) {
+
+ int oldColor = paint.getColor();
+ if (color != 0) {
+ paint.setColor(color);
+ }
+
+
+ switch(pivotNum) {
+ case 1:
+ canvas.drawCircle((left + right) / 2, (bottom + top) / 2 + 30, radius, paint);
+ paint.setColor(oldColor);
+ EventDecorator.eventCount[0]++;
+ break;
+ case 2:
+ canvas.drawCircle((left + right) / 2 , (bottom + top) / 2 + 50, radius, paint);
+ paint.setColor(oldColor);
+ EventDecorator.eventCount[1]++;
+ break;
+ case 3:
+ canvas.drawCircle((left + right) / 2 , (bottom + top) / 2 + 70, radius, paint);
+ paint.setColor(oldColor);
+ EventDecorator.eventCount[2]++;
+ break;
+ default:
+ break;
+ }
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/DeletePlanActivity.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/DeletePlanActivity.java
new file mode 100644
index 0000000..0b55d46
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/DeletePlanActivity.java
@@ -0,0 +1,38 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.content.Intent;
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+
+/*
+
+ 등록된 일정을 삭제하는 Activity
+ 해당 일정을 삭제 하고 나서 다시 MainActivity로 돌아간다.
+
+ */
+public class DeletePlanActivity extends AppCompatActivity {
+
+ private Button buttonCompleteDelete;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_delete_plan);
+
+
+ buttonCompleteDelete = findViewById(R.id.deletePlan_toMain_button);
+
+ /*
+ 일정 수정 화면으로 이동
+ */
+ buttonCompleteDelete.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent(getApplicationContext(), MainActivity.class);
+ startActivity(intent);
+ }
+ });
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/EventDecorator.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/EventDecorator.java
new file mode 100644
index 0000000..c1ad5e6
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/EventDecorator.java
@@ -0,0 +1,58 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.app.Activity;
+import android.graphics.drawable.Drawable;
+
+import com.prolificinteractive.materialcalendarview.CalendarDay;
+import com.prolificinteractive.materialcalendarview.DayViewDecorator;
+import com.prolificinteractive.materialcalendarview.DayViewFacade;
+
+import java.util.Collection;
+import java.util.HashSet;
+
+public class EventDecorator implements DayViewDecorator {
+
+ private final Drawable drawable;
+ private int pivotNum;
+ private int color;
+ private HashSet dates;
+ public static int[] eventCount = new int[3];
+
+
+ public EventDecorator(int color, Collection dates, Activity context) {
+ drawable = context.getResources().getDrawable(R.drawable.more);
+ this.color = color;
+ this.dates = new HashSet<>(dates);
+ }
+
+ public EventDecorator(int pivotNum, int color, Collection dates, Activity context) {
+ drawable = context.getResources().getDrawable(R.drawable.more);
+ this.pivotNum = pivotNum;
+ this.color = color;
+ this.dates = new HashSet<>(dates);
+ }
+
+ @Override
+ public boolean shouldDecorate(CalendarDay day) {
+
+ return dates.contains(day);
+ }
+
+ @Override
+ public void decorate(DayViewFacade view) {
+// view.setSelectionDrawable(drawable); // 초록색 사각형
+// view.addSpan(new DotSpan(5, color)); // 날자밑에 점
+// view.addSpan(new CustomEventDecorator(pivotNum,6, color));
+// view.addSpan(new CustomEventDecorator(pivotNum,5, color));
+
+ CustomEventDecorator eventDecorator = new CustomEventDecorator(pivotNum, 6, color);
+ view.addSpan(eventDecorator);
+// this.eventCount = eventDecorator.getEventCount();
+ }
+
+
+ public HashSet getDates() {
+ return this.dates;
+ }
+}
+
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/Global.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/Global.java
new file mode 100644
index 0000000..99e756b
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/Global.java
@@ -0,0 +1,186 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.app.Activity;
+import android.app.ProgressDialog;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.ShapeDrawable;
+import android.graphics.drawable.shapes.OvalShape;
+import android.os.Build;
+import android.util.Log;
+import android.widget.ImageView;
+import android.widget.Toast;
+
+import com.google.gson.JsonObject;
+import com.koushikdutta.async.future.Future;
+import com.koushikdutta.async.future.FutureCallback;
+import com.koushikdutta.ion.Ion;
+import com.prolificinteractive.materialcalendarview.CalendarDay;
+
+class ScheduleData {
+
+ String sche_title;
+ int cid;
+ int sid;
+ String sche_content;
+ String startDate;
+ String startTime;
+ String endDate;
+ String endTime;
+ String area;
+ int numberofComment;
+
+}
+
+class CalendarScheduleData {
+
+ String sche_title;
+ int cid;
+ int sid;
+ String sche_content;
+ CalendarDay startDate;
+ String startTime;
+ CalendarDay middleDate;
+ CalendarDay endDate;
+ String endTime;
+ String area;
+ int numberofComment;
+}
+
+public class Global {
+
+ private JsonObject jsonResult;
+
+ private static int sid = 0;
+
+ public static int getSid() {
+ return sid;
+ }
+
+ public static void setSid(int sid) {
+ Global.sid = sid;
+ }
+
+ public static String getDayOfWeek(int DAY_OF_WEEK) {
+
+ String dayOfWeek = null;
+
+ switch (DAY_OF_WEEK) {
+ case 1: dayOfWeek = "(일)";
+ break;
+ case 2: dayOfWeek = "(월)";
+ break;
+ case 3: dayOfWeek = "(화)";
+ break;
+ case 4: dayOfWeek = "(수)";
+ break;
+ case 5: dayOfWeek = "(목)";
+ break;
+ case 6: dayOfWeek = "(금)";
+ break;
+ case 7: dayOfWeek = "(토)";
+ break;
+ default:
+ }
+
+ return dayOfWeek;
+ }
+
+ public void setProfileImage(ImageView userProfile, String profile_img) {
+
+ if (!(profile_img.equals("DEFAULT :: profile_IMAGE"))) {
+ userProfile.setBackground(new ShapeDrawable(new OvalShape()));
+ if(Build.VERSION.SDK_INT >= 21) {
+ userProfile.setClipToOutline(true);
+ }
+
+ Ion.with(userProfile)
+ .centerCrop()
+ .resize(250, 250)
+ .load(profile_img);
+ } else {
+ userProfile.setImageResource(R.drawable.profile_default);
+ }
+ }
+
+
+
+ public void netWork_ShowSche(final Context context, final ProgressDialog progressDialog, JsonObject json, NetWorkUrl url) {
+
+ Future ion = Ion.with(context)
+ .load("POST", url.getServerUrl() + "/showSche")
+ .setHeader("Content-Type", "application/json")
+ .setJsonObjectBody(json)
+ .asJsonObject() //응답
+ .setCallback(new FutureCallback() {
+ @Override
+ public void onCompleted(Exception e, JsonObject result) {
+ //응답 받을 변수
+ String userProfile, userName, schedTitle, aboutSched, schedLocation;
+ String startDate, startTime, endDate, endTime, startToEnd;
+
+ if (e != null) {
+ Toast.makeText(context, "Server Connection Error!", Toast.LENGTH_LONG).show();
+ } else {
+ //응답 형식이 { "data":{"id":"jacob456@hanmail.net", "cid":1, "sid":10, "title":"korea"}, "message":"success"}
+ //data: 다음에 나오는 것들도 JsonObject형식.
+ //따라서 data를 JsonObject로 받고, 다시 이 data를 이용하여(어찌보면 JsonObject안에 또다른 JsonObject가 있는 것이다.
+ //JSONArray가 아님. 얘는 [,]로 묶여 있어야 함.
+
+ String message = result.get("message").getAsString();
+ //서버로 부터 응답 메세지가 success이면...
+
+ if (message.equals("success")) {
+ //서버 응답 오면 로딩 창 해제
+ progressDialog.dismiss();
+
+ //data: {} 에서 {}안에 있는 것들도 JsonObject
+ JsonObject data = result.get("data").getAsJsonObject();
+
+ userName = data.get("userName").getAsString();
+ schedTitle = data.get("title").getAsString();
+ aboutSched = data.get("sContent").getAsString();
+ schedLocation = data.get("area").getAsString();
+ startDate = data.get("startDate").getAsString();
+ //startTime = data.get("startTime").getAsString();
+ endDate = data.get("endDate").getAsString();
+ //endTime = data.get("endTime").getAsString();
+
+ //뒤에 0.000 잘라내기
+ startDate = startDate.substring(0, 16);
+ endDate = endDate.substring(0, 16);
+ startToEnd = startDate + " ~ " + endDate;
+
+ if (data.get("img_url").isJsonNull())
+ userProfile = "DEFAULT :: profile_IMAGE";
+ else
+ userProfile = data.get("img_url").getAsString();
+
+ Intent intent = new Intent(context, PlanDetailActivity.class);
+ intent.putExtra("userProfile", userProfile);
+ intent.putExtra("userName", userName);
+ intent.putExtra("schedTitle", schedTitle);
+ intent.putExtra("aboutSched", aboutSched);
+ intent.putExtra("area", schedLocation);
+ intent.putExtra("startToEnd", startToEnd);
+
+ context.startActivity(intent);
+
+ Log.i("result", data.get("id").getAsString());
+ } else {
+
+ Toast.makeText(context, "해당 일정이 없습니다.", Toast.LENGTH_LONG).show();
+ }
+
+ }
+ }
+ });
+
+ try {
+ ion.get();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/InviteActivity.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/InviteActivity.java
new file mode 100644
index 0000000..78ff585
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/InviteActivity.java
@@ -0,0 +1,307 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.graphics.Color;
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ImageButton;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.google.gson.JsonPrimitive;
+import com.koushikdutta.async.future.Future;
+import com.koushikdutta.async.future.FutureCallback;
+import com.koushikdutta.ion.Ion;
+
+import java.util.ArrayList;
+
+/*
+ 공유캘린더 멤버 초대 Actvity
+ */
+
+public class InviteActivity extends AppCompatActivity {
+
+ private EditText userEmail;
+ private TextView addEmail;
+ private Button toEmailInviteButton;
+ ImageButton backButton;
+
+ //사용자 토큰 값
+ private String userToken;
+
+ //서버 연동
+ private NetWorkUrl url = new NetWorkUrl();
+
+ //서버로 넘길 값
+ private String inputEmail;
+
+ private RecyclerView recyclerView;
+
+ private UserEmailAdapter adapter;
+
+ //sideBar의 공유달력 intent로 넘긴 값.
+ private String senderName;
+ private String senderID;
+ private String senderImg;
+ private String calName;
+ private int cid;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_invite);
+ backButton = findViewById(R.id.btn_back);
+ backButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ onBackPressed();
+ }
+ });
+
+ recyclerView = findViewById(R.id.invite_email_RecycleView);
+
+ LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
+ recyclerView.setLayoutManager(layoutManager);
+
+ adapter = new UserEmailAdapter();
+
+ /*
+ '추가' TextView리스너 구현
+ */
+ userEmail = findViewById(R.id.register_title_EditText);
+ addEmail = findViewById(R.id.invite_addEamil_TextView);
+
+ if (userEmail != null) {
+ addEmail.setTextColor(Color.parseColor("#ef7172"));
+ }
+
+
+ SharedPreferences pref = getSharedPreferences("pref_USERTOKEN", MODE_PRIVATE);
+ userToken = pref.getString("userToken", "NO_TOKEN");
+ Log.i("Sharepref에 저장된 토큰", userToken);
+
+
+ //통신 준비 --> ION
+ Ion.getDefault(this).configure().setLogging("ion-sample", Log.DEBUG);
+ Ion.getDefault(this).getConscryptMiddleware().enable(false);
+
+
+ addEmail.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ inputEmail = userEmail.getText().toString().trim();
+
+ JsonObject json = new JsonObject();
+ json.addProperty("id", inputEmail);
+
+ Future ion = Ion.with(getApplicationContext())
+ .load("POST", url.getServerUrl() + "/emailCheck")
+ .setHeader("Content-Type", "application/json")
+ .setJsonObjectBody(json)
+ .asJsonObject()
+ .setCallback(new FutureCallback() {
+
+ @Override
+ public void onCompleted(Exception e, JsonObject result) {
+
+ if (e != null) {
+ Toast.makeText(getApplicationContext(), "Server Connection Error", Toast.LENGTH_LONG).show();
+ } else {
+ parseFromServer(result);
+ }
+ }
+ });
+
+ //응답 받을 때까지 대기.
+ try {
+ ion.get();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ //adapter.addItem(new UserEmail(input_Email));
+ //recyclerView.setAdapter(adapter);
+ }
+ });
+
+ /*
+ 버튼 클릭시 초대장 보낼 이메일 입력하는 액티비티로 이동
+ 이메일 입력 액티비티->InviteByEmailActivity
+ */
+ toEmailInviteButton = findViewById(R.id.invite_email_button);
+ toEmailInviteButton.setOnClickListener(new View.OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+
+ JsonArray jsonArray = new JsonArray();
+ JsonParser parser = new JsonParser();
+
+ for (int i = 0; i < adapter.getItemCount(); i++) {
+
+ if (adapter.getItem(i).getIs_checked()) {
+
+ JsonPrimitive element = new JsonPrimitive(adapter.getItem(i).getUserEmail());
+ jsonArray.add(element);
+ }
+ }
+
+
+ Intent intent = getIntent();
+ cid = intent.getIntExtra("cid", -1);
+ calName = intent.getStringExtra("calName");
+ senderID = Sidebar.userProfile_ID;
+ senderName = Sidebar.userProfile_Name;
+ senderImg = Sidebar.userProfile_ImgURL;
+
+
+ Log.i("초대한 사람 ID", senderID);
+ Log.i("초대 할 사람", jsonArray.toString());
+ Log.i("초대한 사람 이름", senderName);
+ Log.i("초대한 사람 이미지", senderImg);
+ Log.i("초대 cid", Integer.toString(cid));
+ Log.i("초대 달력", calName);
+
+
+ JsonObject json = new JsonObject();
+ json.addProperty("sender", senderID);
+ json.add("receiver", jsonArray);
+ json.addProperty("senderName", senderName);
+ json.addProperty("sender_img", senderImg);
+ json.addProperty("cid", cid);
+ json.addProperty("cName", calName);
+
+
+ //겹치는 달력있나 확인
+ int result = findMember(jsonArray, senderID);
+ if (result == 1) {
+
+ } else {
+
+ Ion.with(getApplicationContext())
+ .load("POST", url.getServerUrl() + "/pushInvitation")
+ .setHeader("Content-Type", "application/json")
+ .setJsonObjectBody(json)
+ .asJsonObject()
+ .setCallback(new FutureCallback() {
+
+ @Override
+ public void onCompleted(Exception e, JsonObject result) {
+
+ if (e != null) {
+ Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
+ } else {
+ String message = result.get("message").getAsString();
+
+ if (message.equals("success")) {
+ Toast.makeText(getApplicationContext(), "초대 알림이 발송되었습니다.", Toast.LENGTH_LONG).show();
+ } else {
+ Toast.makeText(getApplicationContext(), message + "초대 실패", Toast.LENGTH_LONG).show();
+ }
+ }
+ }
+
+ });
+ }
+ }
+ });
+
+ }
+
+
+ public int findMember(JsonArray memberList, String invitedMember) {
+
+ final ArrayList calendarMember = new ArrayList<>();
+
+ //해당 캘린더멤버 조회
+ JsonObject json = new JsonObject();
+ json.addProperty("cid", MainActivity.cid);
+ Log.i("너가궁금해", Integer.toString(cid));
+
+ Future ion = Ion.with(getApplicationContext())
+ .load("POST", url.getServerUrl() + "/readUserCal")
+ .setHeader("Content-Type", "application/json")
+ .setHeader("Authorization", userToken)
+ .setJsonObjectBody(json)
+ .asJsonObject()
+ .setCallback(new FutureCallback() {
+
+ @Override
+ public void onCompleted(Exception e, JsonObject result) {
+
+ if (e != null) {
+ Toast.makeText(getApplicationContext(), "Server Connection Error", Toast.LENGTH_LONG).show();
+ } else {
+ String message = result.get("message").getAsString();
+ if (message.equals("success")) {
+ JsonArray data = result.get("data").getAsJsonArray();
+ for (int i = 0; i < data.size(); i++) {
+ JsonObject jsonObject = data.get(i).getAsJsonObject();
+ String calMember = jsonObject.get("id").getAsString();
+
+ if (jsonObject.get("cid").isJsonNull())
+ Log.i("cid는 널", "NULL임");
+ calendarMember.add(calMember);
+ Log.i("뭘까?용용용", calMember);
+ }
+ } else {
+ Toast.makeText(getApplicationContext(), message + "캘린더 멤버 불러오기 실패", Toast.LENGTH_LONG).show();
+ }
+ }
+ }
+
+ });
+ //응답 받을 때까지 대기.
+ try {
+ ion.get();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ //초대된 회원 확인하는 코드
+ for (int i = 0; i < memberList.size(); i++) {
+ String jsonOb = memberList.get(i).getAsString();
+ Log.i("뭘까?용", jsonOb);
+ for (int j = 0; j < calendarMember.size(); j++) {
+ if (jsonOb.equals(calendarMember.get(j))) {
+ Toast.makeText(getApplicationContext(), jsonOb + "는 이미 초대된 회원입니다.", Toast.LENGTH_SHORT).show();
+ return 1;
+ }
+ if (jsonOb.equals(senderID)) {
+ Toast.makeText(getApplicationContext(), "자신은 초대할 수 없습니다.", Toast.LENGTH_SHORT).show();
+ return 1;
+ }
+ }
+ }
+ return 0;
+ }
+
+
+ public void parseFromServer(JsonObject result) {
+ String message = result.get("message").getAsString();
+ if (message.equals("please check email")) {
+ //Log.i("현재 초대 리사이클러뷰 인원", Integer.toString(adapter.getItemCount()));
+
+ String imageURl;
+ if (result.get("img_url").isJsonNull())
+ imageURl = "DEFAULT :: profile_IMAGE";
+ else
+ imageURl = result.get("img_url").getAsString();
+
+ adapter.addItem(new UserEmail(inputEmail, false, imageURl));
+ recyclerView.setAdapter(adapter);
+ } else {
+ Toast.makeText(getApplicationContext(), message + "해당 사용자는 없습니다.", Toast.LENGTH_LONG).show();
+ }
+ }
+}
+
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/LoginActivity.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/LoginActivity.java
new file mode 100644
index 0000000..c2a70b3
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/LoginActivity.java
@@ -0,0 +1,194 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.app.Activity;
+import android.app.ProgressDialog;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.Toast;
+
+import com.google.firebase.iid.FirebaseInstanceId;
+import com.google.gson.JsonObject;
+import com.koushikdutta.async.future.Future;
+import com.koushikdutta.async.future.FutureCallback;
+import com.koushikdutta.ion.Ion;
+
+import java.io.File;
+
+/*
+ Login하는 Activity
+ Login -> MainActivity로 넘어간다.
+
+ */
+public class LoginActivity extends AppCompatActivity {
+
+ //EditText 멤버 변수
+ private EditText id_Email;
+ private EditText password;
+
+ //button 멤버 변수
+ private Button buttonToMain;
+ private Button buttonToMember1;
+
+ //EditText값을 String에 저장하기 위한 멤버변수.
+ private String userEmail;
+ private String userPassword;
+
+ //서버 통신 위한 url 객체 생성 여기서는 /signin
+ private NetWorkUrl url = new NetWorkUrl();
+
+ //로그인시 서버로 넘길 deviceToken값
+ private String deviceToken;
+
+ //서버로 부터 로그인 성공 시 오는 응답 Token 변수
+ private String userToken;
+
+ //서버로 부터 로그인 성공 시 오는 응답 UserName변수
+ private String userName;
+
+ //서버로 부터 로그인 성공 시 오는 응답 profileImageURL변수
+ private String img_url;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_login);
+
+
+
+
+ id_Email = findViewById(R.id.login_id_EditText);
+ password = findViewById(R.id.login_password_EditText);
+
+
+ buttonToMain = findViewById(R.id.login_toMain_button);
+ buttonToMember1 = findViewById(R.id.login_signin_button);
+
+ /*
+ 우선 버튼 클릭시 MainActivity로 넘어간다.
+ - 나중에 CreateMemberActivity로 넘어가는 코드 짜야 한다.
+ */
+
+ //device TOken값
+ try {
+ deviceToken = FirebaseInstanceId.getInstance().getToken();
+ Log.i("로그인에서 Device Token", deviceToken);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ //통신 준비.
+ Ion.getDefault(this).configure().setLogging("ion-sample", Log.DEBUG);
+ Ion.getDefault(this).getConscryptMiddleware().enable(false);
+
+ //로그인 버튼
+ buttonToMain.setOnClickListener(new View.OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+
+ userEmail = id_Email.getText().toString().trim();
+ userPassword = password.getText().toString().trim();
+
+ Log.d("맞아?", Boolean.toString(userEmail.equals("jacob456@hanmail.net")));
+
+ //서버 통신코드 Ion 롸이브뤄리 사용
+ final ProgressDialog progressDialog = new ProgressDialog(LoginActivity.this);
+ progressDialog.setMessage("로그인 중 입니다~");
+ progressDialog.setProgressStyle(progressDialog.STYLE_SPINNER);
+ progressDialog.show();
+
+ //응답 바디 설정.
+ JsonObject json = new JsonObject();
+
+ //응답 바디 서버에 보낼 data 넣음
+ json.addProperty("id", userEmail);
+ json.addProperty("pw", userPassword);
+ json.addProperty("deviceToken", deviceToken);
+ Ion.with(getApplicationContext())
+ .load("POST", url.getServerUrl() + "/signin")
+ .setHeader("Content-Type", "application/json")
+ .progressDialog(progressDialog)
+ .setJsonObjectBody(json)
+ .asJsonObject()
+ .setCallback(new FutureCallback() {
+ @Override
+ public void onCompleted(Exception e, JsonObject result) {
+
+ if( e!= null) {
+ Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
+ }
+ else {
+ progressDialog.dismiss();
+ String message = result.get("message").getAsString();
+ Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
+ parseFromServer(message, result);
+ }
+ }
+ });
+ InputMethodManager immhide = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
+
+ immhide.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
+
+
+ }
+ });
+
+ //이메일로 회원가입 버튼 클릭 경우
+ buttonToMember1.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent(getApplicationContext(), CreateMember1.class);
+ startActivityForResult(intent, CodeNumber.TO_CREATE_MEMBER1);
+ }
+ });
+ }
+ //서버 응답 처리
+ //응답으로 받은 userToken, getSharedPreference에 저장.
+ public void parseFromServer(String message, JsonObject result) {
+ if(message.equals("login success")) {
+
+
+ if(result.get("img_url").isJsonNull())
+ img_url = "DEFAULT :: profile_IMAGE";
+ else
+ img_url = result.get("img_url").getAsString();
+
+ userName = result.get("userName").getAsString();
+ userToken = result.get("token").getAsString();
+
+ Log.i("로그인시 받은 이미지 URL", img_url);
+
+ SharedPreferences pref = getSharedPreferences("pref_USERTOKEN", Context.MODE_PRIVATE);
+ SharedPreferences.Editor editor = pref.edit();
+
+
+ editor.putString("userToken", userToken);
+ editor.putString("userName", userName);
+ editor.putString("userEmail", userEmail);
+ editor.putString("img_url", img_url);
+ editor.apply();
+
+ Intent intent = new Intent(getApplicationContext(), MainActivity.class);
+ startActivityForResult(intent, CodeNumber.TO_MAIN_ACTIVITY);
+ }
+
+ else if(message.equals("wrong password")) {
+ Toast.makeText(getApplicationContext(), "사용자 정보가 일치 하지 않습니다", Toast.LENGTH_LONG).show();
+ }
+ else {
+ Toast.makeText(getApplicationContext(), "서버 연결 실패", Toast.LENGTH_LONG).show();
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/MainActivity.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/MainActivity.java
new file mode 100644
index 0000000..7eb85e9
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/MainActivity.java
@@ -0,0 +1,1086 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.Manifest;
+import android.app.Activity;
+import android.app.ProgressDialog;
+import android.content.ActivityNotFoundException;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.database.Cursor;
+import android.graphics.Color;
+import android.graphics.drawable.ShapeDrawable;
+import android.graphics.drawable.shapes.OvalShape;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Handler;
+import android.provider.MediaStore;
+import android.support.annotation.NonNull;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.content.ContextCompat;
+import android.support.v4.content.CursorLoader;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.View;
+import android.support.v7.app.AppCompatActivity;
+import android.view.ViewGroup;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
+import android.widget.Button;
+import android.widget.FrameLayout;
+import android.widget.ImageButton;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.koushikdutta.async.future.Future;
+import com.koushikdutta.async.future.FutureCallback;
+import com.koushikdutta.ion.Ion;
+import com.prolificinteractive.materialcalendarview.CalendarDay;
+import com.prolificinteractive.materialcalendarview.CalendarMode;
+import com.prolificinteractive.materialcalendarview.MaterialCalendarView;
+import com.prolificinteractive.materialcalendarview.OnDateSelectedListener;
+
+import java.io.File;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.concurrent.Executors;
+
+import static kr.ac.smu.cs.shalendar_java.CodeNumber.PICK_IMAGE_REQUEST;
+
+
+public class MainActivity extends AppCompatActivity implements View.OnClickListener {
+
+// ArrayList mainRecyclerList;
+
+ private TextView textViewTitle;
+ private TextView selectedDate;
+ private Button buttonToBoard;
+ private Button buttonToRegisterPlan;
+
+ //해당날짜 일정이 있나없나 확인 flag 없으면 0 있으면 1
+ private int dateFlag = 0;
+
+ //UserToken
+ private String userToken;
+
+ private String imageURL;
+
+ private ImageView imageView;
+
+ //static
+ public static int cid;
+ public static String calName;
+
+ //7-17
+ boolean isPageOpen = false;
+
+ Animation translateUpAnim;
+ Animation translateDownAnim;
+
+ LinearLayout main_animation;
+ LinearLayout calendarLinear;
+ FrameLayout calendarFrame;
+ RelativeLayout calendarRelative;
+
+ //js
+ private Context mContext = MainActivity.this;
+
+ private ViewGroup mainLayout; //사이드 나왔을때 클릭방지할 영역
+ private ViewGroup viewLayout; //전체 감싸는 영역
+ private ViewGroup sideLayout; //사이드바만 감싸는 영역
+ private ViewGroup calendarLayout; //달력레이아웃 부분
+ private ImageButton mainanidownarrow; //메인화면에서 애니메이션 닫는 이미지버튼
+
+ private Boolean isMenuShow = false;
+ private Boolean isExitFlag = false;
+
+ //materialCalendar
+ String time, kcal, menu;
+ private final OneDayDecorator oneDayDecorator = new OneDayDecorator();
+ MaterialCalendarView materialCalendarView;
+ Cursor cursor;
+
+
+ //통신
+ NetWorkUrl url = new NetWorkUrl();
+
+ //서버로 받은 것.
+ ArrayList schedList = new ArrayList<>();
+
+ //달력에 표시할 dot을 가지는 즉, 서버로 부터 응답받은 날짜들
+ //date에는 startDate와 endDate가 다를 경우, 사이의 date들도 가진다.
+ ArrayList dates = new ArrayList<>();
+
+ //dates ArrayList에서 시작 날짜 == 끝 날짜 시작 날짜 != 끝날짜 경계 index
+ public int boundary_index;
+
+ //달력에 점 찍을 data들
+ private HashMap map = new HashMap<>();
+
+ //startDate와 endDate를 String에서 CalendarDay형으로 바꾼다.
+ //이외의 schedList의 각 data들은 동일. 즉 나머지는 그냥 복사.
+ private ArrayList csdList = new ArrayList<>();
+
+
+ RecyclerView mainRecyclerView;
+
+ //달력 내부 사용자 이미지
+ ArrayList usersImage = new ArrayList<>();
+
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+
+
+ SharedPreferences pref = getSharedPreferences("pref_USERTOKEN", MODE_PRIVATE);
+ userToken = pref.getString("userToken", "NO_TOKEN");
+ Log.i("Main화면::넘겨받은 토큰", userToken);
+
+ //갤러리 접근 허용 체크.
+ checkPermissions();
+
+ textViewTitle = (TextView) findViewById(R.id.calendarNameTextView);
+ buttonToBoard = (Button) findViewById(R.id.main_toBoard_button);
+ selectedDate = (TextView) findViewById(R.id.TextView1);
+ buttonToRegisterPlan = (Button) findViewById(R.id.main_ToRegister_button);
+
+ //07-17
+ main_animation = findViewById(R.id.main_anipage);
+ calendarFrame = findViewById(R.id.calendarFrame);
+ calendarRelative = findViewById(R.id.main_relative);
+
+ //애니메이션
+ mainanidownarrow = findViewById(R.id.main_downarrow);
+
+ translateUpAnim = AnimationUtils.loadAnimation(this, R.anim.maintranslate_up);
+ translateDownAnim = AnimationUtils.loadAnimation(this, R.anim.maintranslate_down);
+
+ MainActivity.SlidingPageAnimationListner animListener = new MainActivity.SlidingPageAnimationListner();
+ translateUpAnim.setAnimationListener(animListener);
+ translateDownAnim.setAnimationListener(animListener);
+
+ //리사이클러 부분
+
+// mainRecyclerList=new ArrayList<>();
+
+
+ mainRecyclerView = (RecyclerView) findViewById(R.id.mainRecyclerview);
+// mainRecyclerView.setHasFixedSize(true);
+// MainPlanAdapter m_adapter = new MainPlanAdapter(mainRecyclerList,this);
+// mainRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayout.VERTICAL, false));
+// mainRecyclerView.setAdapter(m_adapter);
+
+ //JS
+ init();
+
+ //사이드바 설정
+ addSideView();
+
+
+ if (cid == 0) {
+ Toast.makeText(getApplicationContext(), "달력을 먼저 선택하세요~", Toast.LENGTH_LONG).show();
+ textViewTitle.setText("달력이름");
+// setContentView(R.layout.defualt_activity_main);
+ }
+
+ else {
+ textViewTitle.setText(MainActivity.calName);
+ //materialCalendar뷰 초기화
+ getUsersInCalendar();
+ initCalendarView();
+ //서버로 부터 해당 달력의 일정을 가져온다.
+ showAllSche();
+ //서버로 부터 받은 모든 일정을 달력에 표시
+ setCalendarView();
+
+ }
+
+ /*
+ MainActivity에서 BoardActivity로 넘어간다.
+ */
+ buttonToBoard.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (cid == 0) {
+ Toast.makeText(getApplicationContext(), "달력을 먼저 선택하세요~", Toast.LENGTH_LONG).show();
+ } else {
+ Intent intent = new Intent(getApplicationContext(), BoardActivity.class);
+ startActivityForResult(intent, CodeNumber.TO_BOARD_ACTIVITY);
+ }
+ }
+ });
+
+
+
+ /*
+ MainActivity에서 RegisterPlanActivity로 넘어간다.
+ */
+ buttonToRegisterPlan.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ if (cid == 0) {
+ Toast.makeText(getApplicationContext(), "달력을 먼저 선택하세요", Toast.LENGTH_LONG).show();
+ } else {
+ Intent intent = new Intent(getApplicationContext(), RegisterPlanActivity.class);
+ startActivityForResult(intent, CodeNumber.TO_REGISTERPLAN_ACTIVITY);
+ }
+ }
+ });
+
+ }
+
+
+ public void initCalendarView() {
+ materialCalendarView = (MaterialCalendarView) findViewById(R.id.calendarView);
+ materialCalendarView.setArrowColor(Color.parseColor("#ff6067"));
+ materialCalendarView.state().edit()
+ .setFirstDayOfWeek(Calendar.SUNDAY)
+ .setMinimumDate(CalendarDay.from(2017, 0, 1))
+ .setMaximumDate(CalendarDay.from(2020, 11, 31))
+ .setCalendarDisplayMode(CalendarMode.MONTHS)
+ .commit();
+
+ materialCalendarView.addDecorators(
+ new SundayDecorator(),
+ new SaturdayDecorator(),
+ oneDayDecorator);
+ }
+
+
+ public void setCalendarView() {
+
+ for (int i = 0; i < schedList.size(); i++) {
+ if (schedList.get(i).startDate.equals(schedList.get(i).endDate)) {
+ try {
+ String sameDate = schedList.get(i).startDate;
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d");
+ Date start = sdf.parse(sameDate);
+
+ CalendarDay day = CalendarDay.from(start);
+ dates.add(day);
+
+
+ CalendarScheduleData csd = new CalendarScheduleData();
+ csd.sche_title = schedList.get(i).sche_title;
+ csd.cid = schedList.get(i).cid;
+ csd.sid = schedList.get(i).sid;
+ csd.sche_content = schedList.get(i).sche_content;
+ csd.startDate = day;
+ csd.startTime = schedList.get(i).startTime;
+ csd.middleDate = day;
+ csd.endDate = day;
+ csd.endTime = schedList.get(i).endTime;
+ csd.area = schedList.get(i).area;
+ csd.numberofComment = schedList.get(i).numberofComment;
+
+ csdList.add(csd);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ }
+ }
+
+ //startDate == Enddate와 startDate != EndDate 경계 index값
+ boundary_index = dates.size();
+ Log.i("start와 end == 마지막index", Integer.toString(boundary_index));
+
+ for (int i = 0; i < schedList.size(); i++) {
+
+ if (!(schedList.get(i).startDate.equals(schedList.get(i).endDate))) {
+
+ try {
+ String s_date = schedList.get(i).startDate;
+ String e_date = schedList.get(i).endDate;
+
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d");
+ Date start = sdf.parse(s_date);
+ Date end = sdf.parse(e_date);
+
+
+ Date currentDate = start;
+ while (currentDate.compareTo(end) <= 0) {
+ CalendarDay day = CalendarDay.from(currentDate);
+ dates.add(day);
+
+ /////////////////////////////////////////////////
+ CalendarScheduleData csd = new CalendarScheduleData();
+ csd.sche_title = schedList.get(i).sche_title;
+ csd.cid = schedList.get(i).cid;
+ csd.sid = schedList.get(i).sid;
+ csd.sche_content = schedList.get(i).sche_content;
+ csd.startDate = CalendarDay.from(start);
+ csd.startTime = schedList.get(i).startTime;
+ csd.middleDate = day;
+ csd.endDate = CalendarDay.from(end);
+ csd.endTime = schedList.get(i).endTime;
+ csd.area = schedList.get(i).area;
+ csd.numberofComment = schedList.get(i).numberofComment;
+
+ csdList.add(csd);
+ //////////////////////////////////////////////////
+
+ Calendar c = Calendar.getInstance();
+ c.setTime(currentDate);
+ c.add(Calendar.DAY_OF_MONTH, 1);
+ currentDate = c.getTime();
+ }
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+
+ Log.i("들어있는 date", dates.toString());
+
+ Log.i("csdList Size()", Integer.toString(csdList.size()));
+
+ for (int i = 0; i < csdList.size(); i++) {
+ Log.i("scheTitle", csdList.get(i).sche_title);
+ Log.i("startDate", csdList.get(i).startDate.toString());
+ Log.i("middleDate", csdList.get(i).middleDate.toString());
+ Log.i("endDate", csdList.get(i).endDate.toString());
+ Log.i("sid", Integer.toString(csdList.get(i).sid));
+ Log.i("cid", Integer.toString(csdList.get(i).cid));
+ }
+
+
+ new ApiSimulator().executeOnExecutor(Executors.newSingleThreadExecutor());
+
+
+ //////////////////////////////////////////////////////////////////////////////////////////////////////////
+ materialCalendarView.setOnDateChangedListener(new OnDateSelectedListener() {
+
+ @Override
+ public void onDateSelected(@NonNull MaterialCalendarView widget, @NonNull CalendarDay date, boolean selected) {
+ int Year = date.getYear();
+ int Month = date.getMonth() + 1;
+ int Day = date.getDay();
+
+ Log.i("Year test", Year + "");
+ Log.i("Month test", Month + "");
+ Log.i("Day test", Day + "");
+
+
+ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+ Date formatDate = date.getDate();
+ String selectionDate = format.format(formatDate);
+
+ Calendar c = Calendar.getInstance();
+ c.setTime(formatDate);
+ int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
+
+ String day = Global.getDayOfWeek(dayOfWeek);
+
+
+ Log.i("shot_Day test", selectionDate + "" + day);
+// materialCalendarView.clearSelection();
+
+
+ insertData(date);
+ ///////애니메이션 구현
+
+
+ Toast.makeText(getApplicationContext(), selectionDate, Toast.LENGTH_SHORT).show();
+
+ if (!isPageOpen && dateFlag == 1) {
+ main_animation.setVisibility(View.VISIBLE);
+ main_animation.startAnimation(translateUpAnim);
+
+ } else {
+ Toast.makeText(getApplicationContext(), "해당일에는 일정이 없습니다.", Toast.LENGTH_SHORT).show();
+ main_animation.setVisibility(View.INVISIBLE);
+ isPageOpen = false;
+ }
+
+ mainanidownarrow.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ main_animation.setVisibility(View.INVISIBLE);
+ //Toast.makeText(getApplicationContext(), "열림", Toast.LENGTH_SHORT).show();
+ main_animation.startAnimation(translateDownAnim);
+ }
+ });
+
+
+ //TextView에 삽입
+ selectedDate.setText(selectionDate);
+ materialCalendarView.clearSelection();
+
+
+ }
+ });
+ }
+
+
+ public void insertData(CalendarDay date) {
+
+ ArrayList mainRecyclerList = new ArrayList<>();
+ mainRecyclerView.setHasFixedSize(true);
+ MainPlanAdapter m_adapter = new MainPlanAdapter(mainRecyclerList, this);
+ mainRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayout.VERTICAL, false));
+ mainRecyclerView.setAdapter(m_adapter);
+
+ Log.i("insertDate()csdListSize", Integer.toString(csdList.size()));
+
+ ArrayList shotDayList = new ArrayList<>();
+ int animationItemCount = 0;
+ for (int i = 0; i < csdList.size(); i++) {
+ if (date.equals(csdList.get(i).middleDate)) {
+ CalendarScheduleData csd = new CalendarScheduleData();
+
+ csd.sche_title = csdList.get(i).sche_title;
+ csd.startDate = csdList.get(i).startDate;
+ csd.middleDate = csdList.get(i).middleDate;
+ csd.startTime = csdList.get(i).startTime;
+ csd.endDate = csdList.get(i).endDate;
+ csd.endTime = csdList.get(i).endTime;
+ csd.sid = csdList.get(i).sid;
+ shotDayList.add(csd);
+ animationItemCount++;//일정갯수
+ }
+ }
+
+ if (shotDayList.size() == 0) {
+ //일정이 없다는 뜻
+ dateFlag = 0;
+ } else {
+ dateFlag = 1;
+ }
+
+ for (int i = 0; i < animationItemCount; i++) {
+ MainPlanItem mitem = new MainPlanItem();
+
+ String startDate = calendarDayToStringFormat(shotDayList.get(i).startDate);
+ String endDate = calendarDayToStringFormat(shotDayList.get(i).endDate);
+
+ String d_day = getDday(shotDayList.get(i).middleDate, shotDayList.get(i).endDate);
+
+ mitem.setMainPlanname(shotDayList.get(i).sche_title);
+
+
+ if (startDate.equals(endDate)) {
+ mitem.setMainPlantime(startDate);
+ mitem.setMainPlanDday("");
+ } else {
+ mitem.setMainPlantime(startDate + " ~ " + endDate);
+ mitem.setMainPlanDday(d_day);
+ }
+ mitem.setSid(shotDayList.get(i).sid);
+
+
+ ///////////////////////////////////////////////////////////
+ ArrayList mtItem = new ArrayList<>();
+ for (int j = 0; j < usersImage.size(); j++) {
+ mtItem.add(new MainPlanTeamIteam(usersImage.get(j)));
+ }
+ ///////////////////////////////////////////////////////////
+
+ mitem.setTeamPicList(mtItem);
+ mainRecyclerList.add(mitem);
+ }
+
+ }
+
+ public void getUsersInCalendar() {
+
+ JsonObject json = new JsonObject();
+ Log.i("사용자 main", Integer.toString(cid));
+ Log.i("사용자 main", userToken);
+
+ json.addProperty("cid", cid);
+
+ Future ion = Ion.with(getApplicationContext())
+ .load("POST", url.getServerUrl() + "/readUserCal")
+ .setHeader("Content-Type", "application/json")
+ .setHeader("Authorization", userToken)
+ .setJsonObjectBody(json)
+ .asJsonObject()
+ .setCallback(new FutureCallback() {
+ @Override
+ public void onCompleted(Exception e, JsonObject result) {
+
+ if(e != null)
+ Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
+ else {
+ String message = result.get("message").getAsString();
+ Log.i("Main공유달력 사용자 명수", message);
+
+ if(message.equals("success")) {
+ JsonArray data = result.get("data").getAsJsonArray();
+
+ Log.i("Main공유달력 사용자 명수", Integer.toString(data.size()));
+ for(int i = 0; i> {
+
+ @Override
+ protected List doInBackground(@NonNull Void... voids) {
+
+ try {
+ Thread.sleep(500);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+
+ //dates ArrayList에 사용자 지정 날짜들이 들어있다. 2019-7-8형식.
+ Log.d("들어있는 Date", dates.toString());
+ return dates;
+ }
+
+
+ @Override
+ protected void onPostExecute(@NonNull List calendarDays) {
+ super.onPostExecute(calendarDays);
+
+ if (isFinishing()) {
+ return;
+ }
+
+ ArrayList tempDateList = (ArrayList) calendarDays;
+// HashMap map = new HashMap<>();
+
+ for (int i = 0; i < tempDateList.size(); i++) {
+ CalendarDay i_date = tempDateList.get(i);
+ int duplicate_count = 1;
+
+ for (int j = i + 1; j < tempDateList.size(); j++) {
+ CalendarDay j_date = tempDateList.get(j);
+ if (i_date.equals(j_date))
+ duplicate_count++;
+ }
+
+ if (!map.containsKey(i_date))
+ map.put(i_date, duplicate_count);
+
+ Log.i(i_date.toString(), " :: " + Integer.toString(duplicate_count));
+ }
+
+
+ EventDecorator event, event2, event3;
+
+ for (CalendarDay key : map.keySet()) {
+ Log.i("MAP", "key : " + key.toString() + "Value : " + map.get(key));
+
+ ArrayList dateList = new ArrayList<>();
+ int duplicateDateCount = map.get(key);
+
+ if (duplicateDateCount == 1) {
+ dateList.add(key);
+ event = new EventDecorator(1, Color.parseColor("#ff6067"), dateList, MainActivity.this);
+ materialCalendarView.addDecorator(event);
+ } else if (duplicateDateCount == 2) {
+ dateList.add(key);
+ event = new EventDecorator(1, Color.parseColor("#ff6067"), dateList, MainActivity.this);
+ event2 = new EventDecorator(2, Color.parseColor("#f8c930"), dateList, MainActivity.this);
+ materialCalendarView.addDecorator(event);
+ materialCalendarView.addDecorator(event2);
+ } else if (duplicateDateCount >= 3) {
+ dateList.add(key);
+ event = new EventDecorator(1, Color.parseColor("#ff6067"), dateList, MainActivity.this);
+ event2 = new EventDecorator(2, Color.parseColor("#f8c930"), dateList, MainActivity.this);
+ event3 = new EventDecorator(3, Color.parseColor("#cdcdcd"), dateList, MainActivity.this);
+ materialCalendarView.addDecorator(event);
+ materialCalendarView.addDecorator(event2);
+ materialCalendarView.addDecorator(event3);
+ } else {
+ Toast.makeText(getApplicationContext(), "No Event", Toast.LENGTH_LONG).show();
+ }
+ }
+ }
+ }
+
+ private void init() {
+
+ findViewById(R.id.btn_menu).setOnClickListener(this);
+ findViewById(R.id.btn_search).setOnClickListener(this);
+
+ mainLayout = findViewById(R.id.id_main);
+ viewLayout = findViewById(R.id.fl_silde);
+ sideLayout = findViewById(R.id.view_sildebar);
+ calendarLayout = findViewById(R.id.calendarFrame);
+ }
+
+ private void addSideView() {
+
+ final Sidebar sidebar = new Sidebar(mContext);
+ sideLayout.addView(sidebar);
+ //sidebar.setUserID(userName);
+
+ viewLayout.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+
+ }
+ });
+
+ sidebar.setEventListener(new Sidebar.EventListener() {
+
+ @Override
+ public void btnCancel() {
+ closeMenu();
+ }
+
+ @Override
+ public void btnLevel1() {
+ Intent intent2 = new Intent(getApplicationContext(), NoticeActivity.class);
+ startActivityForResult(intent2, CodeNumber.TO_NOTICE_ACTIVITY);
+ }
+
+ @Override
+ public void btnLevel2() {
+ Intent intent2 = new Intent(getApplicationContext(), SettingActivity.class);
+ startActivityForResult(intent2, CodeNumber.TO_SETTING_ACTIVITY);
+ }
+
+ @Override
+ public void btnLevel3() {
+ Intent intent2 = new Intent(getApplicationContext(), CreateCalendarActivity.class);
+ //캘린더 생성 코드
+ intent2.putExtra("where", 88888);
+ startActivityForResult(intent2, CodeNumber.TO_CREATE_CALENDAR_ACTIVITY);
+ }
+
+ @Override
+ public void btnInvited() {
+ Intent intent2 = new Intent(getApplicationContext(), WaitInvite.class);
+ startActivityForResult(intent2, CodeNumber.TO_WAITINVITEACTIVITY);
+ }
+
+ @Override
+ public void image_profile() {
+ getPictureFromGallery();
+ }
+
+ });
+ }
+
+ private void getPictureFromGallery() {
+ Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
+ intent.setType("image/jpg");
+ try {
+ startActivityForResult(intent, PICK_IMAGE_REQUEST);
+ } catch (ActivityNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ /*
+ 폰에서 사진을 지정하면 해당 사진 주소를 가져온다.
+ */
+ private String getPathFromURI(Uri contentUri) {
+ String[] proj = {MediaStore.Images.Media.DATA};
+ Log.d("여기까지", "ㅇ5");
+ CursorLoader loader = new CursorLoader(getApplicationContext(), contentUri, proj, null, null, null);
+ Cursor cursor = loader.loadInBackground();
+ int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
+ cursor.moveToFirst();
+ Log.d("여기까지", "ㅇ6");
+
+ return cursor.getString(column_index);
+ }
+
+
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+
+ try {
+ switch (requestCode) {
+ //사진등록
+ case PICK_IMAGE_REQUEST:
+ if (resultCode == RESULT_OK) {
+ imageURL = getPathFromURI(data.getData());
+ Log.d("사진 경로", imageURL);
+ imageView = findViewById(R.id.image_profile);
+ //Request to Server.
+ setUserProfileImage_Server(imageURL);
+
+ SharedPreferences pref = getSharedPreferences("pref_USERTOKEN", MODE_PRIVATE);
+ SharedPreferences.Editor editor = pref.edit();
+ editor.putString("img_url", imageURL);
+ editor.commit();
+ }
+ }
+
+ } catch (Exception e) {
+ Toast.makeText(this, "오류가 있습니다.", Toast.LENGTH_LONG).show();
+ e.printStackTrace();
+ }
+ }
+
+
+ /*
+ 사진 지정 후 서버와 통신 하는 메소드.
+ 서버에서 success받으면
+ imageView에 set한다.
+ */
+ public void setUserProfileImage_Server(final String imageUrl) {
+
+ Log.i("프로필 변경", userToken);
+ File file = new File(imageUrl);
+
+ final ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
+ progressDialog.setMessage("프로필 사진 등록 중 입니다~");
+ progressDialog.setProgressStyle(progressDialog.STYLE_SPINNER);
+ progressDialog.show();
+
+ Ion.with(this)
+ .load("POST", url.getServerUrl() + "/imageChange")
+ //.setHeader("Content-Type", "application/json")
+ .setHeader("Authorization", userToken)
+ .progressDialog(progressDialog)
+ .setMultipartFile("file", file)
+ //응답
+ .asJsonObject()
+ .setCallback(new FutureCallback() {
+ @Override
+ public void onCompleted(Exception e, JsonObject result) {
+
+ if (e != null) {
+ Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
+ } else {
+ String message = result.get("message").getAsString();
+
+ if (message.equals("image change success")) {
+ Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
+
+ imageView.setBackground(new ShapeDrawable(new OvalShape()));
+ if (Build.VERSION.SDK_INT >= 21) {
+ imageView.setClipToOutline(true);
+ }
+
+ Ion.with(imageView)
+ .centerCrop()
+ .resize(250, 250)
+ .load(imageUrl);
+
+ progressDialog.dismiss();
+ } else {
+ Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
+ }
+ }
+ }
+ });
+ }
+
+
+ private void checkPermissions() {
+ if (ContextCompat.checkSelfPermission(this,
+ Manifest.permission.READ_EXTERNAL_STORAGE)
+ != PackageManager.PERMISSION_GRANTED ||
+ ContextCompat.checkSelfPermission(this,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE)
+ != PackageManager.PERMISSION_GRANTED) {
+
+ ActivityCompat.requestPermissions(this,
+ new String[]{
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE
+ },
+ 1052);
+ }
+ }
+
+ public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
+ switch (requestCode) {
+ case 1052: {
+ // If request is cancelled, the result arrays are empty.
+ if (grantResults.length > 0
+ && grantResults[0] == PackageManager.PERMISSION_GRANTED
+ && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
+ // permission was granted.
+ } else {
+ // Permission denied - Show a message to inform the user that this app only works
+ // with these permissions granted
+ }
+ return;
+ }
+ }
+ }
+
+
+ public void closeMenu() {
+
+ isMenuShow = false;
+ Animation slide = AnimationUtils.loadAnimation(mContext, R.anim.siderbar_hidden);
+ sideLayout.startAnimation(slide);
+ new Handler().postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ viewLayout.setVisibility(View.GONE);
+ viewLayout.setEnabled(false);
+ mainLayout.setEnabled(true);
+ }
+ }, 450);
+ }
+
+ public void showMenu() {
+
+ isMenuShow = true;
+ Animation slide = AnimationUtils.loadAnimation(this, R.anim.sidebar_show);
+ sideLayout.startAnimation(slide);
+ viewLayout.setVisibility(View.VISIBLE);
+ viewLayout.setEnabled(true);
+ mainLayout.setEnabled(false);
+ }
+
+
+ @Override
+ public void onClick(View view) {
+ switch (view.getId()) {
+
+ case R.id.btn_menu:
+ showMenu();
+ break;
+ case R.id.btn_search:
+ if(cid == 0) {
+ Toast.makeText(getApplicationContext(), "달력을 먼저 선택하세요~", Toast.LENGTH_LONG).show();
+ }
+ else {
+ Intent intent2 = new Intent(getApplicationContext(), SearchPlanActivity.class);
+ startActivity(intent2);
+ }
+ break;
+ }
+ }
+
+
+ @Override
+ public boolean onKeyDown(int keyCode, KeyEvent event) {
+
+ if (keyCode == KeyEvent.KEYCODE_BACK) {
+ onBackPressed();
+ return true;
+ }
+ return super.onKeyDown(keyCode, event);
+ }
+
+ @Override
+ public void onBackPressed() {
+ if (isMenuShow) {
+ closeMenu();
+ } else {
+
+ if (isExitFlag) {
+ finish();
+ } else {
+
+ isExitFlag = true;
+ Toast.makeText(this, "뒤로가기를 한번더 누르시면 앱이 종료됩니다.", Toast.LENGTH_SHORT).show();
+ new Handler().postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ isExitFlag = false;
+ }
+ }, 2000);
+ }
+ }
+ }
+
+
+ public void showAllSche() {
+
+ Ion.getDefault(this).configure().setLogging("ion-sample", Log.DEBUG);
+ Ion.getDefault(this).getConscryptMiddleware().enable(false);
+
+ final ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
+ progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
+ progressDialog.setMessage("잠시만 기다려주세요. 해당 일정을 가져오는 중 입니다~");
+ progressDialog.show();
+
+ JsonObject json = new JsonObject();
+
+
+ //////////////////////////////////////////////////////////////////////
+ json.addProperty("cid", cid);
+ //////////////////////////////////////////////////////////////////////
+
+
+ Future ion = Ion.with(getApplicationContext())
+ .load("POST", url.getServerUrl() + "/showAllSche")
+ .setHeader("Content-Type", "application/json")
+ .setJsonObjectBody(json)
+ .asJsonObject()
+ .setCallback(new FutureCallback() {
+ @Override
+ public void onCompleted(Exception e, JsonObject result) {
+
+
+ if (e != null) {
+ Toast.makeText(getApplicationContext(), "Server Connection Error", Toast.LENGTH_LONG).show();
+ } else {
+ progressDialog.dismiss();
+
+ String message = result.get("message").getAsString();
+ if (message.equals("success")) {
+ JsonArray data = result.get("data").getAsJsonArray();
+
+ Log.i("들어있는 일정 개수", Integer.toString(data.size()));
+
+ String[] dateTime;
+ for (int i = 0; i < data.size(); i++) {
+ JsonObject sched_data = data.get(i).getAsJsonObject();
+
+ ScheduleData scheduleData = new ScheduleData();
+
+ scheduleData.sche_title = sched_data.get("title").getAsString();
+ scheduleData.cid = sched_data.get("cid").getAsInt();
+ scheduleData.sid = sched_data.get("sid").getAsInt();
+ scheduleData.sche_content = sched_data.get("sContent").getAsString();
+
+ String startDateTime = sched_data.get("startDate").getAsString();
+ dateTime = parseDateAndTime(startDateTime);
+ scheduleData.startDate = dateTime[0];
+ scheduleData.startTime = dateTime[1];
+
+ String endDateTime = sched_data.get("endDate").getAsString();
+ dateTime = parseDateAndTime(endDateTime);
+ scheduleData.endDate = dateTime[0];
+ scheduleData.endTime = dateTime[1];
+
+ scheduleData.area = sched_data.get("area").getAsString();
+ scheduleData.numberofComment = sched_data.get("numOfComments").getAsInt();
+
+ schedList.add(scheduleData);
+
+ }
+
+ } else {
+ Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
+ }
+ }
+ }
+
+ public String[] parseDateAndTime(String date) {
+
+ String[] parseData = date.split(" ");
+ String[] result = new String[parseData.length];
+
+ for (int i = 0; i < parseData.length; i++) {
+ Log.i("들어있는 값", parseData[i]);
+ }
+ result[0] = parseData[0].trim();
+ result[1] = parseData[1].substring(0, 5).trim();
+
+ return result;
+ }
+ });
+
+ try {
+ ion.get();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+}
+
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/MainPlanAdapter.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/MainPlanAdapter.java
new file mode 100644
index 0000000..3deacc7
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/MainPlanAdapter.java
@@ -0,0 +1,126 @@
+package kr.ac.smu.cs.shalendar_java;
+import android.app.ProgressDialog;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Color;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.google.gson.JsonObject;
+import com.koushikdutta.async.future.FutureCallback;
+import com.koushikdutta.ion.Ion;
+
+import java.util.ArrayList;
+
+public class MainPlanAdapter extends RecyclerView.Adapter {
+
+ private Context mContext;
+ private ArrayList mainPlanList;
+
+ public MainPlanAdapter(ArrayList mainPlanList, Context mContext) {
+ this.mainPlanList = mainPlanList;
+ this.mContext = mContext;
+ }
+
+ @Override
+ public ItemRowHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.main_recycleritem, null);
+ ItemRowHolder mh = new ItemRowHolder(v);
+ return mh;
+ }
+
+ @Override
+ public void onBindViewHolder(MainPlanAdapter.ItemRowHolder holder, int position) {
+
+ String planName = mainPlanList.get(position).getMainPlanname();
+ String planTime = mainPlanList.get(position).getMainPlantime();
+ String planDday = mainPlanList.get(position).getMainPlanDday();
+ ArrayList picList = mainPlanList.get(position).getTeamPicList();
+
+ holder.main_planname.setText(planName);
+ holder.main_plantime.setText(planTime);
+ holder.main_planDday.setText(planDday);
+
+
+ if(position % 3 == 0) {
+ holder.linearLayout.setBackgroundColor(Color.parseColor("#ff6067"));
+ }
+
+ else if(position % 3 == 1) {
+ holder.linearLayout.setBackgroundColor(Color.parseColor("#f8c930"));
+ }
+
+ else if(position % 3 == 2) {
+ holder.linearLayout.setBackgroundColor(Color.parseColor("#cdcdcd"));
+ }
+
+
+ MainPlanTeamAdapter mt_adapter = new MainPlanTeamAdapter(picList, mContext);
+
+ holder.mainteam_recyclerView.setHasFixedSize(true);
+ holder.mainteam_recyclerView.setLayoutManager(new LinearLayoutManager(mContext, LinearLayout.HORIZONTAL, false));
+ holder.mainteam_recyclerView.setAdapter(mt_adapter);
+
+ }
+
+ @Override
+ public int getItemCount() {
+ return (null != mainPlanList ? mainPlanList.size() : 0);
+ }
+
+
+ public class ItemRowHolder extends RecyclerView.ViewHolder {
+
+
+ protected TextView main_planname;
+ protected TextView main_plantime;
+ protected TextView main_planDday;
+ protected LinearLayout linearLayout;
+ protected RecyclerView mainteam_recyclerView;
+ protected NetWorkUrl url;
+
+
+ public ItemRowHolder(final View itemView) {
+ super(itemView);
+
+ this.url = new NetWorkUrl();
+ this.mainteam_recyclerView = itemView.findViewById(R.id.mainteam_recyclerView);
+ this.main_planname = itemView.findViewById(R.id.main_planname);
+ this.main_plantime = itemView.findViewById(R.id.main_plantime);
+ this.main_planDday = itemView.findViewById(R.id.main_planDday);
+ this.linearLayout = itemView.findViewById(R.id.linearLayout_color);
+
+ itemView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Toast.makeText(v.getContext(), main_planname.getText(), Toast.LENGTH_SHORT).show();
+
+// sid오류
+ Global.setSid(mainPlanList.get(getAdapterPosition()).getSid());
+ Log.d("어댑터sid","sid는"+Global.getSid());
+
+ JsonObject json = new JsonObject();
+
+ json.addProperty("sid", Global.getSid());
+
+ final ProgressDialog progressDialog = new ProgressDialog(itemView.getContext());
+ progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
+ progressDialog.setMessage("해당 댓글로 이동중~" + mainPlanList.get(getAdapterPosition()).getSid());
+ progressDialog.show();
+
+
+ Global global = new Global();
+ global.netWork_ShowSche(itemView.getContext(), progressDialog, json, url);
+
+ }
+ });
+ }
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/MainPlanItem.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/MainPlanItem.java
new file mode 100644
index 0000000..830e1fe
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/MainPlanItem.java
@@ -0,0 +1,64 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.widget.TextView;
+
+import java.util.ArrayList;
+
+public class MainPlanItem {
+
+ String mainPlanname;
+ String mainPlantime;
+ String mainPlanDday;
+ int sid;
+
+ private ArrayList teamPicList;
+
+ public MainPlanItem() {
+ }
+
+ public MainPlanItem(String mainPlanname, String mainPlantime, ArrayList teamPicList) {
+ this.mainPlanname = mainPlanname;
+ this.mainPlantime = mainPlantime;
+ this.teamPicList = teamPicList;
+ }
+
+ public String getMainPlanname() {
+ return mainPlanname;
+ }
+
+ public void setMainPlanname(String mainPlanname) {
+ this.mainPlanname = mainPlanname;
+ }
+
+ public String getMainPlantime() {
+ return mainPlantime;
+ }
+
+ public void setMainPlantime(String mainPlantime) {
+ this.mainPlantime = mainPlantime;
+ }
+
+ public String getMainPlanDday() {
+ return this.mainPlanDday;
+ }
+
+ public void setMainPlanDday(String mainPlanDday) {
+ this.mainPlanDday = mainPlanDday;
+ }
+
+ public int getSid() {
+ return this.sid;
+ }
+
+ public void setSid(int sid) {
+ this.sid = sid;
+ }
+
+ public ArrayList getTeamPicList() {
+ return teamPicList;
+ }
+
+ public void setTeamPicList(ArrayList teamPicList) {
+ this.teamPicList = teamPicList;
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/MainPlanTeamAdapter.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/MainPlanTeamAdapter.java
new file mode 100644
index 0000000..7301037
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/MainPlanTeamAdapter.java
@@ -0,0 +1,70 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.content.Context;
+import android.graphics.drawable.GradientDrawable;
+import android.graphics.drawable.ShapeDrawable;
+import android.graphics.drawable.shapes.OvalShape;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+
+import com.koushikdutta.ion.Ion;
+
+import java.util.ArrayList;
+
+public class MainPlanTeamAdapter extends RecyclerView.Adapter {
+
+ private ArrayList teamList;
+ private Context mContext;
+
+ public MainPlanTeamAdapter(ArrayList teamList, Context mContext) {
+ this.teamList = teamList;
+ this.mContext = mContext;
+ }
+
+ @Override
+ public TeamItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.main_teamrecycleritem, null);
+ TeamItemHolder th = new TeamItemHolder(v);
+ return th;
+ }
+
+ @Override
+ public void onBindViewHolder(TeamItemHolder holder, int position) {
+ MainPlanTeamIteam teamIteam = teamList.get(position);
+// holder.teammatePic.setImageResource(teamIteam.getTeammatePic());
+
+ if(teamIteam.getTeammatePic().equals("DEFAULT :: profile_IMAGE"))
+ holder.teammatePic.setImageResource(R.drawable.profile_default);
+ else {
+ Ion.with(holder.teammatePic)
+ .centerCrop()
+ .resize(50,50)
+ .load(teamIteam.getTeammatePic());
+ holder.teammatePic.setBackground(new ShapeDrawable(new OvalShape()));
+ holder.teammatePic.setClipToOutline(true);
+
+ }
+
+ }
+
+ @Override
+ public int getItemCount() {
+ return (null != teamList ? teamList.size() : 0);
+ }
+
+ public class TeamItemHolder extends RecyclerView.ViewHolder {
+
+ protected ImageView teammatePic;
+
+ public TeamItemHolder(View itemView) {
+ super(itemView);
+
+ this.teammatePic = (ImageView) itemView.findViewById(R.id.main_teammateImage);
+
+ }
+ }
+
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/MainPlanTeamIteam.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/MainPlanTeamIteam.java
new file mode 100644
index 0000000..606dc53
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/MainPlanTeamIteam.java
@@ -0,0 +1,22 @@
+package kr.ac.smu.cs.shalendar_java;
+
+public class MainPlanTeamIteam {
+
+ private String teammatePic;
+
+ public MainPlanTeamIteam() {
+
+ }
+
+ public MainPlanTeamIteam(String teammatePic) {
+ this.teammatePic = teammatePic;
+ }
+
+ public String getTeammatePic() {
+ return teammatePic;
+ }
+
+ public void setTeammatePic(String teammatePic) {
+ this.teammatePic = teammatePic;
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/MyFireBaseMessagingService.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/MyFireBaseMessagingService.java
new file mode 100644
index 0000000..f918068
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/MyFireBaseMessagingService.java
@@ -0,0 +1,121 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.media.RingtoneManager;
+import android.net.Uri;
+import android.os.Build;
+import android.support.v4.app.NotificationCompat;
+import android.util.Log;
+
+import com.google.firebase.messaging.FirebaseMessagingService;
+import com.google.firebase.messaging.RemoteMessage;
+
+import java.util.Map;
+
+public class MyFireBaseMessagingService extends FirebaseMessagingService {
+
+ private static final String TAG = "FMS";
+
+ public MyFireBaseMessagingService() {
+
+ }
+
+ @Override
+ public void onNewToken(String token) {
+ super.onNewToken(token);
+ Log.d(TAG, "newToken() called: " + token);
+ }
+
+
+ @Override
+ public void onMessageReceived(RemoteMessage remoteMessage) {
+
+ //data payload가 있으면 foreground
+ if(remoteMessage.getData().size() > 0) {
+ sendNotification(remoteMessage.getData());
+ }
+
+
+ //data notification이면 background
+ if(remoteMessage.getNotification() != null) {
+ sendNotification(remoteMessage.getNotification().getBody());
+ }
+ }
+
+
+
+ //ForeGround 처리
+ private void sendNotification(Map data) {
+
+ Intent intent = new Intent(this, LoginActivity.class);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+
+ //push로 받은 data를 그대로 다시 intent에 넣는다.
+ if(data != null && data.size() > 0) {
+ for(String key:data.keySet()) {
+ intent.putExtra(key, data.get(key));
+ }
+ }
+
+ PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
+ String channelID = getString(R.string.default_datapayload_channel_id);
+
+ Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
+
+ NotificationCompat.Builder notificationBuilder =
+ new NotificationCompat.Builder(this, channelID)
+ .setSmallIcon(R.mipmap.ic_launcher)
+ .setContentTitle("Shalendar")
+ .setAutoCancel(true)
+ .setSound(defaultSoundUri)
+ .setContentIntent(pendingIntent);
+
+ NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
+
+ if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ String channelName = getString(R.string.default_datapayload_channel_id);
+ NotificationChannel channel = new NotificationChannel(channelID, channelName, NotificationManager.IMPORTANCE_HIGH);
+ notificationManager.createNotificationChannel(channel);
+
+ }
+
+ notificationManager.notify(0, notificationBuilder.build());
+ }
+
+ //backGround 처리
+ private void sendNotification(String messageBody) {
+
+ Intent intent = new Intent(this, LoginActivity.class);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
+
+
+ String channelID = getString(R.string.default_notification_channel_id);
+
+ Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
+
+ NotificationCompat.Builder notificationBuilder =
+ new NotificationCompat.Builder(this, channelID)
+ .setSmallIcon(R.mipmap.ic_launcher)
+ .setContentTitle("Shalendar")
+ .setContentText(messageBody)
+ .setAutoCancel(true)
+ .setSound(defaultSoundUri)
+ .setContentIntent(pendingIntent);
+
+ NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
+
+ if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ String channelName = getString(R.string.default_notification_channel_id);
+ NotificationChannel channel = new NotificationChannel(channelID, channelName, NotificationManager.IMPORTANCE_HIGH);
+ notificationManager.createNotificationChannel(channel);
+
+ }
+
+ notificationManager.notify(0, notificationBuilder.build());
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/NetWorkUrl.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/NetWorkUrl.java
new file mode 100644
index 0000000..bd6338c
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/NetWorkUrl.java
@@ -0,0 +1,18 @@
+package kr.ac.smu.cs.shalendar_java;
+/*
+ 서버 URL이 매일 바뀌니
+ 여기서 toServerUrl 멤버변수만 바꾸면 됨
+ 각 Activity에서 통신 할 때는 getServerUrl()호출하여 해당 경로 더 붙여줘야
+
+ ex)
+ CreateMember(회원 가입) Activity에서는
+ 통신 URL :: getServerUrl() + /signup
+ */
+public class NetWorkUrl {
+
+ private String toServer_URL = "https://91dbe0f6.ngrok.io/MIND";
+
+ public String getServerUrl() {
+ return this.toServer_URL;
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/NoticeActivity.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/NoticeActivity.java
new file mode 100644
index 0000000..5695665
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/NoticeActivity.java
@@ -0,0 +1,186 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.support.design.widget.TabLayout;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentPagerAdapter;
+import android.support.v4.app.ListFragment;
+import android.support.v4.view.ViewPager;
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageButton;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.ms.square.android.expandabletextview.ExpandableTextView;
+
+/*
+ 공지사항 액티비티
+
+ */
+
+public class NoticeActivity extends AppCompatActivity {
+
+ private static final String POSITION = "POSITION";
+ ImageButton backButton;
+ /**
+ * The {@link android.support.v4.view.PagerAdapter} that will provide
+ * fragments for each of the sections. We use a
+ * {@link FragmentPagerAdapter} derivative, which will keep every
+ * loaded fragment in memory. If this becomes too memory intensive, it
+ * may be best to switch to a
+ * {@link android.support.v4.app.FragmentStatePagerAdapter}.
+ */
+ private SectionsPagerAdapter mSectionsPagerAdapter;
+
+ /**
+ * The {@link ViewPager} that will host the section contents.
+ */
+ private ViewPager mViewPager;
+
+ private TabLayout mTabLayout;
+
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_notice);
+
+
+ backButton = findViewById(R.id.btn_back);
+ backButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ onBackPressed();
+ }
+ });
+
+
+ // Create the adapter that will return a fragment for each of the three
+ // primary sections of the activity.
+ mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
+
+ // Set up the ViewPager with the sections adapter.
+ mViewPager = (ViewPager) findViewById(R.id.container);
+ mViewPager.setAdapter(mSectionsPagerAdapter);
+
+ mTabLayout = (TabLayout) findViewById(R.id.tabs);
+ mTabLayout.setupWithViewPager(mViewPager);
+ setupTabLayout(mTabLayout);
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ // Inflate the menu; this adds items to the action bar if it is present.
+ getMenuInflater().inflate(R.menu.demo, menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ // Handle action bar item clicks here. The action bar will
+ // automatically handle clicks on the Home/Up button, so long
+ // as you specify a parent activity in AndroidManifest.xml.
+ int id = item.getItemId();
+ if (id == R.id.action_settings) {
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ private void setupTabLayout(TabLayout tabLayout) {
+ tabLayout.setTabMode(TabLayout.MODE_FIXED);
+ tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
+ tabLayout.setupWithViewPager(mViewPager);
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putInt(POSITION, mTabLayout.getSelectedTabPosition());
+ }
+
+ @Override
+ protected void onRestoreInstanceState(Bundle savedInstanceState) {
+ super.onRestoreInstanceState(savedInstanceState);
+ mViewPager.setCurrentItem(savedInstanceState.getInt(POSITION));
+ }
+
+ /**
+ * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
+ * one of the sections/tabs/pages.
+ */
+ class SectionsPagerAdapter extends FragmentPagerAdapter {
+
+ public SectionsPagerAdapter(FragmentManager fm) {
+ super(fm);
+ }
+
+ @Override
+ public Fragment getItem(int position) {
+ if (position == 0) {
+ return new LicenseFragment();
+ } else {
+ return new QuestionsFragment();
+ }
+ }
+
+ @Override
+ public int getCount() {
+ return 2;
+ }
+
+ @Override
+ public CharSequence getPageTitle(int position) {
+ switch (position) {
+ case 0:
+ return getString(R.string.title_license);
+ case 1:
+ return getString(R.string.title_questions);
+ }
+ return null;
+ }
+ }
+
+ public static class LicenseFragment extends Fragment {
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View rootView = inflater.inflate(R.layout.fragment_license, container, false);
+
+ ((TextView) rootView.findViewById(R.id.sample1).findViewById(R.id.title)).setText("버전 정보");
+ ((TextView) rootView.findViewById(R.id.sample2).findViewById(R.id.title)).setText("개발자 정보");
+
+ ExpandableTextView expTv1 = (ExpandableTextView) rootView.findViewById(R.id.sample1)
+ .findViewById(R.id.expand_text_view);
+ ExpandableTextView expTv2 = (ExpandableTextView) rootView.findViewById(R.id.sample2)
+ .findViewById(R.id.expand_text_view);
+
+ expTv1.setOnExpandStateChangeListener(new ExpandableTextView.OnExpandStateChangeListener() {
+ @Override
+ public void onExpandStateChanged(TextView textView, boolean isExpanded) {
+ Toast.makeText(getActivity(), isExpanded ? "Expanded" : "Collapsed", Toast.LENGTH_SHORT).show();
+ }
+ });
+
+ expTv1.setText(getString(R.string.dummy_text1));
+ expTv2.setText(getString(R.string.dummy_text2));
+
+ return rootView;
+ }
+ }
+
+ public static class QuestionsFragment extends ListFragment {
+ @Override
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ SampleTextListAdapter adapter = new SampleTextListAdapter(getActivity());
+ setListAdapter(adapter);
+ }
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/OneDayDecorator.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/OneDayDecorator.java
new file mode 100644
index 0000000..6eb001f
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/OneDayDecorator.java
@@ -0,0 +1,43 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.graphics.Color;
+import android.graphics.Typeface;
+import android.text.style.ForegroundColorSpan;
+import android.text.style.RelativeSizeSpan;
+import android.text.style.StyleSpan;
+
+import com.prolificinteractive.materialcalendarview.CalendarDay;
+import com.prolificinteractive.materialcalendarview.DayViewDecorator;
+import com.prolificinteractive.materialcalendarview.DayViewFacade;
+
+import java.util.Date;
+
+public class OneDayDecorator implements DayViewDecorator {
+
+ private CalendarDay date;
+
+ public OneDayDecorator() {
+ date = CalendarDay.today();
+ }
+
+ @Override
+ public boolean shouldDecorate(CalendarDay day) {
+ return date != null && day.equals(date);
+ }
+
+ @Override
+ public void decorate(DayViewFacade view) {
+ view.addSpan(new StyleSpan(Typeface.BOLD));
+ view.addSpan(new RelativeSizeSpan(1.4f));
+ view.addSpan(new ForegroundColorSpan(Color.GREEN));
+ }
+
+ /**
+ * We're changing the internals, so make sure to call
+ */
+ public void setDate(Date date) {
+ this.date = CalendarDay.from(date);
+ }
+
+
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/PlanDetailActivity.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/PlanDetailActivity.java
new file mode 100644
index 0000000..c8362bc
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/PlanDetailActivity.java
@@ -0,0 +1,496 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.app.ProgressDialog;
+import android.content.ActivityNotFoundException;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.graphics.drawable.ShapeDrawable;
+import android.graphics.drawable.shapes.OvalShape;
+import android.os.Build;
+import android.os.Handler;
+import android.provider.Settings;
+import android.support.v4.widget.SwipeRefreshLayout;
+import android.support.v7.app.AlertDialog;
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+import android.support.v7.widget.Toolbar;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.AdapterView;
+import android.widget.Button;
+
+import android.widget.EditText;
+
+import android.widget.ImageButton;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.koushikdutta.async.future.Future;
+import com.koushikdutta.async.future.FutureCallback;
+import com.koushikdutta.ion.Ion;
+
+import android.os.Handler;
+
+import static kr.ac.smu.cs.shalendar_java.CodeNumber.PICK_IMAGE_REQUEST;
+
+/*
+ 일정 상세보기 Activity
+ app bar의 메뉴에서 '일정 수정', '일정 삭제' 선택시
+ UpdatePlan, DeletePlanActivity로 각각 넘어간다.
+ */
+public class PlanDetailActivity extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener {
+
+ SwipeRefreshLayout mSwipeRefreshLayout;//새로고침
+
+ //UserToken
+ private String userToken;
+
+ private TextView textViewTitle;
+ private Button buttonToUpdate;
+ private Button buttonToDelete;
+ private ImageButton replySend;
+ private EditText replyInput;
+ private String replyInputString;
+
+ //js
+ private Context mContext = PlanDetailActivity.this;
+
+
+ //이미지 절대 경로
+ private String imageURL;
+
+ //통신 위한 url
+ private NetWorkUrl url = new NetWorkUrl();
+
+
+ final PlandetailAdapter plandetailAdapter = new PlandetailAdapter();
+
+ ImageButton backButton;
+
+ int buttonFlag;
+
+ public int getButtonFlag() {
+ return buttonFlag;
+ }
+
+ public void setButtonFlag(int buttonFlag) {
+ this.buttonFlag = buttonFlag;
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+
+ //댓글생성, 수정 구분을 위한 Flag
+
+
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_plan_detail);
+
+ mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefresh);
+ mSwipeRefreshLayout.setOnRefreshListener(this);
+
+ textViewTitle = (TextView) findViewById(R.id.shareCalName);
+ replySend = (ImageButton) findViewById(R.id.replysend_button);
+ replyInput = (EditText) findViewById(R.id.replyInput);
+
+ textViewTitle.setText(MainActivity.calName);
+
+ //리스트뷰
+ final ListView plandetail_Listview = (ListView) findViewById(R.id.planDetail_listView);
+
+ //헤더 삽입
+ View header = getLayoutInflater().inflate(R.layout.activity_plandetailreply_header, null, false);
+ plandetail_Listview.addHeaderView(header);
+
+ final ImageView userProfile = findViewById(R.id.plandetail_header_profile_pic);
+ final TextView schedTitle = findViewById(R.id.planDetail_title_textView);
+ final TextView userName = findViewById(R.id.plandetail_header_profile_name);
+ final TextView location = findViewById(R.id.plandetail_header_location);
+ final TextView aboutSched = findViewById(R.id.plandetail_header_aboutSchedule);
+ final TextView startToEndTime = findViewById(R.id.plandetail_header_startToEndTime);
+
+ Global global = new Global();
+
+ Intent intent = getIntent();
+ String profile_img = intent.getStringExtra("userProfile");
+
+ global.setProfileImage(userProfile, profile_img);
+
+ schedTitle.setText(intent.getStringExtra("schedTitle"));
+ userName.setText(intent.getStringExtra("userName"));
+ location.setText(intent.getStringExtra("area"));
+ aboutSched.setText(intent.getStringExtra("aboutSched"));
+ startToEndTime.setText(intent.getStringExtra("startToEnd"));
+
+
+ //SharedPreference에 저장된 userToken가져오기.
+ SharedPreferences pref = getSharedPreferences("pref_USERTOKEN", MODE_PRIVATE);
+ //값이 없으면 default로 0
+ userToken = pref.getString("userToken", "NO_TOKEN");
+ Log.i("넘겨받은 토큰", userToken);
+
+
+ //댓글 받아오는 통시 시작
+ //서버와 통신. 헤더 부분의 정보를 서버응답으로 부터 온 정보들을 파싱하여 set한다.
+ Ion.getDefault(this).configure().setLogging("ion-sample", Log.DEBUG);
+ Ion.getDefault(this).getConscryptMiddleware().enable(false);
+
+ JsonObject json = new JsonObject();
+ json.addProperty("cid", MainActivity.cid);
+ json.addProperty("sid", Global.getSid());
+
+
+ //댓글읽기 코드
+ onRefresh();
+
+ plandetail_Listview.setAdapter(plandetailAdapter);
+ plandetailAdapter.notifyDataSetChanged();
+
+ //전송버튼 누를시
+ replySend.setOnClickListener(new View.OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+ //setButtonFlag(0);
+ //그냥 댓글 생성
+ if (getButtonFlag() == 0) {
+
+ replyInputString = replyInput.getText().toString();
+ if (replyInputString.length() == 0) {
+ Toast.makeText(getApplicationContext(), "내용을 작성해주세요!", Toast.LENGTH_LONG).show();
+ } else {
+ //댓글 등록 통신 보내기!
+ Toast.makeText(getApplicationContext(), replyInputString, Toast.LENGTH_LONG).show();
+
+ //통신 준비 --> ION
+ Ion.getDefault(getApplicationContext()).configure().setLogging("ion-sample", Log.DEBUG);
+ Ion.getDefault(getApplicationContext()).getConscryptMiddleware().enable(false);
+
+ final JsonObject json = new JsonObject();
+
+ json.addProperty("cid", MainActivity.cid);
+ json.addProperty("sid", Global.getSid());
+ json.addProperty("comments", replyInputString);
+
+ Ion.with(getApplicationContext())
+ .load("POST", url.getServerUrl() + "/createComments")
+ .setHeader("Content-Type", "application/json")
+ .setHeader("Authorization", userToken)
+ .setJsonObjectBody(json)
+ .asJsonObject() //응답
+ .setCallback(new FutureCallback() {
+ @Override
+ public void onCompleted(Exception e, JsonObject result) {
+ //응답 받을 변수
+ String userName, schedTitle, aboutSched, schedLocation;
+ String startDate, startTime, endDate, endTime, startToEnd;
+
+ if (e != null) {
+ Toast.makeText(getApplicationContext(), "Server Connection Error!", Toast.LENGTH_LONG).show();
+ } else {
+
+ String message = result.get("message").getAsString();
+ //서버로 부터 응답 메세지가 success이면...
+
+ if (message.equals("success")) {
+ //서버 응답 오면 로딩 창 해제
+ Toast.makeText(getApplicationContext(), "등록성공", Toast.LENGTH_SHORT).show();
+ } else {
+ Toast.makeText(getApplicationContext(), "등록실패", Toast.LENGTH_SHORT).show();
+ }
+
+ }
+ }
+ });
+
+ //댓글읽기 코드
+ plandetailAdapter.items.clear();
+
+ onRefresh();
+
+ //replyInput.clearFocus();
+ replyInput.setText("");
+
+ Toast.makeText(getApplicationContext(), "댓글 등록중~", Toast.LENGTH_LONG).show();
+ InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
+ imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
+
+ }
+
+ }
+ }
+
+ });
+
+
+ //길게 눌렀을 때
+ plandetail_Listview.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener()
+
+ {
+ @Override
+ public boolean onItemLongClick(AdapterView> parent, View view,
+ final int position, long id) {
+ //Toast.makeText(getApplicationContext(), plandetailAdapter.items.get(position - 1).getReply_name(), Toast.LENGTH_SHORT).show();
+
+
+ AlertDialog.Builder dialog = new AlertDialog.Builder(view.getContext());
+ dialog.setTitle("댓글 수정/삭제");
+ dialog.setMessage("댓글 수정, 삭제하십니까?")
+ .setPositiveButton("수정", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+
+ //플래그
+ setButtonFlag(1);
+
+ replyInput.requestFocus();
+ //키보드 올라오는 코드
+ InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
+ imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
+
+
+ replySend.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+
+ replyInputString = replyInput.getText().toString();
+
+ //통신 준비 --> ION
+ Ion.getDefault(getApplicationContext()).configure().setLogging("ion-sample", Log.DEBUG);
+ Ion.getDefault(getApplicationContext()).getConscryptMiddleware().enable(false);
+
+ final JsonObject json = new JsonObject();
+
+ json.addProperty("cid", MainActivity.cid);
+ json.addProperty("sid", Global.getSid());
+
+ //수정될 내용
+ json.addProperty("comments", replyInputString);
+ json.addProperty("commentNum", plandetailAdapter.items.get(position - 1).getCommentNum());
+
+
+ Future ion = Ion.with(getApplicationContext())
+ .load("POST", url.getServerUrl() + "/updateComments")
+ .setHeader("Content-Type", "application/json")
+ .setHeader("Authorization", userToken)
+ .setJsonObjectBody(json)
+ .asJsonObject() //응답
+ .setCallback(new FutureCallback() {
+ @Override
+ public void onCompleted(Exception e, JsonObject result) {
+ //응답 받을 변수
+
+ if (e != null) {
+ Toast.makeText(getApplicationContext(), "Server Connection Error!", Toast.LENGTH_LONG).show();
+ } else {
+
+ String message = result.get("message").getAsString();
+ //서버로 부터 응답 메세지가 success이면...
+
+ if (message.equals("success")) {
+ //서버 응답 오면 로딩 창 해제
+ Toast.makeText(getApplicationContext(), "수정성공", Toast.LENGTH_SHORT).show();
+ setButtonFlag(0);
+ } else {
+ Toast.makeText(getApplicationContext(), "수정실패", Toast.LENGTH_SHORT).show();
+ }
+
+ }
+
+ }
+
+ });
+ try {
+ ion.get();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ replyInput.clearFocus();
+ replyInput.setText("");
+
+ InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
+ imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
+
+ plandetailAdapter.items.clear();
+ onRefresh();
+
+ }
+ });
+ dialog.cancel();
+ }
+ })
+
+ .setNegativeButton("삭제", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+
+ //통신 준비 --> ION
+ Ion.getDefault(getApplicationContext()).configure().setLogging("ion-sample", Log.DEBUG);
+ Ion.getDefault(getApplicationContext()).getConscryptMiddleware().enable(false);
+
+ final JsonObject json = new JsonObject();
+
+ json.addProperty("cid", MainActivity.cid);
+ json.addProperty("sid", Global.getSid());
+ json.addProperty("commentNum", plandetailAdapter.items.get(position - 1).getCommentNum());
+
+ Ion.with(getApplicationContext())
+ .load("POST", url.getServerUrl() + "/deleteComments")
+ .setHeader("Content-Type", "application/json")
+ .setHeader("Authorization", userToken)
+ .setJsonObjectBody(json)
+ .asJsonObject() //응답
+ .setCallback(new FutureCallback() {
+ @Override
+ public void onCompleted(Exception e, JsonObject result) {
+ //응답 받을 변수
+
+ String userName, schedTitle, aboutSched, schedLocation;
+ String startDate, startTime, endDate, endTime, startToEnd;
+
+ if (e != null) {
+ Toast.makeText(getApplicationContext(), "Server Connection Error!", Toast.LENGTH_LONG).show();
+ } else {
+
+ String message = result.get("message").getAsString();
+ //서버로 부터 응답 메세지가 success이면...
+
+ if (message.equals("success")) {
+ //서버 응답 오면 로딩 창 해제
+ Toast.makeText(getApplicationContext(), "삭제성공", Toast.LENGTH_SHORT).show();
+ } else {
+ Toast.makeText(getApplicationContext(), "삭제실패", Toast.LENGTH_SHORT).show();
+ }
+
+ }
+ }
+ });
+
+ //댓글읽어오기 코드
+
+ plandetailAdapter.items.clear();
+ onRefresh();
+
+ dialog.cancel();
+
+ }
+ });
+
+ plandetailAdapter.notifyDataSetChanged();
+ AlertDialog alertDialog = dialog.create();
+ alertDialog.show();
+
+ return false;
+ }
+
+ });
+
+
+ backButton = findViewById(R.id.btn_back);
+ backButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ onBackPressed();
+ }
+ });
+ }
+
+ @Override
+ public void onRefresh() {
+ plandetailAdapter.items.clear();
+ Ion.getDefault(this).configure().setLogging("ion-sample", Log.DEBUG);
+ Ion.getDefault(this).getConscryptMiddleware().enable(false);
+
+ mSwipeRefreshLayout.setRefreshing(true);
+ new Handler().postDelayed(new Runnable() {
+
+ @Override
+ public void run() {
+ plandetailAdapter.notifyDataSetChanged();
+
+ //댓글 받아오는 통신 시작
+ //서버와 통신. 헤더 부분의 정보를 서버응답으로 부터 온 정보들을 파싱하여 set한다.
+
+ JsonObject json = new JsonObject();
+ json.addProperty("cid", MainActivity.cid);
+ json.addProperty("sid", Global.getSid());
+
+ //댓글읽기 코드
+ Ion.with(getApplicationContext())
+ .load("POST", url.getServerUrl() + "/readComments")
+ .setHeader("Content-Type", "application/json")
+ .setHeader("Authorization", userToken)
+ .setJsonObjectBody(json)
+ .asJsonObject()
+ .setCallback(new FutureCallback() {
+ @Override
+ public void onCompleted(Exception e, JsonObject result) {
+
+ String comments, name, rdate, profile_img_url;
+ int commentNum;
+
+ if (e != null) {
+ Toast.makeText(getApplicationContext(), "Server Connection Error!", Toast.LENGTH_LONG).show();
+ } else {
+ //응답 형식이 { "data":{"id":"jacob456@hanmail.net", "cid":1, "sid":10, "title":"korea"}, "message":"success"}
+ //data: 다음에 나오는 것들도 JsonObject형식.
+ //따라서 data를 JsonObject로 받고, 다시 이 data를 이용하여(어찌보면 JsonObject안에 또다른 JsonObject가 있는 것이다.
+ //JSONArray가 아님. 얘는 [,]로 묶여 있어야 함.
+
+ String message = result.get("message").getAsString();
+ //서버로 부터 응답 메세지가 success이면...
+
+ if (message.equals("success")) {
+ //서버 응답 오면 로딩 창 해제
+ // progressDialog.dismiss();
+
+ //data: {} 에서 {}안에 있는 것들도 JsonObject
+
+ JsonArray data = result.getAsJsonArray("data");
+
+ for (int i = 0; i < data.size(); i++) {
+ JsonObject jsonArr1 = data.get(i).getAsJsonObject();
+ commentNum = jsonArr1.get("commentNum").getAsInt();
+ comments = jsonArr1.get("comments").getAsString();
+ name = jsonArr1.get("userName").getAsString();
+ rdate = jsonArr1.get("rdate").getAsString();
+
+ if (jsonArr1.get("img_url").isJsonNull())
+ profile_img_url = "DEFAULT :: profile_IMAGE";
+ else
+ profile_img_url = jsonArr1.get("img_url").getAsString();
+
+
+ plandetailAdapter.addItem(new PlandetailItem(profile_img_url, name, rdate, comments, commentNum));
+ plandetailAdapter.notifyDataSetChanged();
+ }
+
+ //Log.i("result",data.get("id").getAsString());
+ } else {
+
+ Toast.makeText(getApplicationContext(), "해당 일정이 없습니다.", Toast.LENGTH_LONG).show();
+ }
+
+ }
+ }
+ });
+ mSwipeRefreshLayout.setRefreshing(false);
+ }
+ }, 1000);
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/PlandetailAdapter.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/PlandetailAdapter.java
new file mode 100644
index 0000000..b351cbc
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/PlandetailAdapter.java
@@ -0,0 +1,53 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+
+import java.util.ArrayList;
+
+public class PlandetailAdapter extends BaseAdapter {
+
+ ArrayList items = new ArrayList();
+
+ public void clearItem() {
+ items.clear();
+ }
+
+ public void addItem(PlandetailItem item) {
+ items.add(item);
+ }
+
+ @Override
+ public int getCount() {
+ return items.size();
+ }
+
+ @Override
+ public Object getItem(int position) {
+ return items.get(position);
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return position;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ PlandetailItemView view = null;
+ if (convertView == null) {
+ view = new PlandetailItemView(parent.getContext());
+ } else {
+ view = (PlandetailItemView) convertView;
+ }
+
+ PlandetailItem item = items.get(position);
+ view.setReply_profile_img(item.reply_picture);
+ view.setReply_profile_name(item.reply_name);
+ view.setReply_date(item.reply_date);
+ view.setReply_content(item.reply_content);
+
+ return view;
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/PlandetailItem.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/PlandetailItem.java
new file mode 100644
index 0000000..785d70c
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/PlandetailItem.java
@@ -0,0 +1,67 @@
+package kr.ac.smu.cs.shalendar_java;
+
+public class PlandetailItem {
+
+ String reply_picture;
+ String reply_name;
+ String reply_content;
+ String reply_date;
+ int commentNum;
+
+
+ public PlandetailItem(String reply_name, String reply_content, String reply_date, int commentNum) {
+ this.reply_name = reply_name;
+ this.reply_content = reply_content;
+ this.reply_date = reply_date;
+ this.commentNum = commentNum;
+ }
+
+ public PlandetailItem(String reply_picture, String reply_name, String reply_date, String reply_content, int commentNum) {
+ this.reply_picture = reply_picture;
+ this.reply_name = reply_name;
+ this.reply_content = reply_content;
+ this.reply_date = reply_date;
+ this.commentNum = commentNum;
+
+ }
+
+ public int getCommentNum() {
+ return commentNum;
+ }
+
+ public void setCommentNum(int commentNum) {
+ this.commentNum = commentNum;
+ }
+
+ public String getReply_picture() {
+ return reply_picture;
+ }
+
+ public void setReply_picture(String reply_picture) {
+ this.reply_picture = reply_picture;
+ }
+
+ public String getReply_name() {
+ return reply_name;
+ }
+
+ public void setReply_name(String reply_name) {
+ this.reply_name = reply_name;
+ }
+
+ public String getReply_content() {
+ return reply_content;
+ }
+
+ public void setReply_content(String reply_content) {
+ this.reply_content = reply_content;
+ }
+
+ public String getReply_date() {
+ return reply_date;
+ }
+
+ public void setReply_date(String reply_date) {
+ this.reply_date = reply_date;
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/PlandetailItemView.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/PlandetailItemView.java
new file mode 100644
index 0000000..0094319
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/PlandetailItemView.java
@@ -0,0 +1,52 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.content.Context;
+import android.graphics.drawable.ShapeDrawable;
+import android.graphics.drawable.shapes.OvalShape;
+import android.os.Build;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.koushikdutta.ion.Ion;
+
+public class PlandetailItemView extends LinearLayout {
+
+ ImageView reply_profile_img;
+ TextView reply_profile_name;
+ TextView reply_date;
+ TextView reply_content;
+
+ public PlandetailItemView(Context context) {
+ super(context);
+ init(context);
+ }
+
+ public PlandetailItemView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init(context);
+ }
+
+ private void init(Context context) {
+ LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ inflater.inflate(R.layout.reply_item, this, true);
+
+ reply_profile_img = findViewById(R.id.reply_profile_pic);
+ reply_profile_name=(TextView)findViewById(R.id.reply_profile_name);
+ reply_date=(TextView)findViewById(R.id.reply_date);
+ reply_content=(TextView)findViewById(R.id.reply_content);
+ }
+
+ public void setReply_profile_img(String profile_img) {
+
+ Global global = new Global();
+ global.setProfileImage(reply_profile_img, profile_img);
+ }
+ public void setReply_profile_name(String profile_name){ reply_profile_name.setText(profile_name);}
+ public void setReply_date(String date){ reply_date.setText(date);}
+ public void setReply_content(String content){ reply_content.setText(content);}
+
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/RecommandRadioAdapter.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/RecommandRadioAdapter.java
new file mode 100644
index 0000000..98e3344
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/RecommandRadioAdapter.java
@@ -0,0 +1,68 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.content.Context;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.RadioButton;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public abstract class RecommandRadioAdapter extends RecyclerView.Adapter {
+
+ public int mSelectedItem = -1;
+ public ArrayList mItems;
+ private Context mContext;
+ public int minPosition;
+
+ public RecommandRadioAdapter() {
+ }
+
+ public RecommandRadioAdapter( Context mContext, ArrayList mItems) {
+ this.mItems = mItems;
+ this.mContext = mContext;
+ }
+
+ @Override
+ public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ LayoutInflater inflater = LayoutInflater.from(mContext);
+ final View view = inflater.inflate(R.layout.recommand_time_item, parent, false);
+ return new ViewHolder(view);
+ }
+
+ @Override
+ public void onBindViewHolder(RecommandRadioAdapter.ViewHolder holder, int position) {
+ holder.radio_button.setChecked(position == mSelectedItem);
+
+ }
+
+ class ViewHolder extends RecyclerView.ViewHolder {
+
+ public RadioButton radio_button;
+ public TextView time_number;
+ public TextView time_text;
+
+ public ViewHolder(final View inflate) {
+ super(inflate);
+ time_number = (TextView) inflate.findViewById(R.id.recommandtime_number);
+ time_text = (TextView) inflate.findViewById(R.id.recommandtime_text);
+ radio_button = (RadioButton) inflate.findViewById(R.id.recommand_radio_button);
+
+ View.OnClickListener clickListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mSelectedItem = getAdapterPosition();
+ minPosition = mSelectedItem;
+
+ notifyDataSetChanged();
+ }
+ };
+ itemView.setOnClickListener(clickListener);
+ radio_button.setOnClickListener(clickListener);
+ }
+
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/RecommandTimeActivity.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/RecommandTimeActivity.java
new file mode 100644
index 0000000..c686903
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/RecommandTimeActivity.java
@@ -0,0 +1,38 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.content.Intent;
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+
+
+/*
+
+ 공유 일정 작성 경우
+ 개인 일정의 달력들을 모두 검토 한후
+ 팀원들이 모두 가능한 시간대를 추천해주는 Activity이다.
+ 추천시간을 서버로 부터 받으면 다시 RegisterPlanActivity로 돌아간다.
+
+ */
+public class RecommandTimeActivity extends AppCompatActivity {
+
+ private Button buttonGetTime;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_recommand_time);
+
+ buttonGetTime = findViewById(R.id.recommandTime_getTime_button);
+ buttonGetTime.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+
+ Intent intent = new Intent(getApplicationContext(), RegisterPlanActivity.class);
+ startActivity(intent);
+
+ }
+ });
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/RecommandTimeAdapter.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/RecommandTimeAdapter.java
new file mode 100644
index 0000000..6ca041f
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/RecommandTimeAdapter.java
@@ -0,0 +1,45 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.content.Context;
+import android.util.Log;
+
+import java.util.ArrayList;
+
+public class RecommandTimeAdapter extends RecommandRadioAdapter {
+
+ ArrayList items = new ArrayList<>();
+ Context context;
+
+ public RecommandTimeAdapter() {
+ }
+
+ public RecommandTimeAdapter(Context context, ArrayList items) {
+ super(context, items);
+ }
+
+ @Override
+ public void onBindViewHolder(RecommandRadioAdapter.ViewHolder holder, int position) {
+ super.onBindViewHolder(holder, position);
+ holder.time_number.setText(items.get(position).getReco_timeNumber());
+ holder.time_text.setText(items.get(position).getReco_time());
+
+ }
+
+ @Override
+ public int getItemCount() {
+ return items.size();
+ }
+
+ public void sendServer() {
+ Log.d("불러", items.get(minPosition).getReco_time());
+ }
+
+ public String sendRecommandTime() {
+ return items.get(minPosition).getReco_time();
+ }
+
+ public void addItem(RecommandTimeItem item) {
+ items.add(item);
+ }
+
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/RecommandTimeItem.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/RecommandTimeItem.java
new file mode 100644
index 0000000..887f628
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/RecommandTimeItem.java
@@ -0,0 +1,35 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.widget.RadioButton;
+
+//추천시간 recyclerview의 item들
+public class RecommandTimeItem {
+ private String reco_timeNumber;
+ private String reco_time;
+ private RadioButton reco_radioButton;
+
+ public RecommandTimeItem() {
+ }
+
+ public RecommandTimeItem(String reco_timeNumber, String reco_time) {
+ this.reco_timeNumber = reco_timeNumber;
+ this.reco_time = reco_time;
+ }
+
+ public String getReco_timeNumber() {
+ return reco_timeNumber;
+ }
+
+ public void setReco_timeNumber(String reco_timeNumber) {
+ this.reco_timeNumber = reco_timeNumber;
+ }
+
+ public String getReco_time() {
+ return reco_time;
+ }
+
+ public void setReco_time(String reco_time) {
+ this.reco_time = reco_time;
+ }
+
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/RegisterPlanActivity.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/RegisterPlanActivity.java
new file mode 100644
index 0000000..189823d
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/RegisterPlanActivity.java
@@ -0,0 +1,590 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.app.Activity;
+import android.app.DatePickerDialog;
+import android.app.ProgressDialog;
+import android.app.TimePickerDialog;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.View;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
+import android.widget.Button;
+import android.widget.DatePicker;
+import android.widget.EditText;
+import android.widget.ImageButton;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import android.widget.TimePicker;
+import android.widget.Toast;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.koushikdutta.async.future.FutureCallback;
+import com.koushikdutta.async.http.body.JSONArrayBody;
+import com.koushikdutta.ion.Ion;
+import com.koushikdutta.ion.ProgressCallback;
+
+import org.json.JSONArray;
+import org.json.simple.JSONObject;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+
+/*
+ 일정 작성 Activity
+ 사용자로 부터 일정에 대한 상세 정보들을 입력 받는다.
+ 이때 '추천시간'을 받기 위해 '추처시간 받기 버튼을 누르면
+ RecommandTimeActivity로 이동한다.
+ 개인 일정을 등록하는 경우에는 해당 기능 비활성화 시킨다.
+ */
+public class RegisterPlanActivity extends AppCompatActivity {
+
+ public static Activity RegisterplanclearActivity;
+
+ private EditText planTitle;
+ private EditText aboutPlan;
+ private EditText location;
+ private TextView startDate;
+ private TextView endDate;
+ private TextView startTime;
+ private TextView endTime;
+ private Button buttonToRecommandTime;
+ private Button buttonCompleteRegister;
+ private TextView recommandedTime;
+ private RegisterPlanActivityDialog dialog;
+ ImageButton backButton;
+ //추가본 7.10
+ boolean isPageOpen = false;
+ ArrayList itemList;
+
+ RecommandTimeAdapter t_adapter;
+
+ Animation translateUpAnim;
+ Animation translateDownAnim;
+
+ LinearLayout page;
+ Button reccomandtime_button;
+
+ Button sndbutton;
+ //
+
+ ImageButton closeButton;
+
+ //userToken
+ private String userToken;
+
+ //서버 Url가져오기
+ private NetWorkUrl url = new NetWorkUrl();
+
+ //서버로 보낼 data
+ private String scheTitle;
+ private String strStartDate;
+ private String strStartTime;
+ private String strEndDate;
+ private String strEndTime;
+ private String aboutSched;
+ private String strLocation;
+
+ RecyclerView recyclerView;
+
+
+ //시작 날짜, 종료 날짜 비교
+ int intFirstday, intLastday, intFirstmon, intLastmon;
+ int startHour, startMinute, endHour, endMinute;
+
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_register_plan);
+
+ //삭제를위해
+ RegisterplanclearActivity = RegisterPlanActivity.this;
+
+ SharedPreferences pref = getSharedPreferences("pref_USERTOKEN", MODE_PRIVATE);
+ //값이 없으면 default로 0
+ userToken = pref.getString("userToken", "NO_TOKEN");
+ Log.i("Sharepref에 저장된 토큰", userToken);
+
+ //7.10추가 부분
+
+ page = findViewById(R.id.page);
+ sndbutton = findViewById(R.id.sendButton);
+ recyclerView = findViewById(R.id.recotime_Recycler);
+
+ //애니메이션
+ closeButton=(ImageButton)findViewById(R.id.closearrow);
+
+ translateUpAnim = AnimationUtils.loadAnimation(this, R.anim.translate_up);
+ translateDownAnim = AnimationUtils.loadAnimation(this, R.anim.translate_down);
+
+ SlidingPageAnimationListener animListener = new SlidingPageAnimationListener();
+ translateUpAnim.setAnimationListener(animListener);
+ translateDownAnim.setAnimationListener(animListener);
+
+
+ //전송버튼 눌릴때
+ sndbutton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ t_adapter.sendServer();
+ recommandedTime.setText(t_adapter.sendRecommandTime());
+
+ if (isPageOpen) {
+ page.startAnimation(translateDownAnim);
+ } else {
+ page.setVisibility(View.VISIBLE);
+ page.startAnimation(translateUpAnim);
+ }
+ }
+ });
+
+ planTitle = findViewById(R.id.register_title_EditText);
+ aboutPlan = findViewById(R.id.register_aboutPlan_EditText);
+ location = findViewById(R.id.register_location_EditText);
+ startDate = findViewById(R.id.register_startDate_TextView);
+ endDate = findViewById(R.id.register_endDate_TextView);
+ startTime = findViewById(R.id.register_startTime_TextView);
+ endTime = findViewById(R.id.register_endTime_TextView);
+ buttonToRecommandTime = findViewById(R.id.register_getTime_Button);
+ buttonCompleteRegister = findViewById(R.id.register_registerPlan_Button);
+ recommandedTime = findViewById(R.id.register_getTime_TextView);
+
+ Date date = new Date();
+ SimpleDateFormat format = new SimpleDateFormat("FFF");
+
+
+ //날짜 선택
+ initDate();
+
+ //시간 선택
+ initTime();
+
+
+ //추천시간 눌릴때
+ reccomandtime_button = findViewById(R.id.register_getTime_Button);
+ reccomandtime_button.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+
+ ////////////////////////////////////////////////
+ //추천시간 서버 통신
+ ////////////////////////////////////////////////
+
+ if(strStartTime != null && strStartDate != null && strEndDate != null && strStartDate.equals(strEndDate)) {
+ getRecommandTimeFromServer();
+
+ if (!isPageOpen) {
+ page.setVisibility(View.VISIBLE);
+ page.startAnimation(translateUpAnim);
+ }
+ closeButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ page.startAnimation(translateDownAnim);
+ }
+ });
+
+ } else
+ Toast.makeText(getApplicationContext(), "추천시간을 받을 수 있는 조건이 아닙니다.", Toast.LENGTH_LONG).show();
+ }
+ });
+
+
+
+ //Ion방식의 통신 준비
+ Ion.getDefault(this).configure().setLogging("ion-sample", Log.DEBUG);
+ Ion.getDefault(this).getConscryptMiddleware().enable(false);
+
+
+
+ //여기서 전송버튼 누르면 서버 통신
+ buttonCompleteRegister.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+
+ scheTitle = planTitle.getText().toString().trim();
+ aboutSched = aboutPlan.getText().toString().trim();
+ //startDate
+ //startTime
+ //strEndDate
+ //startEndTime
+ strLocation = location.getText().toString().trim();
+
+ if(!scheTitle.equals("") && strStartDate != null && strStartTime != null && strEndDate != null && strEndTime != null &&
+ !aboutSched.equals("") && !strLocation.equals("")) {
+
+
+ JsonObject json = new JsonObject();
+
+ json.addProperty("cid", MainActivity.cid);
+ json.addProperty("title", scheTitle);
+ json.addProperty("sContent", aboutSched);
+ json.addProperty("startDate", strStartDate + " " + strStartTime);
+ //json.addProperty("startTime",strStartTime);
+ json.addProperty("endDate", strEndDate + " " + strEndTime);
+ //json.addProperty("endTime",strEndTime);
+ json.addProperty("area", strLocation);
+
+ //서버 응답 받을 동안 로딩 창 실행.
+ final ProgressDialog progressDialog = new ProgressDialog(RegisterPlanActivity.this);
+ progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
+ progressDialog.setMessage("잠시만 기다려주세요. 해당 일정 등록 중 입니다~");
+ progressDialog.show();
+
+
+ //일정 추가에 관한 정보 서버 전송
+ Ion.with(getApplicationContext())
+ .load("POST", url.getServerUrl() + "/createSche")
+ .progressDialog(progressDialog)
+ //요청 헤더 지정
+ .setHeader("Content-Type", "application/json")
+ .setHeader("Authorization", userToken)
+ .setJsonObjectBody(json)
+
+ //응답은 JsonObject로 받겠다.
+ .asJsonObject()
+ .setCallback(new FutureCallback() {
+ @Override
+ public void onCompleted(Exception e, JsonObject result) {
+
+ if (e != null) { //서버 연결 오류
+ Toast.makeText(getApplicationContext(), "Problom in Server Connection", Toast.LENGTH_LONG).show();
+ } else {// 서버 연결 성공 시
+ //프로그래스 dialog종료
+ progressDialog.dismiss();
+ String message = result.get("message").getAsString();
+ //Toast.makeText(getApplicationContext(), result.get("message").getAsString(), Toast.LENGTH_LONG).show();
+
+ if (message.equals("success"))
+ Dialog();
+ else
+ Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
+ }
+ }
+ });
+ }
+
+ else
+ Toast.makeText(getApplicationContext(), "누락된 정보가 있습니다.", Toast.LENGTH_LONG).show();
+ }
+ });
+
+ ImageButton backButton = findViewById(R.id.btn_back);
+ backButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ onBackPressed();
+ }
+ });
+
+ }
+
+ public void getRecommandTimeFromServer() {
+
+ Ion.getDefault(this).configure().setLogging("ion-sample", Log.DEBUG);
+ Ion.getDefault(this).getConscryptMiddleware().enable(false);
+
+
+ String startDate = strStartDate + " " + strStartTime;
+ Log.i("추천시간()", startDate);
+ Log.i("추천시간()cid", Integer.toString(MainActivity.cid));
+ JsonObject json = new JsonObject();
+ json.addProperty("cid",MainActivity.cid);
+ json.addProperty("startDate", startDate);
+
+ Ion.with(getApplicationContext())
+ .load("POST", url.getServerUrl() + "/recommendSche")
+ .setHeader("Content-Type","application/json")
+ .setJsonObjectBody(json)
+ .asJsonObject()
+ .setCallback(new FutureCallback() {
+ @Override
+ public void onCompleted(Exception e, JsonObject result) {
+
+ if(e != null) {
+ Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
+ } else {
+ parseDataFromServer(result);
+ }
+ }
+ });
+
+ //startDate와 endDat
+ }
+
+
+ public void parseDataFromServer(JsonObject result) {
+ String message = result.get("message").getAsString();
+
+ if(message.equals("success")) {
+ JsonArray data = result.get("data").getAsJsonArray();
+
+ RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
+ recyclerView.setLayoutManager(layoutManager);
+
+ t_adapter = new RecommandTimeAdapter(this, itemList);
+ for(int i = 0; i lastMon) {
+ Toast.makeText(RegisterPlanActivity.this, "다시 입력해주세요.", Toast.LENGTH_LONG).show();
+
+ } else {
+ if (firstDay > lastDay) {
+ Toast.makeText(RegisterPlanActivity.this, "다시 입력해주세요.", Toast.LENGTH_LONG).show();
+
+ } else {
+ strEndDate = dateFormatByUserCase(2, lastYear, lastMon, lastDay);
+ Log.i("종료 날짜", strEndDate);
+ }
+ }
+ }
+
+ /*
+ flag값에 따라
+ selectFirst에 setText할지
+ selectLast에 setText할지 구분해주는 메소드.
+ */
+ private void setSelectFirstOrSelectLast(int flag, String txtmsg) {
+ if (flag == 1)
+ startDate.setText(txtmsg);
+ else if (flag == 2)
+ endDate.setText(txtmsg);
+ }
+
+ /*
+ 출력형식을 '2018-08-15'와 같이 지정해주는 메소드.
+ return 타입 : String
+ 이 함수를 이용하여 strFirstDate, strLastDate에 만들어진 형식을 저장할 수 있다.
+ */
+ private String dateFormatByUserCase(int flag, int year, int month, int dayOfMonth) {
+
+ String format = null;
+ String txtmsg;
+
+ SimpleDateFormat dateformat = new SimpleDateFormat("EEE");
+ Date date = new Date(year, month, dayOfMonth - 1);
+ String dayOfWeek = dateformat.format(date);
+
+ if (month + 1 < 10) {
+ int ten_month = (month + 1) / 10;
+ int one_month = (month + 1) % 10;
+
+ String month1 = Integer.toString(ten_month) + Integer.toString(one_month);
+
+ if (dayOfMonth < 10) {
+ int ten_date = (dayOfMonth) / 10;
+ int one_date = (dayOfMonth) % 10;
+ String date1 = Integer.toString(ten_date) + Integer.toString(one_date);
+
+ txtmsg = month1 + "월" + date1 + "일" + String.format("(%s)", dayOfWeek);
+ format = String.format("%d-", year) + month1 + "-" + date1;
+
+ setSelectFirstOrSelectLast(flag, txtmsg);
+ } else if (dayOfMonth >= 10) {
+ txtmsg = month1 + "월" + String.format("%d일", dayOfMonth) + String.format("(%s)", dayOfWeek);
+ format = String.format("%d-", year) + month1 + "-" + String.format("%d", dayOfMonth);
+ setSelectFirstOrSelectLast(flag, txtmsg);
+ }
+ } else if (month + 1 >= 10) {
+ if (dayOfMonth < 10) {
+ int ten_date = (dayOfMonth) / 10;
+ int one_date = (dayOfMonth) % 10;
+ String date1 = Integer.toString(ten_date) + Integer.toString(one_date);
+
+ txtmsg = (month + 1) + "월" + date1 + "일" + String.format("(%s)", dayOfWeek);
+ format = String.format("%d-", year) + (month + 1) + "-" + date1; //String.format("%d일", dayOfMonth);
+ setSelectFirstOrSelectLast(flag, txtmsg);
+ } else if (dayOfMonth >= 10) {
+ txtmsg = (month + 1) + "월" + String.format("%d일", dayOfMonth) + String.format("(%s)", dayOfWeek);
+ format = String.format("%d-", year) + (month + 1) + "-" + String.format("%d", dayOfMonth);
+ setSelectFirstOrSelectLast(flag, txtmsg);
+ }
+ }
+ return format;
+ }
+}
+
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/RegisterPlanActivityDialog.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/RegisterPlanActivityDialog.java
new file mode 100644
index 0000000..4789d22
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/RegisterPlanActivityDialog.java
@@ -0,0 +1,52 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.content.Intent;
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.Button;
+
+public class RegisterPlanActivityDialog extends Dialog {
+
+ private Button gotomain;
+ RegisterPlanActivity Aactivity = (RegisterPlanActivity)RegisterPlanActivity.RegisterplanclearActivity;
+
+ public RegisterPlanActivityDialog(Context context, View.OnClickListener singleListener) {
+ super(context, android.R.style.Theme_Translucent_NoTitleBar);
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+
+ //뒷배경 어둡게 해주기
+ WindowManager.LayoutParams lpWindow = new WindowManager.LayoutParams();
+ lpWindow.flags = WindowManager.LayoutParams.FLAG_DIM_BEHIND;
+ lpWindow.dimAmount = 0.8f;
+ getWindow().setAttributes(lpWindow);
+
+
+ setContentView(R.layout.activity_register_plan_dialog);
+
+ gotomain = findViewById(R.id.CreateCalendarComplete);
+
+ gotomain.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent2 = new Intent(getContext(), MainActivity.class);
+ getContext().startActivity(intent2);
+ dismiss();
+ Aactivity.finish();
+ }
+ });
+ }
+
+
+
+
+
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/SampleTextListAdapter.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/SampleTextListAdapter.java
new file mode 100644
index 0000000..e59370d
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/SampleTextListAdapter.java
@@ -0,0 +1,60 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.content.Context;
+import android.util.SparseBooleanArray;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+
+import com.ms.square.android.expandabletextview.ExpandableTextView;
+
+public class SampleTextListAdapter extends BaseAdapter {
+
+ private final Context mContext;
+ private final SparseBooleanArray mCollapsedStatus;
+ private final String[] sampleStrings;
+
+ public SampleTextListAdapter(Context context) {
+ mContext = context;
+ mCollapsedStatus = new SparseBooleanArray();
+ sampleStrings = mContext.getResources().getStringArray(R.array.sampleStrings);
+ }
+
+ @Override
+ public int getCount() {
+ return sampleStrings.length;
+ }
+
+ @Override
+ public Object getItem(int position) {
+ return null;
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return 0;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ final ViewHolder viewHolder;
+ if (convertView == null) {
+ convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, false);
+ viewHolder = new ViewHolder();
+ viewHolder.expandableTextView = (ExpandableTextView) convertView.findViewById(R.id.expand_text_view);
+ convertView.setTag(viewHolder);
+ } else {
+ viewHolder = (ViewHolder) convertView.getTag();
+ }
+
+ viewHolder.expandableTextView.setText(sampleStrings[position], mCollapsedStatus, position);
+
+ return convertView;
+ }
+
+
+ private static class ViewHolder{
+ ExpandableTextView expandableTextView;
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/SaturdayDecorator.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/SaturdayDecorator.java
new file mode 100644
index 0000000..23f455e
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/SaturdayDecorator.java
@@ -0,0 +1,32 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.graphics.Color;
+import android.text.style.ForegroundColorSpan;
+
+import com.prolificinteractive.materialcalendarview.CalendarDay;
+import com.prolificinteractive.materialcalendarview.DayViewDecorator;
+import com.prolificinteractive.materialcalendarview.DayViewFacade;
+
+import java.util.Calendar;
+
+public class SaturdayDecorator implements DayViewDecorator {
+
+ private final Calendar calendar = Calendar.getInstance();
+
+ public SaturdayDecorator() {
+
+ }
+
+ @Override
+ public boolean shouldDecorate(CalendarDay day) {
+ day.copyTo(calendar);
+ int weekDay = calendar.get(Calendar.DAY_OF_WEEK);
+ return weekDay == Calendar.SATURDAY;
+ }
+
+ @Override
+ public void decorate(DayViewFacade view) {
+ view.addSpan(new ForegroundColorSpan(Color.BLUE));
+ }
+}
+
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/SearchPlanActivity.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/SearchPlanActivity.java
new file mode 100644
index 0000000..53709bb
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/SearchPlanActivity.java
@@ -0,0 +1,159 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.app.ProgressDialog;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.support.design.widget.FloatingActionButton;
+import android.support.design.widget.Snackbar;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.Toolbar;
+import android.util.Log;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.ImageButton;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.Toast;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.koushikdutta.async.future.FutureCallback;
+import com.koushikdutta.ion.Ion;
+
+import java.util.ArrayList;
+
+public class SearchPlanActivity extends AppCompatActivity {
+
+ //검색어 저장 변수.
+ private String keyword;
+
+ //사용자 token
+ private String userToken;
+
+ //서버 연동
+ NetWorkUrl url = new NetWorkUrl();
+
+ //검색결과 뷰
+ private SearchPlanAdapter s_adapter;
+ private RecyclerView searchPlanRecycler;
+ ArrayList searchPlanList;
+
+ String plantitle;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_search_plan);
+
+ searchPlanList = new ArrayList<>();
+
+ searchPlanRecycler = (RecyclerView)findViewById(R.id.searchRecycle);
+ searchPlanRecycler.setHasFixedSize(true);
+ s_adapter = new SearchPlanAdapter(searchPlanList, this);
+ searchPlanRecycler.setLayoutManager(new LinearLayoutManager(this, LinearLayout.VERTICAL, false));
+
+
+ final EditText searchText = findViewById(R.id.search_Keyword);
+ ImageView searchSchedule = findViewById(R.id.search_Schedule);
+
+
+ SharedPreferences pref = getSharedPreferences("pref_USERTOKEN", MODE_PRIVATE);
+ userToken = pref.getString("userToken", "NO_TOKEN");
+ Log.i("Sharepref에 저장된 토큰", userToken);
+
+
+ //통신 준비 --> ION
+ Ion.getDefault(this).configure().setLogging("ion-sample", Log.DEBUG);
+ Ion.getDefault(this).getConscryptMiddleware().enable(false);
+
+ searchSchedule.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+
+ keyword = searchText.getText().toString().trim();
+ Log.i("검색어", keyword);
+ if(keyword.equals(""))
+ Toast.makeText(getApplicationContext(), "검색어를 입력해주세요~", Toast.LENGTH_LONG).show();
+ else {
+
+ final ProgressDialog progressDialog = new ProgressDialog(SearchPlanActivity.this);
+ progressDialog.setMessage("검색 중입니다~");
+ progressDialog.setProgressStyle(progressDialog.STYLE_SPINNER);
+ progressDialog.show();
+
+ JsonObject json = new JsonObject();
+ json.addProperty("title", keyword);
+
+ Ion.with(getApplicationContext())
+ .load("POST", url.getServerUrl() + "/searchSche")
+ .progressDialog(progressDialog)
+ .setHeader("Content-Type","application/json")
+ .setHeader("Authorization", userToken)
+ .setJsonObjectBody(json)
+ .asJsonObject()
+ .setCallback(new FutureCallback() {
+
+ @Override
+ public void onCompleted(Exception e, JsonObject result) {
+
+ if(e != null) {
+ Toast.makeText(getApplicationContext(), "Sever Connection Error", Toast.LENGTH_LONG).show();
+ }
+
+ else {
+ progressDialog.dismiss();
+ String message = result.get("message").getAsString();
+ parseResponse(message, result);
+ }
+ }
+ });
+ }
+ keyword="";
+ searchText.setText("");
+ }
+ });
+
+ ImageButton backButton;
+
+ backButton = findViewById(R.id.btn_back);
+ backButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ onBackPressed();
+ }
+ });
+
+ }
+
+ /*
+ 서버로 부터 온 응답 파싱하는 부분.
+ */
+ public void parseResponse(String message, JsonObject result) {
+
+ if(message.equals("success")) {
+
+ JsonArray data = result.get("data").getAsJsonArray();
+ Log.i("JSONArray길이", Integer.toString(data.size()));
+
+ for(int i = 0; i {
+
+ private NetWorkUrl url = new NetWorkUrl();
+
+ private ArrayList searchList;
+ private Context context;
+
+ public SearchPlanAdapter(ArrayList searchList, Context mContext) {
+ this.searchList = searchList;
+ this.context = mContext;
+ }
+
+ @Override
+ public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ context = parent.getContext();
+ RecyclerView.ViewHolder holder;
+ View view;
+
+ View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.searchplan_item, null);
+ SearchPlanAdapter.ViewHolder sh = new SearchPlanAdapter.ViewHolder(v);
+
+ return sh;
+ }
+
+ @Override
+ public void onBindViewHolder(ViewHolder holder, int position) {
+ String planname = searchList.get(position).getPlanname();
+ holder.searchedPlan.setText(planname);
+ }
+
+ @Override
+ public int getItemCount() {
+ return (null != searchList? searchList.size() : 0);
+ }
+
+
+ public void addItem(SearchPlanItem item){
+ searchList.add(item);
+ }
+
+
+ public class ViewHolder extends RecyclerView.ViewHolder {
+
+ protected TextView searchedPlan;
+
+
+ public ViewHolder(View itemView) {
+
+ super(itemView);
+ this.searchedPlan = (TextView) itemView.findViewById(R.id.searchPlanitem);
+
+ itemView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Global.setSid(searchList.get(getAdapterPosition()).getSid());
+ Toast.makeText(v.getContext(), searchList.get(getAdapterPosition()).getPlanname() + "여기로 간다잉", Toast.LENGTH_SHORT).show();
+
+ JsonObject json = new JsonObject();
+
+ json.addProperty("sid", Global.getSid());
+
+ final ProgressDialog progressDialog = new ProgressDialog(context);
+ progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
+ progressDialog.setMessage("해당 댓글로 이동중~" + searchList.get(getAdapterPosition()).getSid());
+ progressDialog.show();
+
+ Global global = new Global();
+ global.netWork_ShowSche(context, progressDialog, json, url);
+
+ }
+ });
+
+ }
+
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/SearchPlanItem.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/SearchPlanItem.java
new file mode 100644
index 0000000..71ccf69
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/SearchPlanItem.java
@@ -0,0 +1,27 @@
+package kr.ac.smu.cs.shalendar_java;
+
+public class SearchPlanItem {
+ String planname;
+ int sid;
+
+ public SearchPlanItem(String planname, int sid) {
+ this.planname = planname;
+ this.sid = sid;
+ }
+
+ public String getPlanname() {
+ return planname;
+ }
+
+ public void setPlanname(String planname) {
+ this.planname = planname;
+ }
+
+ public int getSid() {
+ return sid;
+ }
+
+ public void setSid(int sid) {
+ this.sid = sid;
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/SettingActivity.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/SettingActivity.java
new file mode 100644
index 0000000..59f36d6
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/SettingActivity.java
@@ -0,0 +1,35 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+import android.widget.ImageButton;
+import android.widget.TextView;
+
+/*
+ 설정 액티비티
+
+ */
+
+public class SettingActivity extends AppCompatActivity {
+
+ ImageButton backButton;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_setting);
+
+ backButton = findViewById(R.id.btn_back);
+ backButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ onBackPressed();
+ }
+ });
+
+
+ }
+
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/Sidebar.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/Sidebar.java
new file mode 100644
index 0000000..e0d591d
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/Sidebar.java
@@ -0,0 +1,281 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.Manifest;
+import android.content.ActivityNotFoundException;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.database.Cursor;
+import android.graphics.drawable.ShapeDrawable;
+import android.graphics.drawable.shapes.OvalShape;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.provider.MediaStore;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.content.ContextCompat;
+import android.support.v4.content.CursorLoader;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.koushikdutta.async.future.Future;
+import com.koushikdutta.async.future.FutureCallback;
+import com.koushikdutta.ion.Ion;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import static android.app.Activity.RESULT_OK;
+import static android.content.Context.MODE_PRIVATE;
+import static kr.ac.smu.cs.shalendar_java.CodeNumber.PICK_IMAGE_REQUEST;
+
+public class Sidebar extends LinearLayout implements View.OnClickListener {
+
+ //
+ ArrayList calendarRecyclerList;
+
+ public EventListener listener;
+
+ //사용자 TOken값
+ private String userToken;
+
+ //서버 통신
+ NetWorkUrl url = new NetWorkUrl();
+
+ //
+ private SidebarAdapter s_adapter;
+
+ //
+ public static String userProfile_Name;
+ public static String userProfile_ID;
+ public static String userProfile_ImgURL;
+
+
+ public void setEventListener(EventListener l) {
+ listener = l;
+ }
+
+ public interface EventListener {
+ void btnCancel();
+
+ void btnLevel1();
+
+ void btnLevel2();
+
+ void btnLevel3();
+
+ void btnInvited();
+
+ void image_profile();
+ }
+
+
+ public Sidebar(Context context) {
+ this(context, null);
+ init();
+ }
+
+ public Sidebar(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+
+ private void init() {
+ LayoutInflater.from(getContext()).inflate(R.layout.activity_sidebar, this, true);
+ findViewById(R.id.btn_cancel).setOnClickListener(this);
+ findViewById(R.id.btn_info).setOnClickListener(this);
+ findViewById(R.id.btn_setting).setOnClickListener(this);
+ findViewById(R.id.btn_add_calender).setOnClickListener(this);
+ findViewById(R.id.btn_invite).setOnClickListener(this);
+ findViewById(R.id.image_profile).setOnClickListener(this);
+
+
+ //사용자 ID 프로필 set
+ TextView userName = findViewById(R.id.userName_textView);
+ TextView userID = findViewById(R.id.userID_textView);
+ ImageView imageView = findViewById(R.id.image_profile);
+
+ SharedPreferences pref = getContext().getSharedPreferences("pref_USERTOKEN", MODE_PRIVATE);
+ userProfile_Name = pref.getString("userName", "DEFAULT :: USER");
+ userProfile_ID = pref.getString("userEmail", "DEFAULT :: MIND@");
+ userProfile_ImgURL = pref.getString("img_url", "DEFAULT :: profile_IMAGE");
+
+
+ userName.setText(userProfile_Name);
+ userID.setText(userProfile_ID);
+
+ Log.i("사용자 프로필 이미지??", userProfile_ImgURL);
+
+ if (!(userProfile_ImgURL.equals("DEFAULT :: profile_IMAGE"))) {
+
+ imageView.setBackground(new ShapeDrawable(new OvalShape()));
+ if(Build.VERSION.SDK_INT >= 21) {
+ imageView.setClipToOutline(true);
+ }
+
+ Ion.with(imageView)
+ .centerCrop()
+ .resize(250, 250)
+ .load(userProfile_ImgURL);
+ } else {
+ Toast.makeText(getContext(), "프로필 사진을 정해보세요~", Toast.LENGTH_SHORT).show();
+ Ion.with(imageView)
+ .centerCrop()
+ .placeholder(R.drawable.profile_default)
+ .resize(250, 250);
+ }
+
+ //리사이클러
+ calendarRecyclerList = new ArrayList<>();
+
+ insertData();
+
+ RecyclerView sidebarRecyclerView = (RecyclerView) findViewById(R.id.sideBarRecyclerView);
+ sidebarRecyclerView.setHasFixedSize(true);
+ s_adapter = new SidebarAdapter(sidebarRecyclerView.getContext(), calendarRecyclerList);
+ sidebarRecyclerView.setLayoutManager(new LinearLayoutManager(sidebarRecyclerView.getContext(), LinearLayout.VERTICAL, false));
+ sidebarRecyclerView.setAdapter(s_adapter);
+
+
+ //진권 추가
+ s_adapter.notifyDataSetChanged();
+
+ }
+
+ //서버에서 응답받은 것 파싱해서 여기에서 추가하면 된다.
+ public void insertData() {
+
+ //header로 보낼 token값 가져오기.
+ SharedPreferences pref = getContext().getSharedPreferences("pref_USERTOKEN", MODE_PRIVATE);
+ userToken = pref.getString("userToken", "NO_TOKEN");
+ Log.i("Sharepref에 저장된 토큰", userToken);
+
+ //통신 준비 --> ION
+ Ion.getDefault(getContext()).configure().setLogging("ion-sample", Log.DEBUG);
+ Ion.getDefault(getContext()).getConscryptMiddleware().enable(false);
+
+ //여기서는 요청시 보내는 data가 없음.
+ JsonObject json = new JsonObject();
+ json.addProperty("", "");
+
+ Future ion = Ion.with(getContext())
+ .load("POST", url.getServerUrl() + "/readAllCal")
+ .setHeader("Content-Type", "application/json")
+ .setHeader("Authorization", userToken)
+ .setJsonObjectBody(json)
+ .asJsonObject()
+ .setCallback(new FutureCallback() {
+ @Override
+ public void onCompleted(Exception e, JsonObject result) {
+
+ if (e != null) {
+ Toast.makeText(getContext(), "Sever Connection Error", Toast.LENGTH_LONG).show();
+ } else {
+ String message = result.get("message").getAsString();
+ Toast.makeText(getContext(), "달력을 불러옵니다~", Toast.LENGTH_LONG).show();
+ parseDataFromServer(message, result);
+ }
+ }
+ });
+ try {
+ ion.get();
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ //서버 응답 처리
+ public void parseDataFromServer(String message, JsonObject result) {
+ if (message.equals("success")) {
+ //달력정보를 JSONArray로 받는다.
+ JsonArray data = result.get("data").getAsJsonArray();
+
+ //cid값 가지는 배열
+ int[] cid_Array = new int[data.size()];
+
+ Log.i("공유달력 개수 ", Integer.toString(data.size()));
+
+
+ for (int i = 0; i < data.size(); i++) { //공유달력 개수
+ JsonObject innerData = data.get(i).getAsJsonObject();
+
+ //int cid = innerData.get("cid").getAsInt();
+ cid_Array[i] = innerData.get("cid").getAsInt();
+
+ //해당 달력 내 사용자들 정보를 JSONArray로 받는다.
+ JsonArray data2 = result.get("data2").getAsJsonArray();;
+ JsonArray innerData2 = data2.get(i).getAsJsonArray();
+
+ Log.i("전달 받은 cid", Integer.toString(cid_Array[i]));
+ Log.i("공유달력 내부의 사용자 명수 ", Integer.toString(innerData2.size()));
+
+ SidebarItem sitem = new SidebarItem();
+
+ sitem.setCalendarName(innerData.get("calName").getAsString());
+ sitem.setCalendarImage(innerData.get("img_url").getAsString());
+ sitem.setCalendarContent(innerData.get("calContent").getAsString());
+ sitem.setCalendar_ID(cid_Array[i]);
+
+ ArrayList stItem = new ArrayList<>();
+
+ for (int j = 0; j < innerData2.size(); j++) { //공유달력 내 사용자들 명수
+
+ Log.i("해당 달력에 있는 사용자이름", innerData2.get(j).getAsJsonObject().get("id").getAsString());
+ String imageURL;
+
+ if (innerData2.get(j).getAsJsonObject().get("img_url").isJsonNull())
+ imageURL = "DEFAULT :: profile_IMAGE";
+ else
+ imageURL = innerData2.get(j).getAsJsonObject().get("img_url").getAsString();
+
+ stItem.add(new SidebarTeamItem(imageURL));
+ }
+
+ sitem.setTeamImageList(stItem);
+ calendarRecyclerList.add(sitem);
+ }
+ } else {
+ Toast.makeText(getContext(), "사이드바에서 달력을 선택하세요", Toast.LENGTH_LONG).show();
+ }
+ }
+
+ @Override
+ public void onClick(View v) {
+ switch (v.getId()) {
+ case R.id.btn_cancel:
+ listener.btnCancel();
+ break;
+ case R.id.btn_info:
+ listener.btnLevel1();
+ break;
+ case R.id.btn_setting:
+ listener.btnLevel2();
+ break;
+ case R.id.btn_add_calender:
+ listener.btnLevel3();
+ break;
+ case R.id.btn_invite:
+ listener.btnInvited();
+ break;
+ case R.id.image_profile:
+ listener.image_profile();
+ default:
+ break;
+ }
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/SidebarAdapter.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/SidebarAdapter.java
new file mode 100644
index 0000000..ba97904
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/SidebarAdapter.java
@@ -0,0 +1,267 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.app.Activity;
+import android.app.ProgressDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.graphics.drawable.ShapeDrawable;
+import android.graphics.drawable.shapes.OvalShape;
+import android.support.v7.app.AlertDialog;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+
+import com.google.gson.JsonObject;
+import com.koushikdutta.async.future.FutureCallback;
+import com.koushikdutta.ion.Ion;
+
+import java.util.ArrayList;
+
+import static android.content.Context.MODE_PRIVATE;
+
+public class SidebarAdapter extends RecyclerView.Adapter {
+
+ private Context context;
+ private Context mContext;
+ private ArrayList calendarList;
+
+
+ public SidebarAdapter(Context mContext, ArrayList calendarList) {
+ this.mContext = mContext;
+ this.calendarList = calendarList;
+ }
+
+
+ @Override
+ public ItemRowHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+
+ context = parent.getContext();
+ LayoutInflater inflater = LayoutInflater.from(parent.getContext());
+ View itemView = inflater.inflate(R.layout.sidebaritem, parent, false);
+
+ return new ItemRowHolder(itemView);
+ }
+
+ @Override
+ public void onBindViewHolder(ItemRowHolder holder, int position) {
+ ArrayList teampicList = calendarList.get(position).getTeamImageList();
+
+ SidebarItem item = calendarList.get(position);
+ holder.setItem(item);
+
+ SidebarTeamAdapter st_adapter = new SidebarTeamAdapter(teampicList, mContext);
+
+ holder.sideteam_recyclerView.setHasFixedSize(true);
+ holder.sideteam_recyclerView.setLayoutManager(new LinearLayoutManager(mContext, LinearLayout.HORIZONTAL, false));
+ holder.sideteam_recyclerView.setAdapter(st_adapter);
+
+ }
+
+
+ @Override
+ public int getItemCount() {
+ return (null != calendarList ? calendarList.size() : 0);
+ }
+
+ public void addItem(SidebarItem item) {
+ calendarList.add(item);
+ }
+
+ public void setItems(ArrayList items) {
+ this.calendarList = items;
+ }
+
+ public SidebarItem getItem(int position) {
+ return calendarList.get(position);
+ }
+
+ public void setItem(int position, SidebarItem item) {
+ calendarList.set(position, item);
+ }
+
+
+ public class ItemRowHolder extends RecyclerView.ViewHolder {
+
+
+ TextView calendarSidebarName;
+ ImageView calendarSidebarImage;
+ RecyclerView sideteam_recyclerView;
+ ImageView toInviteMember;
+
+ int calendar_ID;
+ String calendarName;
+ String calendarContent;
+ NetWorkUrl url = new NetWorkUrl();
+
+
+ public ItemRowHolder(final View itemView) {
+ super(itemView);
+
+ this.sideteam_recyclerView = (RecyclerView) itemView.findViewById(R.id.sideBarTeamRecycler);
+ this.calendarSidebarName = (TextView) itemView.findViewById(R.id.calendarSidebarName);
+ this.calendarSidebarImage = (ImageView) itemView.findViewById(R.id.calendarSidebarImage);
+ this.toInviteMember = itemView.findViewById(R.id.sidebarList_invite_member);
+
+
+// 멤버 초대화면으로 이동.
+ toInviteMember.setOnClickListener(new View.OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+ MainActivity.cid = calendar_ID;
+ if (MainActivity.cid == 0) {
+ Toast.makeText(itemView.getContext(), "달력을 먼저 선택해주세요", Toast.LENGTH_SHORT).show();
+ } else {
+ Intent intent = new Intent(itemView.getContext(), InviteActivity.class);
+ intent.putExtra("cid", calendar_ID);
+ intent.putExtra("calName", calendarName);
+ itemView.getContext().startActivity(intent);
+ }
+ }
+ });
+
+
+ itemView.setOnClickListener(new View.OnClickListener() {
+ ///////////////////////////
+ /*
+ 사이드 바 달력 리스트에서 해당 달력 클릭 시
+ cid와 달력 이름등의 정보를 가지고
+ MainActivity로 돌아간다.
+ */
+ @Override
+ public void onClick(View v) {
+ Toast.makeText(v.getContext(), calendarSidebarName.getText() + Integer.toString(calendar_ID), Toast.LENGTH_SHORT).show();
+ MainActivity.cid = calendar_ID;
+ MainActivity.calName = calendarName;
+ Intent intent = new Intent(itemView.getContext(), MainActivity.class);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ itemView.getContext().startActivity(intent);
+ }
+ });
+
+
+ itemView.setOnLongClickListener(new View.OnLongClickListener()
+
+ {
+ @Override
+ public boolean onLongClick(View v) {
+ AlertDialog.Builder dialog = new AlertDialog.Builder(v.getContext());
+ dialog.setTitle("달력 수정/삭제");
+ dialog.setMessage("달력 수정, 삭제하십니까?")
+ .setPositiveButton("수정", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ //여기 캘린더 수정화면으로 바꿔야함
+ MainActivity.cid = calendar_ID;
+ Intent intent = new Intent(context, CreateCalendarActivity.class);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ //99999 캘린더 수정 코드
+ intent.putExtra("where", 99999);
+ intent.putExtra("cid", MainActivity.cid);
+ intent.putExtra("calImage", getItem(getAdapterPosition()).getCalendarImage());
+ intent.putExtra("calName", calendarName);
+ intent.putExtra("aboutCal",calendarContent);
+ context.startActivity(intent);
+ dialog.cancel();
+ }
+ })
+
+ .setNegativeButton("삭제", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ deleteCalendar(calendar_ID);
+ Intent intent = new Intent(context, MainActivity.class);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ MainActivity.cid = 0;
+ context.startActivity(intent);
+
+ dialog.cancel();
+ }
+ });
+
+ AlertDialog alertDialog = dialog.create();
+ alertDialog.show();
+ return false;
+ }
+ });
+ }
+
+
+ public void setCid(int calendar_ID) {
+ this.calendar_ID = calendar_ID;
+ }
+
+ public void setCalName(String calName) {
+ this.calendarName = calName;
+ }
+
+ public void setCalContent(String calContent) {
+ this.calendarContent = calContent;
+ }
+
+ public void setItem(SidebarItem item) {
+ calendarSidebarName.setText(item.getCalendarName());
+ setCid(item.getCalendar_ID());
+ setCalName(item.getCalendarName());
+ setCalContent(item.getCalendarContent());
+
+ Ion.with(calendarSidebarImage)
+ .centerCrop()
+ .placeholder(R.drawable.face)
+ .load(item.getCalendarImage());
+ }
+
+ public void deleteCalendar(int calendar_ID) {
+
+ SharedPreferences pref = context.getSharedPreferences("pref_USERTOKEN", MODE_PRIVATE);
+ String userToken = pref.getString("userToken", "NO_TOKEN");
+ Log.i("C::Sharepref에 저장된 토큰", userToken);
+
+
+ final ProgressDialog progressDialog = new ProgressDialog(context);
+ progressDialog.setMessage("공유 달력을 삭제 중 입니다~");
+ progressDialog.setProgressStyle(progressDialog.STYLE_SPINNER);
+ progressDialog.show();
+
+ JsonObject json = new JsonObject();
+ json.addProperty("cid", calendar_ID);
+ Log.i("선택된 달력 cid", Integer.toString(calendar_ID));
+
+ Ion.with(context.getApplicationContext())
+ .load("POST", url.getServerUrl() + "/deleteCal")
+ .setHeader("Content-Type", "application/json")
+ .setHeader("Authorization", userToken)
+ .setJsonObjectBody(json)
+ .asJsonObject()
+ .setCallback(new FutureCallback() {
+ @Override
+ public void onCompleted(Exception e, JsonObject result) {
+
+ if (e != null) {
+ Log.i("/DeleteCal", e.getMessage());
+ Toast.makeText(context, e.getMessage(), Toast.LENGTH_LONG).show();
+ } else {
+ String message = result.get("message").getAsString();
+ progressDialog.dismiss();
+ if (message.equals("success")) {
+ Toast.makeText(context, "삭제 " + message, Toast.LENGTH_LONG).show();
+ } else {
+ Toast.makeText(context, message, Toast.LENGTH_LONG).show();
+ }
+ }
+ }
+ });
+ }
+ }
+
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/SidebarItem.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/SidebarItem.java
new file mode 100644
index 0000000..f6d9d07
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/SidebarItem.java
@@ -0,0 +1,63 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.net.Uri;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+
+public class SidebarItem {
+
+ String calendarImage;
+ String calendarName;
+ String calendarContent;
+ //cid추가
+ int calendar_ID;
+
+ ArrayList teamImageList;
+
+ public SidebarItem() {
+
+ }
+
+ public String getCalendarImage() {
+
+ return calendarImage;
+ }
+
+ public void setCalendarImage(String calendarImage) {
+
+
+ this.calendarImage = calendarImage;
+ }
+
+ public String getCalendarName() {
+
+ return calendarName;
+ }
+
+
+ public void setCalendarName(String calendarName) {
+ this.calendarName = calendarName;
+ }
+
+ public void setCalendar_ID(int cid) { this.calendar_ID = cid; }
+
+ public int getCalendar_ID() { return this.calendar_ID; }
+
+ public void setCalendarContent(String calendarContent) {
+ this.calendarContent = calendarContent;
+ }
+
+ public String getCalendarContent() {
+ return this.calendarContent;
+ }
+
+ public ArrayList getTeamImageList() {
+ return teamImageList;
+ }
+
+ public void setTeamImageList(ArrayList teamImageList) {
+ this.teamImageList = teamImageList;
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/SidebarTeamAdapter.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/SidebarTeamAdapter.java
new file mode 100644
index 0000000..02c5b04
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/SidebarTeamAdapter.java
@@ -0,0 +1,57 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.content.Context;
+import android.graphics.drawable.ShapeDrawable;
+import android.graphics.drawable.shapes.OvalShape;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+
+import com.koushikdutta.ion.Ion;
+
+import java.util.ArrayList;
+
+public class SidebarTeamAdapter extends RecyclerView.Adapter{
+
+ private ArrayList teamPicList;
+ private Context mContext;
+
+
+ public SidebarTeamAdapter(ArrayList teamPicList, Context mContext) {
+ this.teamPicList = teamPicList;
+ this.mContext = mContext;
+ }
+
+ @Override
+ public TeamItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.sidebarteamitem, null);
+ SidebarTeamAdapter.TeamItemHolder th = new SidebarTeamAdapter.TeamItemHolder(v);
+ return th;
+ }
+
+ @Override
+ public void onBindViewHolder(TeamItemHolder holder, int position) {
+ SidebarTeamItem teamIteam = teamPicList.get(position);
+ Global global = new Global();
+
+ global.setProfileImage(holder.sideteamMatePic, teamIteam.getTeammatePic());
+ }
+
+ @Override
+ public int getItemCount() {
+ return (null != teamPicList ? teamPicList.size() : 0);
+ }
+
+ public class TeamItemHolder extends RecyclerView.ViewHolder {
+
+ protected ImageView sideteamMatePic;
+
+ public TeamItemHolder(View itemView) {
+ super(itemView);
+ this.sideteamMatePic = itemView.findViewById(R.id.sidebarTeamImage);
+
+ }
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/SidebarTeamItem.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/SidebarTeamItem.java
new file mode 100644
index 0000000..8f40e7a
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/SidebarTeamItem.java
@@ -0,0 +1,19 @@
+package kr.ac.smu.cs.shalendar_java;
+
+
+public class SidebarTeamItem {
+
+ private String teammatePic;
+
+ public SidebarTeamItem(String teammatePic) {
+ this.teammatePic = teammatePic;
+ }
+
+ public String getTeammatePic() {
+ return teammatePic;
+ }
+
+ public void setTeammatePic(String teammatePic) {
+ this.teammatePic = teammatePic;
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/SplashActivity.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/SplashActivity.java
new file mode 100644
index 0000000..fd043f3
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/SplashActivity.java
@@ -0,0 +1,30 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Handler;
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+
+public class SplashActivity extends Activity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_splash);
+
+ startLoading();
+ }
+
+ private void startLoading(){
+ Handler handler = new Handler();
+ handler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ Intent intent = new Intent(getBaseContext(), LoginActivity.class);
+ startActivity(intent);
+ finish();
+ }
+ }, 1500);
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/SundayDecorator.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/SundayDecorator.java
new file mode 100644
index 0000000..8c1274a
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/SundayDecorator.java
@@ -0,0 +1,29 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.graphics.Color;
+import android.text.style.ForegroundColorSpan;
+import com.prolificinteractive.materialcalendarview.CalendarDay;
+import com.prolificinteractive.materialcalendarview.DayViewDecorator;
+import com.prolificinteractive.materialcalendarview.DayViewFacade;
+
+import java.util.Calendar;
+
+public class SundayDecorator implements DayViewDecorator {
+
+ private final Calendar calendar = Calendar.getInstance();
+
+ public SundayDecorator() {
+ }
+
+ @Override
+ public boolean shouldDecorate(CalendarDay day) {
+ day.copyTo(calendar);
+ int weekDay = calendar.get(Calendar.DAY_OF_WEEK);
+ return weekDay == Calendar.SUNDAY;
+ }
+
+ @Override
+ public void decorate(DayViewFacade view) {
+ view.addSpan(new ForegroundColorSpan(Color.RED));
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/TeammemberAdapter.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/TeammemberAdapter.java
new file mode 100644
index 0000000..5197b36
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/TeammemberAdapter.java
@@ -0,0 +1,58 @@
+package kr.ac.smu.cs.shalendar_java;
+
+
+import android.content.Context;
+import android.support.annotation.NonNull;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import org.w3c.dom.Text;
+
+import java.util.ArrayList;
+
+public class TeammemberAdapter extends RecyclerView.Adapter {
+
+ private ArrayList mData=null;
+
+ //생성자
+ public TeammemberAdapter(ArrayList mData) {
+ this.mData = mData;
+ }
+
+ public class ViewHolder extends RecyclerView.ViewHolder{
+ TextView profilename;
+
+ public ViewHolder(@NonNull View itemView) {
+ super(itemView);
+ profilename = itemView.findViewById(R.id.teammember_profile_name);
+ }
+ }
+
+ @NonNull
+ @Override
+ public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
+ //context를 부모로 부터 받기
+ Context context = viewGroup.getContext();
+ //받은걸로 layoutinflator생성
+ LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ //어떤 레이아웃 가져와 뷰를 그릴지 결정
+ View view = inflater.inflate(R.layout.teammember_recyclerview_item,viewGroup,false);
+ //생성후 view홀더 만들기
+ TeammemberAdapter.ViewHolder vh = new TeammemberAdapter.ViewHolder(view);
+ return vh;
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
+ String name = mData.get(i);
+ viewHolder.profilename.setText(name);
+ }
+
+ @Override
+ public int getItemCount() {
+ return mData.size();
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/UpdatePlanActivity.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/UpdatePlanActivity.java
new file mode 100644
index 0000000..364616a
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/UpdatePlanActivity.java
@@ -0,0 +1,443 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.app.DatePickerDialog;
+import android.app.ProgressDialog;
+import android.app.TimePickerDialog;
+import android.content.Intent;
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.DatePicker;
+import android.widget.EditText;
+import android.widget.ImageButton;
+import android.widget.TextView;
+import android.widget.TimePicker;
+import android.widget.Toast;
+
+import com.google.gson.JsonObject;
+import com.koushikdutta.async.future.FutureCallback;
+import com.koushikdutta.ion.Ion;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+/*
+ 일정 수정 화면
+ 수정 완료 버튼을 누르면 메인 으로 넘어간다.
+
+ */
+public class UpdatePlanActivity extends AppCompatActivity {
+
+ private Button buttonCompleteUpdate;
+ private EditText planTitle;
+ private EditText aboutPlan;
+ private EditText location;
+ private TextView startDate;
+ private TextView endDate;
+ private TextView startTime;
+ private TextView endTime;
+ private Button buttonToRecommandTime;
+ private Button buttonCompleteRegister;
+ private TextView recommandedTime;
+ ImageButton backButton;
+
+ //서버로 보낼 data
+ private String scheTitle;
+ private String strStartDate;
+ private String strStartTime;
+ private String strEndDate;
+ private String strEndTime;
+ private String aboutSched;
+ private String strLocation;
+
+ //시작 날짜, 종료 날짜 비교
+ int intFirstday, intLastday, intFirstmon, intLastmon;
+ int startHour, startMinute, endHour, endMinute;
+
+ private NetWorkUrl url = new NetWorkUrl();
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_update_plan);
+
+ Ion.getDefault(this).configure().setLogging("ion-sample", Log.DEBUG);
+ Ion.getDefault(this).getConscryptMiddleware().enable(false);
+
+ //buttonCompleteUpdate = findViewById(R.id.sendButton);
+ planTitle = findViewById(R.id.update_title_EditText);
+ aboutPlan = findViewById(R.id.update_aboutPlan_EditText);
+ location = findViewById(R.id.update_location_EditText);
+ startDate = findViewById(R.id.update_startDate_TextView);
+ endDate = findViewById(R.id.update_endDate_TextView);
+ startTime = findViewById(R.id.update_startTime_TextView);
+ endTime = findViewById(R.id.update_endTime_TextView);
+ buttonToRecommandTime = findViewById(R.id.update_getTime_Button);
+ buttonCompleteRegister = findViewById(R.id.update_registerPlan_Button);
+ recommandedTime = findViewById(R.id.update_getTime_TextView);
+
+ Intent intent = getIntent();
+ int sid_update = intent.getIntExtra("sid_update", 0);
+
+ //서버로 부터 이전 data들 받아와 set하기
+ JsonObject json = new JsonObject();
+
+ json.addProperty("sid", sid_update);
+
+ final ProgressDialog progressDialog = new ProgressDialog(UpdatePlanActivity.this);
+ progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
+ progressDialog.setMessage("이전 정보를 불러오는 중입니다~");
+ progressDialog.show();
+
+
+ Ion.with(getApplicationContext())
+ .load("POST", url.getServerUrl() + "/showSche")
+ .setHeader("Content-Type", "application/json")
+ .setJsonObjectBody(json)
+ .asJsonObject() //응답
+ .setCallback(new FutureCallback() {
+ @Override
+ public void onCompleted(Exception e, JsonObject result) {
+ //응답 받을 변수
+ String userName_up, schedTitle_up, aboutSched_up, schedLocation_up;
+ String start_up, startDate_up, startTime_up, end_up, endDate_up, endTime_up, startToEnd_up;
+
+ if (e != null) {
+ Toast.makeText(getApplicationContext(), "Server Connection Error!", Toast.LENGTH_LONG).show();
+ } else {
+
+ String message = result.get("message").getAsString();
+ //서버로 부터 응답 메세지가 success이면...
+
+ if (message.equals("success")) {
+ //서버 응답 오면 로딩 창 해제
+ progressDialog.dismiss();
+
+ //data: {} 에서 {}안에 있는 것들도 JsonObject
+ JsonObject data = result.get("data").getAsJsonObject();
+
+ userName_up = data.get("id").getAsString();
+ schedTitle_up = data.get("title").getAsString();
+ aboutSched_up = data.get("sContent").getAsString();
+ schedLocation_up = data.get("area").getAsString();
+ start_up = data.get("startDate").getAsString();
+// startTime_up = data.get("startTime").getAsString();
+ end_up = data.get("endDate").getAsString();
+// endTime = data.get("endTime").getAsString();
+
+
+ //뒤에 0.000 잘라내기
+ startDate_up = start_up.substring(0, 10);
+ int year_s = Integer.parseInt(start_up.substring(0,4));
+ int month_s = Integer.parseInt(start_up.substring(5,7));
+ int dayOfMonth_s = Integer.parseInt(start_up.substring(8,10));
+ strStartDate = dateFormatByUserCase(1, year_s, month_s-1, dayOfMonth_s);
+
+ startTime_up = start_up.substring(11, 16);
+ String hourOfDay_s = startTime_up.substring(0,2);
+ String minute_s = startTime_up.substring(3,5);
+ endDate_up = end_up.substring(0, 10);
+ int year_e = Integer.parseInt(end_up.substring(0,4));
+ int month_e = Integer.parseInt(end_up.substring(5,7));
+ int dayOfMonth_e = Integer.parseInt(end_up.substring(8,10));
+ strEndDate = dateFormatByUserCase(2, year_e, month_e-1, dayOfMonth_e);
+
+ endTime_up = end_up.substring(11, 16);
+ String hourOfDay_e = startTime_up.substring(0,2);
+ String minute_e = startTime_up.substring(3,5);
+
+ SimpleDateFormat format1 = new SimpleDateFormat("HH:mm");
+ try {
+ Date date_s = format1.parse("" + hourOfDay_s + ":" + minute_s);
+ Date date_e = format1.parse("" + hourOfDay_e + ":" + minute_e);
+ startTime.setText(new SimpleDateFormat("hh:mm a").format(date_s.getTime()));
+ strStartTime = new SimpleDateFormat("HH:mm:ss").format(date_s.getTime());
+ endTime.setText(new SimpleDateFormat("hh:mm a").format(date_e.getTime()));
+ strEndTime = new SimpleDateFormat("HH:mm:ss").format(date_e.getTime());
+ Log.i("수정 시작 시간", strStartTime);
+ Log.i("수정 끝 시간", strEndTime);
+
+ } catch (Exception e2) {
+ e2.printStackTrace();
+ }
+
+ planTitle.setText(schedTitle_up);
+ aboutPlan.setText(aboutSched_up);
+ location.setText(schedLocation_up);
+
+ Log.i("result", data.get("id").getAsString());
+ } else {
+
+ Toast.makeText(getApplicationContext(), "해당 일정이 없습니다.", Toast.LENGTH_LONG).show();
+ }
+
+ }
+ }
+ });
+
+ //날짜 선택
+ initDate();
+
+ //시간 선택
+ initTime();
+
+ buttonCompleteRegister.setOnClickListener(new View.OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+
+ Toast.makeText(getApplicationContext(), "일정 수정중 입니다.", Toast.LENGTH_SHORT).show();
+
+ scheTitle = planTitle.getText().toString().trim();
+ aboutSched = aboutPlan.getText().toString().trim();
+ strLocation = planTitle.getText().toString().trim();
+
+
+ JsonObject json = new JsonObject();
+
+ json.addProperty("sid", Global.getSid());
+ json.addProperty("title", scheTitle);
+ json.addProperty("sContent", aboutSched);
+ json.addProperty("startDate", strStartDate + " " + strStartTime);
+ //json.addProperty("startTime",strStartTime);
+ json.addProperty("endDate", strEndDate + " " + strEndTime);
+ //json.addProperty("endTime",strEndTime);
+ json.addProperty("area", strLocation);
+
+ final ProgressDialog progressDialog = new ProgressDialog(UpdatePlanActivity.this);
+ progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
+ progressDialog.setMessage("잠시만 기다려주세요. 해당 수정된 일정을 등록 중 입니다~");
+ progressDialog.show();
+
+
+ Ion.with(getApplicationContext())
+ .load("POST", url.getServerUrl() + "/updateSche")
+ .progressDialog(progressDialog)
+ //요청 헤더 지정
+ .setHeader("Content-Type", "application/json")
+ .setJsonObjectBody(json)
+ .asJsonObject()
+ .setCallback(new FutureCallback() {
+ @Override
+ public void onCompleted(Exception e, JsonObject result) {
+
+ if (e != null) {
+ Toast.makeText(getApplicationContext(), "Error during Server Connection", Toast.LENGTH_LONG).show();
+ } else {
+ progressDialog.cancel();
+ Intent intent = new Intent(getApplicationContext(), MainActivity.class);
+ startActivity(intent);
+ finish();
+ }
+ }
+ });
+ }
+ });
+
+ ImageButton backButton = findViewById(R.id.btn_back);
+ backButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ onBackPressed();
+ }
+ });
+ }
+
+
+ //시간 설정
+ private void initTime() {
+ final Calendar cal = Calendar.getInstance();
+ startTime.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ TimePickerDialog dialog = new TimePickerDialog(UpdatePlanActivity.this, new TimePickerDialog.OnTimeSetListener() {
+ @Override
+ public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
+
+ startHour = hourOfDay;
+ startMinute = minute;
+
+ Log.d("시작시간", Integer.toString(hourOfDay));
+ Log.d("시작 분", Integer.toString(minute));
+
+ /*
+ 뷰에 보여주는 시간 형식 08:12 오후
+ */
+ SimpleDateFormat format1 = new SimpleDateFormat("HH:mm");
+ //SimpleDateFormat format2 = new SimpleDateFormat("HH-mm-ss");
+ try {
+ Date date1 = format1.parse("" + hourOfDay + ":" + minute);
+ startTime.setText(new SimpleDateFormat("hh:mm a").format(date1.getTime()));
+ strStartTime = new SimpleDateFormat("HH:mm:ss").format(date1.getTime());
+ Log.i("시작 시간", strStartTime);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }, cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), false);
+ dialog.show();
+ }
+ });
+
+
+ endTime.setOnClickListener(new View.OnClickListener() {
+ final Calendar cal = Calendar.getInstance();
+
+ @Override
+ public void onClick(View v) {
+ TimePickerDialog dialog = new TimePickerDialog(UpdatePlanActivity.this, new TimePickerDialog.OnTimeSetListener() {
+ @Override
+ public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
+ endHour = hourOfDay;
+ endMinute = minute;
+
+ Log.d("끝 시간", Integer.toString(hourOfDay));
+ Log.d("끝 분", Integer.toString(minute));
+
+ SimpleDateFormat format = new SimpleDateFormat("HH:mm");
+ try {
+ Date date2 = format.parse("" + hourOfDay + ":" + minute);
+ endTime.setText(new SimpleDateFormat("hh:mm a").format(date2.getTime()));
+ strEndTime = new SimpleDateFormat("HH-mm-ss").format(date2.getTime());
+ Log.i("종료시간", strEndTime);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }, cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), false);
+ dialog.show();
+ }
+ });
+ }
+
+ private void initDate() {
+ final Calendar cal = Calendar.getInstance();
+ //시작 날짜 선택
+ startDate.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ DatePickerDialog dialog = new DatePickerDialog(UpdatePlanActivity.this, new DatePickerDialog.OnDateSetListener() {
+ @Override
+ public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
+ //month = 0부터 시작한다.
+ intFirstmon = month;
+ intFirstday = dayOfMonth;
+ strStartDate = dateFormatByUserCase(1, year, month, dayOfMonth);
+
+ Log.i("시작 날짜", strStartDate);
+
+
+ }
+ }, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE));
+ //dialog.getDatePicker().setMaxDate(new Date().getTime());//입력한 날짜 이후로 클릭 안되게 옵션
+ dialog.show();
+ }
+ });
+
+ //마지막 날짜 선택
+ endDate.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ DatePickerDialog dialog = new DatePickerDialog(UpdatePlanActivity.this, new DatePickerDialog.OnDateSetListener() {
+ @Override
+ public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
+ intLastmon = month;
+ intLastday = dayOfMonth;
+ checkDate(intFirstmon, intLastmon, intFirstday, intLastday, year);
+ }
+
+ }, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE));
+ //dialog.getDatePicker().setMaxDate(new Date().getTime());//입력한 날짜 이후로 클릭 안되게 옵션
+ dialog.show();
+ }
+ });
+ }
+
+
+ private void checkDate(int firstMon, int lastMon, int firstDay, int lastDay, int lastYear) {
+
+ if (firstMon < lastMon) {
+ strEndDate = dateFormatByUserCase(2, lastYear, lastMon, lastDay);
+
+ } else if (firstMon > lastMon) {
+ Toast.makeText(UpdatePlanActivity.this, "다시 입력해주세요.", Toast.LENGTH_LONG).show();
+
+ } else {
+ if (firstDay > lastDay) {
+ Toast.makeText(UpdatePlanActivity.this, "다시 입력해주세요.", Toast.LENGTH_LONG).show();
+
+ } else {
+ strEndDate = dateFormatByUserCase(2, lastYear, lastMon, lastDay);
+ Log.i("종료 날짜", strEndDate);
+ }
+ }
+ }
+
+ /*
+ flag값에 따라
+ selectFirst에 setText할지
+ selectLast에 setText할지 구분해주는 메소드.
+ */
+ private void setSelectFirstOrSelectLast(int flag, String txtmsg) {
+ if (flag == 1)
+ startDate.setText(txtmsg);
+ else if (flag == 2)
+ endDate.setText(txtmsg);
+ }
+
+ /*
+ 출력형식을 '2018-08-15'와 같이 지정해주는 메소드.
+ return 타입 : String
+ 이 함수를 이용하여 strFirstDate, strLastDate에 만들어진 형식을 저장할 수 있다.
+ */
+
+ private String dateFormatByUserCase(int flag, int year, int month, int dayOfMonth) {
+
+ String format = null;
+ String txtmsg;
+
+ SimpleDateFormat dateformat = new SimpleDateFormat("EEE");
+ Date date = new Date(year, month, dayOfMonth - 1);
+ String dayOfWeek = dateformat.format(date);
+
+ if (month + 1 < 10) {
+ int ten_month = (month + 1) / 10;
+ int one_month = (month + 1) % 10;
+
+ String month1 = Integer.toString(ten_month) + Integer.toString(one_month);
+
+ if (dayOfMonth < 10) {
+ int ten_date = (dayOfMonth) / 10;
+ int one_date = (dayOfMonth) % 10;
+ String date1 = Integer.toString(ten_date) + Integer.toString(one_date);
+
+ txtmsg = month1 + "월" + date1 + "일" + String.format("(%s)", dayOfWeek);
+ format = String.format("%d-", year) + month1 + "-" + date1;
+
+ setSelectFirstOrSelectLast(flag, txtmsg);
+ } else if (dayOfMonth >= 10) {
+ txtmsg = month1 + "월" + String.format("%d일", dayOfMonth) + String.format("(%s)", dayOfWeek);
+ format = String.format("%d-", year) + month1 + "-" + String.format("%d", dayOfMonth);
+ setSelectFirstOrSelectLast(flag, txtmsg);
+ }
+ } else if (month + 1 >= 10) {
+ if (dayOfMonth < 10) {
+ int ten_date = (dayOfMonth) / 10;
+ int one_date = (dayOfMonth) % 10;
+ String date1 = Integer.toString(ten_date) + Integer.toString(one_date);
+
+ txtmsg = (month + 1) + "월" + date1 + "일" + String.format("(%s)", dayOfWeek);
+ format = String.format("%d-", year) + (month + 1) + "-" + date1; //String.format("%d일", dayOfMonth);
+ setSelectFirstOrSelectLast(flag, txtmsg);
+ } else if (dayOfMonth >= 10) {
+ txtmsg = (month + 1) + "월" + String.format("%d일", dayOfMonth) + String.format("(%s)", dayOfWeek);
+ format = String.format("%d-", year) + (month + 1) + "-" + String.format("%d", dayOfMonth);
+ setSelectFirstOrSelectLast(flag, txtmsg);
+ }
+ }
+ return format;
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/UserEmail.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/UserEmail.java
new file mode 100644
index 0000000..5e8e170
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/UserEmail.java
@@ -0,0 +1,51 @@
+package kr.ac.smu.cs.shalendar_java;
+
+/*
+
+ 공유달력의 멤버 초대 화면에서
+ Email RecyclerView를 하기 위한 Email클라스
+ */
+public class UserEmail {
+
+ private String userImageURL;
+ private String user_Email;
+ private Boolean is_checked;
+
+ public UserEmail(String user_Email) {
+ this.user_Email = user_Email;
+ }
+
+ public UserEmail(String user_Email, Boolean is_checked) {
+ this.user_Email = user_Email;
+ this.is_checked = is_checked;
+ }
+ public UserEmail(String user_Email, Boolean is_checked, String userImageURL) {
+ this.user_Email = user_Email;
+ this.is_checked = is_checked;
+ this.userImageURL = userImageURL;
+ }
+
+ public void setUserEmail(String user_Email) {
+ this.user_Email = user_Email;
+ }
+
+ public String getUserEmail() {
+ return this.user_Email;
+ }
+
+ public void setIs_checked(Boolean is_checked) {
+ this.is_checked = is_checked;
+ }
+
+ public Boolean getIs_checked() {
+ return this.is_checked;
+ }
+
+ public void setUserImageURL(String userImageURL) {
+ this.userImageURL = userImageURL;
+ }
+
+ public String getUserImageURL() {
+ return this.userImageURL;
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/UserEmailAdapter.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/UserEmailAdapter.java
new file mode 100644
index 0000000..afb80dc
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/UserEmailAdapter.java
@@ -0,0 +1,116 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.graphics.drawable.ShapeDrawable;
+import android.graphics.drawable.shapes.OvalShape;
+import android.os.Build;
+import android.support.annotation.NonNull;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.CheckBox;
+import android.widget.ImageView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.koushikdutta.ion.Ion;
+
+import java.util.ArrayList;
+
+public class UserEmailAdapter extends RecyclerView.Adapter {
+
+ ArrayList items = new ArrayList<>();
+
+ @NonNull
+ @Override
+ public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
+
+ LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
+ View itemView = inflater.inflate(R.layout.custom_recycleview_invite_item, viewGroup, false);
+
+ return new ViewHolder(itemView);
+ }
+
+ @Override
+ public void onBindViewHolder(ViewHolder holder, int position) {
+
+ final int pos = position;
+
+ UserEmail item = items.get(position);
+ holder.setItem(item);
+
+ holder.checkBox.setChecked(items.get(pos).getIs_checked());
+ holder.checkBox.setTag(items.get(pos));
+
+ holder.checkBox.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ CheckBox checkBox = (CheckBox) v;
+ UserEmail contact = (UserEmail) checkBox.getTag();
+
+ contact.setIs_checked(checkBox.isChecked());
+ items.get(pos).setIs_checked(checkBox.isChecked());
+
+ Toast.makeText(v.getContext(), "Clicked on Checkbox: " + checkBox.getText() + " is " + checkBox.isChecked(), Toast.LENGTH_LONG).show();
+
+ }
+ });
+ }
+
+ @Override
+ public int getItemCount() {
+ return items.size();
+ }
+
+ public void addItem(UserEmail item) {
+ items.add(item);
+ }
+
+ public void setItems(ArrayList items) {
+ this.items = items;
+ }
+
+ public UserEmail getItem(int position) {
+ return items.get(position);
+ }
+
+ public void setItem(int position, UserEmail item) {
+ items.set(position, item);
+ }
+
+
+ static class ViewHolder extends RecyclerView.ViewHolder {
+
+ ImageView userImage;
+ TextView userEmail;
+ CheckBox checkBox;
+
+ public ViewHolder(View itemView) {
+ super(itemView);
+
+ userImage = itemView.findViewById(R.id.inviteList_userImage);
+ userEmail = itemView.findViewById(R.id.registeredUserEmail_TextView);
+ checkBox = itemView.findViewById(R.id.checkBox);
+
+
+ }
+
+ public void setItem(UserEmail item) {
+
+ if (!(userImage.equals("DEFAULT :: profile_IMAGE"))) {
+ Ion.with(userImage)
+ .centerCrop()
+ .resize(250, 250)
+ .load(item.getUserImageURL());
+ } else {
+ userImage.setImageResource(R.drawable.profile_default);
+ }
+ userImage.setBackground(new ShapeDrawable(new OvalShape()));
+ if(Build.VERSION.SDK_INT >= 21) {
+ userImage.setClipToOutline(true);
+ }
+ userEmail.setText(item.getUserEmail());
+ }
+
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/WaitInvite.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/WaitInvite.java
new file mode 100644
index 0000000..89916ae
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/WaitInvite.java
@@ -0,0 +1,246 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.Manifest;
+import android.app.ProgressDialog;
+import android.content.ActivityNotFoundException;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.util.Log;
+import android.view.View;
+import android.widget.ImageButton;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.Toast;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.koushikdutta.async.future.Future;
+import com.koushikdutta.async.future.FutureCallback;
+import com.koushikdutta.ion.Ion;
+
+import java.util.ArrayList;
+
+import static kr.ac.smu.cs.shalendar_java.CodeNumber.PICK_IMAGE_REQUEST;
+
+public class WaitInvite extends AppCompatActivity {
+
+
+ ArrayList waitRecyclerList;
+ private Context mContext = WaitInvite.this;
+ private String imageURL;
+ private ImageView imageView;
+ private Boolean isExitFlag = false;
+ ImageButton backButton;
+
+ //
+ private String userToken;
+
+ //서버 통신
+ NetWorkUrl url = new NetWorkUrl();
+
+ //
+
+ private String senderID;
+ private String receiver;
+ private String senderName;
+ private String sender_img;
+ private int cid;
+ private String calName;
+
+ //
+ private WaitlistAdapter w_adapter;
+ private RecyclerView waitInviteRecyclerView;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_wait_invite);
+ waitRecyclerList=new ArrayList<>();
+
+ waitInviteRecyclerView = (RecyclerView)findViewById(R.id.waitListRecycler);
+ waitInviteRecyclerView.setHasFixedSize(true);
+ w_adapter = new WaitlistAdapter(waitRecyclerList, this);
+ waitInviteRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayout.VERTICAL, false));
+
+
+ backButton = findViewById(R.id.btn_back);
+ backButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ onBackPressed();
+ }
+ });
+
+
+
+ SharedPreferences pref = getSharedPreferences("pref_USERTOKEN", MODE_PRIVATE);
+ //값이 없으면 default로 0
+ userToken = pref.getString("userToken", "NO_TOKEN");
+ Log.i("초대 대기 화면 :: 사용자 토큰", userToken);
+
+
+ //통신 준비.
+ Ion.getDefault(this).configure().setLogging("ion-sample", Log.DEBUG);
+ Ion.getDefault(this).getConscryptMiddleware().enable(false);
+
+ JsonObject json = new JsonObject();
+ json.addProperty("", "");
+
+ final ProgressDialog progressDialog = new ProgressDialog(WaitInvite.this);
+ progressDialog.setMessage("초대 리스트 불러오는 중 입니다~");
+ progressDialog.setProgressStyle(progressDialog.STYLE_SPINNER);
+ progressDialog.show();
+
+ Future ion = Ion.with(getApplicationContext())
+ .load("POST", url.getServerUrl() + "/showInvitation")
+ .setHeader("Content-Type", "application/json")
+ .setHeader("Authorization", userToken)
+ .setTimeout(60000)
+ .progressDialog(progressDialog)
+ .setJsonObjectBody(json)
+ .asJsonObject()
+ .setCallback(new FutureCallback() {
+ @Override
+ public void onCompleted(Exception e, JsonObject result) {
+
+ if(e != null) {
+ Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
+ }
+ else {
+ String message = result.get("message").getAsString();
+
+ if(message.equals("success")) {
+ parseDataFromServer(result);
+ } else if(message.equals("nothing")) {
+ Toast.makeText(getApplicationContext(), "초대 받은 내역이 없습니다.", Toast.LENGTH_LONG).show();
+ } else if(message.equals("fail")) {
+ Toast.makeText(getApplicationContext(), "초대 중 에러가 발생하였습니다.", Toast.LENGTH_LONG).show();
+ } else {
+ Toast.makeText(getApplicationContext(), "잘못된 응답 메세지 입니다.", Toast.LENGTH_LONG).show();
+ }
+ }
+ }
+
+ });
+
+ //응답 받아올 때 까지 대기.
+ try {
+ ion.get();
+ progressDialog.dismiss();
+ } catch(Exception e){
+ e.printStackTrace();
+ }
+
+
+ w_adapter.setOnItemClickListener(new WaitlistAdapter.OnItemClickListener() {
+
+ private int ACCEPT_FLAG;
+
+ @Override
+ public void onAcceptClick(View v, int pos) {
+ ACCEPT_FLAG = 1;
+ String senderEmail = waitRecyclerList.get(pos).emailID;
+ String receiver = waitRecyclerList.get(pos).invitedName;
+ int cid = waitRecyclerList.get(pos).cid;
+
+ Log.i("SenderEmail", senderEmail);
+ Log.i("receiver", receiver);
+ Log.i("FLAG", Integer.toString(ACCEPT_FLAG));
+ Log.i("cid", Integer.toString(cid));
+
+ sendToServer(ACCEPT_FLAG, senderEmail, receiver, cid);
+ }
+
+ @Override
+ public void onRejectClick(View v, int pos) {
+ ACCEPT_FLAG = 0;
+ String senderEmail = waitRecyclerList.get(pos).emailID;
+ String receiver = waitRecyclerList.get(pos).invitedName;
+ int cid = waitRecyclerList.get(pos).cid;
+ sendToServer(ACCEPT_FLAG, senderEmail, receiver, cid);
+
+ Log.i("SenderEmail", senderEmail);
+ Log.i("receiver", receiver);
+ Log.i("FLAG", Integer.toString(ACCEPT_FLAG));
+ Log.i("cid", Integer.toString(cid));
+
+ }
+ });
+ }
+
+
+
+ public void parseDataFromServer(JsonObject result) {
+
+ JsonArray invitation = result.get("invitation").getAsJsonArray();
+
+ if(invitation.size() == 0)
+ Toast.makeText(getApplicationContext(), "초대 받은 내역이 없습니다.", Toast.LENGTH_LONG).show();
+ else {
+ for(int i = 0; i() {
+ @Override
+ public void onCompleted(Exception e, JsonObject result) {
+
+ if(e != null) {
+ Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
+ }
+ else {
+ String message = result.get("message").getAsString();
+ if(message.equals("accept")) {
+ Toast.makeText(getApplicationContext(), "초대 수락 완료", Toast.LENGTH_LONG).show();
+ Intent intent = new Intent(WaitInvite.this, MainActivity.class);
+ startActivity(intent);
+ finish();
+ }
+ else if (message.equals("reject")) {
+ Toast.makeText(getApplicationContext(), "초대 거절", Toast.LENGTH_LONG).show();
+ }
+ else {
+ Toast.makeText(getApplicationContext(), "초대 수락 실패", Toast.LENGTH_LONG).show();
+ }
+ }
+
+ }
+ });
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/WaitListItem.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/WaitListItem.java
new file mode 100644
index 0000000..6d35926
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/WaitListItem.java
@@ -0,0 +1,69 @@
+package kr.ac.smu.cs.shalendar_java;
+
+public class WaitListItem {
+
+ String waitPeoplePic;
+ String emailID;
+ String calendarName;
+ String invitedName;
+ String inviteName;
+
+ int cid;
+
+ public WaitListItem(String waitPeoplePic, String emailID, String calendarName, String invitedName, String inviteName, int cid) {
+ this.waitPeoplePic = waitPeoplePic;
+ this.emailID = emailID;
+ this.calendarName = calendarName;
+ this.invitedName = invitedName;
+ this.inviteName = inviteName;
+ this.cid = cid;
+ }
+
+ public String getWaitPeoplePic() {
+ return this.waitPeoplePic;
+ }
+
+ public void setWaitPeoplePic(String waitPeoplePic) {
+ this.waitPeoplePic = waitPeoplePic;
+ }
+
+ public String getEmailID() {
+ return emailID;
+ }
+
+ public void setEmailID(String emailID) {
+ this.emailID = emailID;
+ }
+
+ public String getCalendarName() {
+ return calendarName;
+ }
+
+ public void setCalendarName(String calendarName) {
+ this.calendarName = calendarName;
+ }
+
+ public String getInvitedName() {
+ return invitedName;
+ }
+
+ public void setInvitedName(String invitedName) {
+ this.invitedName = invitedName;
+ }
+
+ public String getInviteName() {
+ return inviteName;
+ }
+
+ public void setInviteName(String inviteName) {
+ this.inviteName = inviteName;
+ }
+
+ public int getCid() {
+ return this.cid;
+ }
+
+ public void setCid(int cid) {
+ this.cid = cid;
+ }
+}
diff --git a/app/src/main/java/kr/ac/smu/cs/shalendar_java/WaitlistAdapter.java b/app/src/main/java/kr/ac/smu/cs/shalendar_java/WaitlistAdapter.java
new file mode 100644
index 0000000..d61d321
--- /dev/null
+++ b/app/src/main/java/kr/ac/smu/cs/shalendar_java/WaitlistAdapter.java
@@ -0,0 +1,138 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.ShapeDrawable;
+import android.graphics.drawable.shapes.OvalShape;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.koushikdutta.ion.Ion;
+
+import java.util.ArrayList;
+
+public class WaitlistAdapter extends RecyclerView.Adapter {
+
+ private ArrayList waitList;
+ private Context context;
+
+ private OnItemClickListener mListener = null;
+
+
+ public WaitlistAdapter(ArrayList waitList, Context mContext) {
+ this.waitList = waitList;
+ this.context = mContext;
+ }
+
+ public interface OnItemClickListener {
+ void onAcceptClick(View v, int pos);
+ void onRejectClick(View v, int pos);
+ }
+
+ public void setOnItemClickListener(OnItemClickListener listener) {
+ this.mListener = listener;
+ }
+
+ @Override
+ public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+
+ context = parent.getContext();
+ RecyclerView.ViewHolder holder;
+ View view;
+
+ View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.waitlist_item, null);
+ WaitlistAdapter.ViewHolder mh = new WaitlistAdapter.ViewHolder(v);
+
+ return mh;
+ }
+
+
+
+ public void onBindViewHolder(ViewHolder holder, int position) {
+
+ Global global = new Global();
+
+ String waitPeopleImg = waitList.get(position).getWaitPeoplePic();
+ String senderEmailID = waitList.get(position).getEmailID();
+ String invitedCalName = waitList.get(position).getCalendarName();
+ String senderName = waitList.get(position).getInvitedName();
+ String receiverName = waitList.get(position).getInviteName();
+ int calendarID = waitList.get(position).getCid();
+
+ holder.inviteName.setText(senderName);
+ holder.invitedName.setText(receiverName);
+ holder.calendarName.setText(invitedCalName);
+ holder.emailID.setText(senderEmailID);
+ holder.setCalendarID(calendarID);
+
+ global.setProfileImage(holder.waitPeoplePic, waitPeopleImg);
+
+ }
+
+ @Override
+ public int getItemCount() {
+ return (null != waitList? waitList.size() : 0);
+ }
+
+ public void addItem(WaitListItem item){
+ waitList.add(item);
+ }
+
+ public class ViewHolder extends RecyclerView.ViewHolder {
+
+ protected ImageView waitPeoplePic;
+ protected TextView emailID;
+ protected TextView calendarName;
+ protected TextView invitedName;
+ protected TextView inviteName;
+ protected Button cancelButton;
+ protected Button acceptButton;
+
+ protected int calendarID;
+
+ public ViewHolder(View itemView) {
+
+ super(itemView);
+ this.waitPeoplePic=(ImageView)itemView.findViewById(R.id.waitListPicture);
+ this.emailID=(TextView)itemView.findViewById(R.id.waitListID);
+ this.calendarName=(TextView)itemView.findViewById(R.id.calendarName);
+ this.invitedName=(TextView)itemView.findViewById(R.id.invitedName);
+ this.inviteName=(TextView)itemView.findViewById(R.id.inviteName);
+ this.cancelButton = itemView.findViewById(R.id.inviteCancelButton);
+ this.acceptButton = itemView.findViewById(R.id.inviteAcceptButton);
+
+
+ acceptButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ int pos = getAdapterPosition();
+ if(pos != RecyclerView.NO_POSITION) {
+ if(mListener != null)
+ mListener.onAcceptClick(v, pos);
+ }
+ }
+ });
+
+ cancelButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ int pos = getAdapterPosition();
+ if(pos != RecyclerView.NO_POSITION) {
+ if(mListener != null)
+ mListener.onRejectClick(v, pos);
+ }
+ }
+ });
+ }
+
+ public void setCalendarID(int cid) {
+ this.calendarID = cid;
+ }
+ }
+}
diff --git a/app/src/main/res/anim/anim/sidebar_show.xml b/app/src/main/res/anim/anim/sidebar_show.xml
new file mode 100644
index 0000000..e235536
--- /dev/null
+++ b/app/src/main/res/anim/anim/sidebar_show.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/anim/anim/siderbar_hidden.xml b/app/src/main/res/anim/anim/siderbar_hidden.xml
new file mode 100644
index 0000000..5fd09d4
--- /dev/null
+++ b/app/src/main/res/anim/anim/siderbar_hidden.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/anim/maintranslate_down.xml b/app/src/main/res/anim/maintranslate_down.xml
new file mode 100644
index 0000000..8f6c6e7
--- /dev/null
+++ b/app/src/main/res/anim/maintranslate_down.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/anim/maintranslate_up.xml b/app/src/main/res/anim/maintranslate_up.xml
new file mode 100644
index 0000000..d80d7de
--- /dev/null
+++ b/app/src/main/res/anim/maintranslate_up.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/anim/sidebar_show.xml b/app/src/main/res/anim/sidebar_show.xml
new file mode 100644
index 0000000..ada4f1a
--- /dev/null
+++ b/app/src/main/res/anim/sidebar_show.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/anim/siderbar_hidden.xml b/app/src/main/res/anim/siderbar_hidden.xml
new file mode 100644
index 0000000..64d6829
--- /dev/null
+++ b/app/src/main/res/anim/siderbar_hidden.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/anim/translate_down.xml b/app/src/main/res/anim/translate_down.xml
new file mode 100644
index 0000000..eb4ec89
--- /dev/null
+++ b/app/src/main/res/anim/translate_down.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/anim/translate_up.xml b/app/src/main/res/anim/translate_up.xml
new file mode 100644
index 0000000..d80d7de
--- /dev/null
+++ b/app/src/main/res/anim/translate_up.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable-hdpi/btn_add_people1.png b/app/src/main/res/drawable-hdpi/btn_add_people1.png
new file mode 100644
index 0000000..2d128f8
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/btn_add_people1.png differ
diff --git a/app/src/main/res/drawable-hdpi/btn_back.png b/app/src/main/res/drawable-hdpi/btn_back.png
new file mode 100644
index 0000000..b5b4692
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/btn_back.png differ
diff --git a/app/src/main/res/drawable-hdpi/btn_search.png b/app/src/main/res/drawable-hdpi/btn_search.png
new file mode 100644
index 0000000..24fd893
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/btn_search.png differ
diff --git a/app/src/main/res/drawable-hdpi/btn_send_active.png b/app/src/main/res/drawable-hdpi/btn_send_active.png
new file mode 100644
index 0000000..ccbdef1
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/btn_send_active.png differ
diff --git a/app/src/main/res/drawable-hdpi/feed_comment_icon.png b/app/src/main/res/drawable-hdpi/feed_comment_icon.png
new file mode 100644
index 0000000..619ef3f
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/feed_comment_icon.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_add_date.png b/app/src/main/res/drawable-hdpi/ic_add_date.png
new file mode 100644
index 0000000..ba44298
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_add_date.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_arrow.png b/app/src/main/res/drawable-hdpi/ic_arrow.png
new file mode 100644
index 0000000..284e228
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_arrow.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_check_round.png b/app/src/main/res/drawable-hdpi/ic_check_round.png
new file mode 100644
index 0000000..a69b9fb
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_check_round.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_kakaotalk.png b/app/src/main/res/drawable-hdpi/ic_kakaotalk.png
new file mode 100644
index 0000000..14c015a
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_kakaotalk.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_location.png b/app/src/main/res/drawable-hdpi/ic_location.png
new file mode 100644
index 0000000..7308cd9
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_location.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_mail.png b/app/src/main/res/drawable-hdpi/ic_mail.png
new file mode 100644
index 0000000..456293c
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_mail.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_modify_pw.png b/app/src/main/res/drawable-hdpi/ic_modify_pw.png
new file mode 100644
index 0000000..f6e1f49
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_modify_pw.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_my_info.png b/app/src/main/res/drawable-hdpi/ic_my_info.png
new file mode 100644
index 0000000..3553f78
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_my_info.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_number_unsuccess.png b/app/src/main/res/drawable-hdpi/ic_number_unsuccess.png
new file mode 100644
index 0000000..6db2be8
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_number_unsuccess.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_signup_ok.png b/app/src/main/res/drawable-hdpi/ic_signup_ok.png
new file mode 100644
index 0000000..70416bc
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_signup_ok.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_signup_step_1_green.png b/app/src/main/res/drawable-hdpi/ic_signup_step_1_green.png
new file mode 100644
index 0000000..3f6075d
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_signup_step_1_green.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_signup_step_2_gray.png b/app/src/main/res/drawable-hdpi/ic_signup_step_2_gray.png
new file mode 100644
index 0000000..6a0d67d
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_signup_step_2_gray.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_signup_step_2_grren.png b/app/src/main/res/drawable-hdpi/ic_signup_step_2_grren.png
new file mode 100644
index 0000000..71736e7
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_signup_step_2_grren.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_signup_step_3_gray.png b/app/src/main/res/drawable-hdpi/ic_signup_step_3_gray.png
new file mode 100644
index 0000000..372f993
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_signup_step_3_gray.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_signup_step_3_green.png b/app/src/main/res/drawable-hdpi/ic_signup_step_3_green.png
new file mode 100644
index 0000000..b521537
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_signup_step_3_green.png differ
diff --git a/app/src/main/res/drawable-hdpi/profile_default.png b/app/src/main/res/drawable-hdpi/profile_default.png
new file mode 100644
index 0000000..156cc6f
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/profile_default.png differ
diff --git a/app/src/main/res/drawable-hdpi/shplash_bg.png b/app/src/main/res/drawable-hdpi/shplash_bg.png
new file mode 100644
index 0000000..8b30cf0
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/shplash_bg.png differ
diff --git a/app/src/main/res/drawable-hdpi/sign_logo.png b/app/src/main/res/drawable-hdpi/sign_logo.png
new file mode 100644
index 0000000..bb435c9
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/sign_logo.png differ
diff --git a/app/src/main/res/drawable-hdpi/tab_1_active.png b/app/src/main/res/drawable-hdpi/tab_1_active.png
new file mode 100644
index 0000000..204bf6b
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/tab_1_active.png differ
diff --git a/app/src/main/res/drawable-hdpi/tab_2.png b/app/src/main/res/drawable-hdpi/tab_2.png
new file mode 100644
index 0000000..465820b
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/tab_2.png differ
diff --git a/app/src/main/res/drawable-hdpi/tab_3_active.png b/app/src/main/res/drawable-hdpi/tab_3_active.png
new file mode 100644
index 0000000..8c7cdbf
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/tab_3_active.png differ
diff --git a/app/src/main/res/drawable-hdpi/tab_3_inactive.png b/app/src/main/res/drawable-hdpi/tab_3_inactive.png
new file mode 100644
index 0000000..f30214b
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/tab_3_inactive.png differ
diff --git a/app/src/main/res/drawable-hdpi/wow.JPG b/app/src/main/res/drawable-hdpi/wow.JPG
new file mode 100644
index 0000000..b327b0c
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/wow.JPG differ
diff --git a/app/src/main/res/drawable-hdpi/woww.JPG b/app/src/main/res/drawable-hdpi/woww.JPG
new file mode 100644
index 0000000..9bb5ac2
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/woww.JPG differ
diff --git a/app/src/main/res/drawable-mdpi/btn_add_people.png b/app/src/main/res/drawable-mdpi/btn_add_people.png
new file mode 100644
index 0000000..7258eed
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/btn_add_people.png differ
diff --git a/app/src/main/res/drawable-mdpi/btn_delete.png b/app/src/main/res/drawable-mdpi/btn_delete.png
new file mode 100644
index 0000000..8a806e8
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/btn_delete.png differ
diff --git a/app/src/main/res/drawable-mdpi/btn_search.png b/app/src/main/res/drawable-mdpi/btn_search.png
new file mode 100644
index 0000000..1ddecf8
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/btn_search.png differ
diff --git a/app/src/main/res/drawable-mdpi/btn_send.png b/app/src/main/res/drawable-mdpi/btn_send.png
new file mode 100644
index 0000000..8e3bc1b
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/btn_send.png differ
diff --git a/app/src/main/res/drawable-mdpi/btn_send_active.png b/app/src/main/res/drawable-mdpi/btn_send_active.png
new file mode 100644
index 0000000..b264cbe
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/btn_send_active.png differ
diff --git a/app/src/main/res/drawable-mdpi/btn_sidemenu.png b/app/src/main/res/drawable-mdpi/btn_sidemenu.png
new file mode 100644
index 0000000..bb0bcde
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/btn_sidemenu.png differ
diff --git a/app/src/main/res/drawable-mdpi/feed_comment_icon.png b/app/src/main/res/drawable-mdpi/feed_comment_icon.png
new file mode 100644
index 0000000..149d6d9
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/feed_comment_icon.png differ
diff --git a/app/src/main/res/drawable-mdpi/group_4.png b/app/src/main/res/drawable-mdpi/group_4.png
new file mode 100644
index 0000000..445eefe
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/group_4.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_add_calendar.png b/app/src/main/res/drawable-mdpi/ic_add_calendar.png
new file mode 100644
index 0000000..91c11fc
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_add_calendar.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_add_date.png b/app/src/main/res/drawable-mdpi/ic_add_date.png
new file mode 100644
index 0000000..a15f2bb
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_add_date.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_arrow.png b/app/src/main/res/drawable-mdpi/ic_arrow.png
new file mode 100644
index 0000000..7ec3787
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_arrow.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_check_round.png b/app/src/main/res/drawable-mdpi/ic_check_round.png
new file mode 100644
index 0000000..86e7023
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_check_round.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_info.png b/app/src/main/res/drawable-mdpi/ic_info.png
new file mode 100644
index 0000000..537a5e4
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_info.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_kakaotalk.png b/app/src/main/res/drawable-mdpi/ic_kakaotalk.png
new file mode 100644
index 0000000..149364a
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_kakaotalk.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_location.png b/app/src/main/res/drawable-mdpi/ic_location.png
new file mode 100644
index 0000000..67d0f00
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_location.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_mail.png b/app/src/main/res/drawable-mdpi/ic_mail.png
new file mode 100644
index 0000000..79f09b6
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_mail.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_modify_pw.png b/app/src/main/res/drawable-mdpi/ic_modify_pw.png
new file mode 100644
index 0000000..6909ebe
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_modify_pw.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_my_info.png b/app/src/main/res/drawable-mdpi/ic_my_info.png
new file mode 100644
index 0000000..fc5faf2
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_my_info.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_num_1.png b/app/src/main/res/drawable-mdpi/ic_num_1.png
new file mode 100644
index 0000000..6cf1309
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_num_1.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_num_2.png b/app/src/main/res/drawable-mdpi/ic_num_2.png
new file mode 100644
index 0000000..04d4660
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_num_2.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_num_3.png b/app/src/main/res/drawable-mdpi/ic_num_3.png
new file mode 100644
index 0000000..0f42e4a
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_num_3.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_num_4.png b/app/src/main/res/drawable-mdpi/ic_num_4.png
new file mode 100644
index 0000000..302b288
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_num_4.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_num_5.png b/app/src/main/res/drawable-mdpi/ic_num_5.png
new file mode 100644
index 0000000..8e41ccd
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_num_5.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_number_unsuccess.png b/app/src/main/res/drawable-mdpi/ic_number_unsuccess.png
new file mode 100644
index 0000000..37c2c63
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_number_unsuccess.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_setting.png b/app/src/main/res/drawable-mdpi/ic_setting.png
new file mode 100644
index 0000000..8979482
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_setting.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_signup_ok.png b/app/src/main/res/drawable-mdpi/ic_signup_ok.png
new file mode 100644
index 0000000..4c463d4
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_signup_ok.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_signup_step_1_green.png b/app/src/main/res/drawable-mdpi/ic_signup_step_1_green.png
new file mode 100644
index 0000000..07b5a55
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_signup_step_1_green.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_signup_step_2_gray.png b/app/src/main/res/drawable-mdpi/ic_signup_step_2_gray.png
new file mode 100644
index 0000000..363da88
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_signup_step_2_gray.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_signup_step_2_grren.png b/app/src/main/res/drawable-mdpi/ic_signup_step_2_grren.png
new file mode 100644
index 0000000..88d264f
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_signup_step_2_grren.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_signup_step_3_gray.png b/app/src/main/res/drawable-mdpi/ic_signup_step_3_gray.png
new file mode 100644
index 0000000..3496b4e
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_signup_step_3_gray.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_signup_step_3_green.png b/app/src/main/res/drawable-mdpi/ic_signup_step_3_green.png
new file mode 100644
index 0000000..9f536ce
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_signup_step_3_green.png differ
diff --git a/app/src/main/res/drawable-mdpi/img_calendar_default.png b/app/src/main/res/drawable-mdpi/img_calendar_default.png
new file mode 100644
index 0000000..7dc72d1
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/img_calendar_default.png differ
diff --git a/app/src/main/res/drawable-mdpi/img_thumbnail_default.png b/app/src/main/res/drawable-mdpi/img_thumbnail_default.png
new file mode 100644
index 0000000..fc3ae6f
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/img_thumbnail_default.png differ
diff --git a/app/src/main/res/drawable-mdpi/shplash_bg.png b/app/src/main/res/drawable-mdpi/shplash_bg.png
new file mode 100644
index 0000000..bb2270b
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/shplash_bg.png differ
diff --git a/app/src/main/res/drawable-mdpi/sign_logo.png b/app/src/main/res/drawable-mdpi/sign_logo.png
new file mode 100644
index 0000000..e42fb38
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/sign_logo.png differ
diff --git a/app/src/main/res/drawable-mdpi/spyderpig.jpg b/app/src/main/res/drawable-mdpi/spyderpig.jpg
new file mode 100644
index 0000000..7675e12
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/spyderpig.jpg differ
diff --git a/app/src/main/res/drawable-mdpi/tab_1_active.png b/app/src/main/res/drawable-mdpi/tab_1_active.png
new file mode 100644
index 0000000..39cd7e9
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/tab_1_active.png differ
diff --git a/app/src/main/res/drawable-mdpi/tab_1_inactive.png b/app/src/main/res/drawable-mdpi/tab_1_inactive.png
new file mode 100644
index 0000000..a182663
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/tab_1_inactive.png differ
diff --git a/app/src/main/res/drawable-mdpi/tab_2.png b/app/src/main/res/drawable-mdpi/tab_2.png
new file mode 100644
index 0000000..9f346cf
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/tab_2.png differ
diff --git a/app/src/main/res/drawable-mdpi/tab_3_active.png b/app/src/main/res/drawable-mdpi/tab_3_active.png
new file mode 100644
index 0000000..4b48119
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/tab_3_active.png differ
diff --git a/app/src/main/res/drawable-mdpi/tab_3_inactive.png b/app/src/main/res/drawable-mdpi/tab_3_inactive.png
new file mode 100644
index 0000000..93e3433
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/tab_3_inactive.png differ
diff --git a/app/src/main/res/drawable-v21/face.jpg b/app/src/main/res/drawable-v21/face.jpg
new file mode 100644
index 0000000..fd7c488
Binary files /dev/null and b/app/src/main/res/drawable-v21/face.jpg differ
diff --git a/app/src/main/res/drawable-v21/ic_menu_camera.xml b/app/src/main/res/drawable-v21/ic_menu_camera.xml
new file mode 100644
index 0000000..634fe92
--- /dev/null
+++ b/app/src/main/res/drawable-v21/ic_menu_camera.xml
@@ -0,0 +1,12 @@
+
+
+
+
diff --git a/app/src/main/res/drawable-v21/ic_menu_gallery.xml b/app/src/main/res/drawable-v21/ic_menu_gallery.xml
new file mode 100644
index 0000000..03c7709
--- /dev/null
+++ b/app/src/main/res/drawable-v21/ic_menu_gallery.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable-v21/ic_menu_manage.xml b/app/src/main/res/drawable-v21/ic_menu_manage.xml
new file mode 100644
index 0000000..aeb047d
--- /dev/null
+++ b/app/src/main/res/drawable-v21/ic_menu_manage.xml
@@ -0,0 +1,9 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable-v21/ic_menu_send.xml b/app/src/main/res/drawable-v21/ic_menu_send.xml
new file mode 100644
index 0000000..fdf1c90
--- /dev/null
+++ b/app/src/main/res/drawable-v21/ic_menu_send.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable-v21/ic_menu_share.xml b/app/src/main/res/drawable-v21/ic_menu_share.xml
new file mode 100644
index 0000000..338d95a
--- /dev/null
+++ b/app/src/main/res/drawable-v21/ic_menu_share.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable-v21/ic_menu_slideshow.xml b/app/src/main/res/drawable-v21/ic_menu_slideshow.xml
new file mode 100644
index 0000000..5e9e163
--- /dev/null
+++ b/app/src/main/res/drawable-v21/ic_menu_slideshow.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable-v21/main_ani_downarrow.png b/app/src/main/res/drawable-v21/main_ani_downarrow.png
new file mode 100644
index 0000000..dd88a8c
Binary files /dev/null and b/app/src/main/res/drawable-v21/main_ani_downarrow.png differ
diff --git a/app/src/main/res/drawable-v21/pinkarrow.png b/app/src/main/res/drawable-v21/pinkarrow.png
new file mode 100644
index 0000000..1026fcd
Binary files /dev/null and b/app/src/main/res/drawable-v21/pinkarrow.png differ
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..1f6bb29
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable-v24/tempboardpic.PNG b/app/src/main/res/drawable-v24/tempboardpic.PNG
new file mode 100644
index 0000000..d644a0e
Binary files /dev/null and b/app/src/main/res/drawable-v24/tempboardpic.PNG differ
diff --git a/app/src/main/res/drawable-v24/temppeoplesam.PNG b/app/src/main/res/drawable-v24/temppeoplesam.PNG
new file mode 100644
index 0000000..096bd00
Binary files /dev/null and b/app/src/main/res/drawable-v24/temppeoplesam.PNG differ
diff --git a/app/src/main/res/drawable-xhdpi/btn_add_people.png b/app/src/main/res/drawable-xhdpi/btn_add_people.png
new file mode 100644
index 0000000..fb4409a
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/btn_add_people.png differ
diff --git a/app/src/main/res/drawable-xhdpi/btn_delete.png b/app/src/main/res/drawable-xhdpi/btn_delete.png
new file mode 100644
index 0000000..952aae6
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/btn_delete.png differ
diff --git a/app/src/main/res/drawable-xhdpi/btn_search.png b/app/src/main/res/drawable-xhdpi/btn_search.png
new file mode 100644
index 0000000..fa0f100
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/btn_search.png differ
diff --git a/app/src/main/res/drawable-xhdpi/btn_send.png b/app/src/main/res/drawable-xhdpi/btn_send.png
new file mode 100644
index 0000000..4b2f747
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/btn_send.png differ
diff --git a/app/src/main/res/drawable-xhdpi/btn_send_active.png b/app/src/main/res/drawable-xhdpi/btn_send_active.png
new file mode 100644
index 0000000..b3dec1c
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/btn_send_active.png differ
diff --git a/app/src/main/res/drawable-xhdpi/btn_sidemenu.png b/app/src/main/res/drawable-xhdpi/btn_sidemenu.png
new file mode 100644
index 0000000..8d8404c
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/btn_sidemenu.png differ
diff --git a/app/src/main/res/drawable-xhdpi/feed_comment_icon.png b/app/src/main/res/drawable-xhdpi/feed_comment_icon.png
new file mode 100644
index 0000000..9426c90
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/feed_comment_icon.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_add_calendar.png b/app/src/main/res/drawable-xhdpi/ic_add_calendar.png
new file mode 100644
index 0000000..e184285
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_add_calendar.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_add_date.png b/app/src/main/res/drawable-xhdpi/ic_add_date.png
new file mode 100644
index 0000000..2cd6249
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_add_date.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_arrow.png b/app/src/main/res/drawable-xhdpi/ic_arrow.png
new file mode 100644
index 0000000..15560e4
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_arrow.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_check_round.png b/app/src/main/res/drawable-xhdpi/ic_check_round.png
new file mode 100644
index 0000000..b34e3aa
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_check_round.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_info.png b/app/src/main/res/drawable-xhdpi/ic_info.png
new file mode 100644
index 0000000..75d1ab7
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_info.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_kakaotalk.png b/app/src/main/res/drawable-xhdpi/ic_kakaotalk.png
new file mode 100644
index 0000000..f94a208
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_kakaotalk.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_location.png b/app/src/main/res/drawable-xhdpi/ic_location.png
new file mode 100644
index 0000000..e597e1c
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_location.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_mail.png b/app/src/main/res/drawable-xhdpi/ic_mail.png
new file mode 100644
index 0000000..f59d663
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_mail.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_modify_pw.png b/app/src/main/res/drawable-xhdpi/ic_modify_pw.png
new file mode 100644
index 0000000..c67cc4a
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_modify_pw.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_my_info.png b/app/src/main/res/drawable-xhdpi/ic_my_info.png
new file mode 100644
index 0000000..3909060
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_my_info.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_num_1.png b/app/src/main/res/drawable-xhdpi/ic_num_1.png
new file mode 100644
index 0000000..0fe681b
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_num_1.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_num_2.png b/app/src/main/res/drawable-xhdpi/ic_num_2.png
new file mode 100644
index 0000000..9aed6ce
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_num_2.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_num_3.png b/app/src/main/res/drawable-xhdpi/ic_num_3.png
new file mode 100644
index 0000000..647e402
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_num_3.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_num_4.png b/app/src/main/res/drawable-xhdpi/ic_num_4.png
new file mode 100644
index 0000000..0fd7dc3
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_num_4.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_num_5.png b/app/src/main/res/drawable-xhdpi/ic_num_5.png
new file mode 100644
index 0000000..bd38e0f
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_num_5.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_number_unsuccess.png b/app/src/main/res/drawable-xhdpi/ic_number_unsuccess.png
new file mode 100644
index 0000000..06b4f0a
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_number_unsuccess.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_setting.png b/app/src/main/res/drawable-xhdpi/ic_setting.png
new file mode 100644
index 0000000..4f910df
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_setting.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_signup_ok.png b/app/src/main/res/drawable-xhdpi/ic_signup_ok.png
new file mode 100644
index 0000000..1d9f5f8
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_signup_ok.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_signup_step_1_green.png b/app/src/main/res/drawable-xhdpi/ic_signup_step_1_green.png
new file mode 100644
index 0000000..9f3ea49
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_signup_step_1_green.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_signup_step_2_gray.png b/app/src/main/res/drawable-xhdpi/ic_signup_step_2_gray.png
new file mode 100644
index 0000000..378782f
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_signup_step_2_gray.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_signup_step_2_grren.png b/app/src/main/res/drawable-xhdpi/ic_signup_step_2_grren.png
new file mode 100644
index 0000000..0e65bfd
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_signup_step_2_grren.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_signup_step_3_gray.png b/app/src/main/res/drawable-xhdpi/ic_signup_step_3_gray.png
new file mode 100644
index 0000000..cccd1b4
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_signup_step_3_gray.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_signup_step_3_green.png b/app/src/main/res/drawable-xhdpi/ic_signup_step_3_green.png
new file mode 100644
index 0000000..1b25058
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_signup_step_3_green.png differ
diff --git a/app/src/main/res/drawable-xhdpi/img_calendar_default.png b/app/src/main/res/drawable-xhdpi/img_calendar_default.png
new file mode 100644
index 0000000..5a27813
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/img_calendar_default.png differ
diff --git a/app/src/main/res/drawable-xhdpi/img_thumbnail_default.png b/app/src/main/res/drawable-xhdpi/img_thumbnail_default.png
new file mode 100644
index 0000000..b602100
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/img_thumbnail_default.png differ
diff --git a/app/src/main/res/drawable-xhdpi/shplash_bg.png b/app/src/main/res/drawable-xhdpi/shplash_bg.png
new file mode 100644
index 0000000..5085e83
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/shplash_bg.png differ
diff --git a/app/src/main/res/drawable-xhdpi/sign_logo.png b/app/src/main/res/drawable-xhdpi/sign_logo.png
new file mode 100644
index 0000000..38ae08c
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/sign_logo.png differ
diff --git a/app/src/main/res/drawable-xhdpi/tab_1_active.png b/app/src/main/res/drawable-xhdpi/tab_1_active.png
new file mode 100644
index 0000000..66ed429
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/tab_1_active.png differ
diff --git a/app/src/main/res/drawable-xhdpi/tab_1_inactive.png b/app/src/main/res/drawable-xhdpi/tab_1_inactive.png
new file mode 100644
index 0000000..f7f22bf
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/tab_1_inactive.png differ
diff --git a/app/src/main/res/drawable-xhdpi/tab_2.png b/app/src/main/res/drawable-xhdpi/tab_2.png
new file mode 100644
index 0000000..e56decd
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/tab_2.png differ
diff --git a/app/src/main/res/drawable-xhdpi/tab_3_active.png b/app/src/main/res/drawable-xhdpi/tab_3_active.png
new file mode 100644
index 0000000..453664c
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/tab_3_active.png differ
diff --git a/app/src/main/res/drawable-xhdpi/tab_3_inactive.png b/app/src/main/res/drawable-xhdpi/tab_3_inactive.png
new file mode 100644
index 0000000..784241d
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/tab_3_inactive.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/avatarinsideacircle_122011.png b/app/src/main/res/drawable-xxhdpi/avatarinsideacircle_122011.png
new file mode 100644
index 0000000..eae81aa
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/avatarinsideacircle_122011.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/btn_add_people.png b/app/src/main/res/drawable-xxhdpi/btn_add_people.png
new file mode 100644
index 0000000..4cdbfab
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/btn_add_people.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/btn_delete.png b/app/src/main/res/drawable-xxhdpi/btn_delete.png
new file mode 100644
index 0000000..4db2d11
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/btn_delete.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/btn_search.png b/app/src/main/res/drawable-xxhdpi/btn_search.png
new file mode 100644
index 0000000..30485d2
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/btn_search.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/btn_send.png b/app/src/main/res/drawable-xxhdpi/btn_send.png
new file mode 100644
index 0000000..ff51728
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/btn_send.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/btn_send_active.png b/app/src/main/res/drawable-xxhdpi/btn_send_active.png
new file mode 100644
index 0000000..3bfbe9d
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/btn_send_active.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/btn_sidemenu.png b/app/src/main/res/drawable-xxhdpi/btn_sidemenu.png
new file mode 100644
index 0000000..6951ca3
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/btn_sidemenu.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/feed_comment_icon.png b/app/src/main/res/drawable-xxhdpi/feed_comment_icon.png
new file mode 100644
index 0000000..2ce221a
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/feed_comment_icon.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_add_calendar.png b/app/src/main/res/drawable-xxhdpi/ic_add_calendar.png
new file mode 100644
index 0000000..21740f4
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_add_calendar.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_add_date.png b/app/src/main/res/drawable-xxhdpi/ic_add_date.png
new file mode 100644
index 0000000..0c523df
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_add_date.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_arrow.png b/app/src/main/res/drawable-xxhdpi/ic_arrow.png
new file mode 100644
index 0000000..8e7f532
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_arrow.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_check_round.png b/app/src/main/res/drawable-xxhdpi/ic_check_round.png
new file mode 100644
index 0000000..b0d4e7c
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_check_round.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_info.png b/app/src/main/res/drawable-xxhdpi/ic_info.png
new file mode 100644
index 0000000..4d4ea07
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_info.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_kakaotalk.png b/app/src/main/res/drawable-xxhdpi/ic_kakaotalk.png
new file mode 100644
index 0000000..f9b6cd8
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_kakaotalk.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_mail.png b/app/src/main/res/drawable-xxhdpi/ic_mail.png
new file mode 100644
index 0000000..8b24128
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_mail.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_modify_pw.png b/app/src/main/res/drawable-xxhdpi/ic_modify_pw.png
new file mode 100644
index 0000000..c985983
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_modify_pw.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_my_info.png b/app/src/main/res/drawable-xxhdpi/ic_my_info.png
new file mode 100644
index 0000000..5f35db0
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_my_info.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_num_1.png b/app/src/main/res/drawable-xxhdpi/ic_num_1.png
new file mode 100644
index 0000000..bf22d4d
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_num_1.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_num_2.png b/app/src/main/res/drawable-xxhdpi/ic_num_2.png
new file mode 100644
index 0000000..b18d162
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_num_2.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_num_3.png b/app/src/main/res/drawable-xxhdpi/ic_num_3.png
new file mode 100644
index 0000000..36af13c
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_num_3.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_num_4.png b/app/src/main/res/drawable-xxhdpi/ic_num_4.png
new file mode 100644
index 0000000..d060962
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_num_4.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_num_5.png b/app/src/main/res/drawable-xxhdpi/ic_num_5.png
new file mode 100644
index 0000000..dba4e61
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_num_5.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_number_unsuccess.png b/app/src/main/res/drawable-xxhdpi/ic_number_unsuccess.png
new file mode 100644
index 0000000..9607f64
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_number_unsuccess.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_setting.png b/app/src/main/res/drawable-xxhdpi/ic_setting.png
new file mode 100644
index 0000000..c78d695
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_setting.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_signup_ok.png b/app/src/main/res/drawable-xxhdpi/ic_signup_ok.png
new file mode 100644
index 0000000..cdaebe2
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_signup_ok.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_signup_step_1_green.png b/app/src/main/res/drawable-xxhdpi/ic_signup_step_1_green.png
new file mode 100644
index 0000000..a8e3571
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_signup_step_1_green.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_signup_step_2_gray.png b/app/src/main/res/drawable-xxhdpi/ic_signup_step_2_gray.png
new file mode 100644
index 0000000..f86ac4a
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_signup_step_2_gray.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_signup_step_2_grren.png b/app/src/main/res/drawable-xxhdpi/ic_signup_step_2_grren.png
new file mode 100644
index 0000000..1a1fddd
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_signup_step_2_grren.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_signup_step_3_gray.png b/app/src/main/res/drawable-xxhdpi/ic_signup_step_3_gray.png
new file mode 100644
index 0000000..5b93398
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_signup_step_3_gray.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_signup_step_3_green.png b/app/src/main/res/drawable-xxhdpi/ic_signup_step_3_green.png
new file mode 100644
index 0000000..30f29b6
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_signup_step_3_green.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/img_calendar_default.png b/app/src/main/res/drawable-xxhdpi/img_calendar_default.png
new file mode 100644
index 0000000..04bca7b
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/img_calendar_default.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/img_thumbnail_default.png b/app/src/main/res/drawable-xxhdpi/img_thumbnail_default.png
new file mode 100644
index 0000000..a6e3b60
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/img_thumbnail_default.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/shplash_bg.png b/app/src/main/res/drawable-xxhdpi/shplash_bg.png
new file mode 100644
index 0000000..c86fa05
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/shplash_bg.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/sign_logo.png b/app/src/main/res/drawable-xxhdpi/sign_logo.png
new file mode 100644
index 0000000..ede1d7b
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/sign_logo.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/tab_1_active.png b/app/src/main/res/drawable-xxhdpi/tab_1_active.png
new file mode 100644
index 0000000..67adea1
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/tab_1_active.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/tab_1_inactive.png b/app/src/main/res/drawable-xxhdpi/tab_1_inactive.png
new file mode 100644
index 0000000..a96bd57
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/tab_1_inactive.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/tab_2.png b/app/src/main/res/drawable-xxhdpi/tab_2.png
new file mode 100644
index 0000000..abd5d87
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/tab_2.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/tab_3_active.png b/app/src/main/res/drawable-xxhdpi/tab_3_active.png
new file mode 100644
index 0000000..cd6adf0
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/tab_3_active.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/tab_3_inactive.png b/app/src/main/res/drawable-xxhdpi/tab_3_inactive.png
new file mode 100644
index 0000000..12873b3
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/tab_3_inactive.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/btn_add_people.png b/app/src/main/res/drawable-xxxhdpi/btn_add_people.png
new file mode 100644
index 0000000..5154968
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/btn_add_people.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/btn_delete.png b/app/src/main/res/drawable-xxxhdpi/btn_delete.png
new file mode 100644
index 0000000..a27bde2
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/btn_delete.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/btn_search.png b/app/src/main/res/drawable-xxxhdpi/btn_search.png
new file mode 100644
index 0000000..c6a2edd
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/btn_search.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/btn_send.png b/app/src/main/res/drawable-xxxhdpi/btn_send.png
new file mode 100644
index 0000000..e93f3c9
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/btn_send.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/btn_send_active.png b/app/src/main/res/drawable-xxxhdpi/btn_send_active.png
new file mode 100644
index 0000000..ef2f4b8
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/btn_send_active.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/btn_sidemenu.png b/app/src/main/res/drawable-xxxhdpi/btn_sidemenu.png
new file mode 100644
index 0000000..568df8d
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/btn_sidemenu.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/feed_comment_icon.png b/app/src/main/res/drawable-xxxhdpi/feed_comment_icon.png
new file mode 100644
index 0000000..d67aa8e
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/feed_comment_icon.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_add_calendar.png b/app/src/main/res/drawable-xxxhdpi/ic_add_calendar.png
new file mode 100644
index 0000000..c0b6f39
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_add_calendar.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_add_date.png b/app/src/main/res/drawable-xxxhdpi/ic_add_date.png
new file mode 100644
index 0000000..3f3a451
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_add_date.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_check_round.png b/app/src/main/res/drawable-xxxhdpi/ic_check_round.png
new file mode 100644
index 0000000..6632777
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_check_round.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_info.png b/app/src/main/res/drawable-xxxhdpi/ic_info.png
new file mode 100644
index 0000000..98851dc
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_info.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_kakaotalk.png b/app/src/main/res/drawable-xxxhdpi/ic_kakaotalk.png
new file mode 100644
index 0000000..03764da
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_kakaotalk.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_mail.png b/app/src/main/res/drawable-xxxhdpi/ic_mail.png
new file mode 100644
index 0000000..bb74b9e
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_mail.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_modify_pw.png b/app/src/main/res/drawable-xxxhdpi/ic_modify_pw.png
new file mode 100644
index 0000000..96799aa
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_modify_pw.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_my_info.png b/app/src/main/res/drawable-xxxhdpi/ic_my_info.png
new file mode 100644
index 0000000..70caa10
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_my_info.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_num_1.png b/app/src/main/res/drawable-xxxhdpi/ic_num_1.png
new file mode 100644
index 0000000..3b24ef9
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_num_1.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_num_2.png b/app/src/main/res/drawable-xxxhdpi/ic_num_2.png
new file mode 100644
index 0000000..3324048
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_num_2.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_num_3.png b/app/src/main/res/drawable-xxxhdpi/ic_num_3.png
new file mode 100644
index 0000000..bf34626
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_num_3.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_num_4.png b/app/src/main/res/drawable-xxxhdpi/ic_num_4.png
new file mode 100644
index 0000000..0483cfb
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_num_4.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_num_5.png b/app/src/main/res/drawable-xxxhdpi/ic_num_5.png
new file mode 100644
index 0000000..dadc7ce
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_num_5.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_number_unsuccess.png b/app/src/main/res/drawable-xxxhdpi/ic_number_unsuccess.png
new file mode 100644
index 0000000..b7dbefe
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_number_unsuccess.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_setting.png b/app/src/main/res/drawable-xxxhdpi/ic_setting.png
new file mode 100644
index 0000000..4e1e770
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_setting.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_signup_ok.png b/app/src/main/res/drawable-xxxhdpi/ic_signup_ok.png
new file mode 100644
index 0000000..fcce410
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_signup_ok.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_signup_step_1_green.png b/app/src/main/res/drawable-xxxhdpi/ic_signup_step_1_green.png
new file mode 100644
index 0000000..15b76df
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_signup_step_1_green.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_signup_step_2_gray.png b/app/src/main/res/drawable-xxxhdpi/ic_signup_step_2_gray.png
new file mode 100644
index 0000000..ce91a63
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_signup_step_2_gray.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_signup_step_2_grren.png b/app/src/main/res/drawable-xxxhdpi/ic_signup_step_2_grren.png
new file mode 100644
index 0000000..df86d97
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_signup_step_2_grren.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_signup_step_3_gray.png b/app/src/main/res/drawable-xxxhdpi/ic_signup_step_3_gray.png
new file mode 100644
index 0000000..b8f7147
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_signup_step_3_gray.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_signup_step_3_green.png b/app/src/main/res/drawable-xxxhdpi/ic_signup_step_3_green.png
new file mode 100644
index 0000000..f887e10
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_signup_step_3_green.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/img_calendar_default.png b/app/src/main/res/drawable-xxxhdpi/img_calendar_default.png
new file mode 100644
index 0000000..d48af1f
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/img_calendar_default.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/img_thumbnail_default.png b/app/src/main/res/drawable-xxxhdpi/img_thumbnail_default.png
new file mode 100644
index 0000000..3226c91
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/img_thumbnail_default.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/shplash_bg.png b/app/src/main/res/drawable-xxxhdpi/shplash_bg.png
new file mode 100644
index 0000000..13e534b
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/shplash_bg.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/tab_1_active.png b/app/src/main/res/drawable-xxxhdpi/tab_1_active.png
new file mode 100644
index 0000000..e649492
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/tab_1_active.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/tab_1_inactive.png b/app/src/main/res/drawable-xxxhdpi/tab_1_inactive.png
new file mode 100644
index 0000000..bc0d703
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/tab_1_inactive.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/tab_2.png b/app/src/main/res/drawable-xxxhdpi/tab_2.png
new file mode 100644
index 0000000..6418712
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/tab_2.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/tab_3_active.png b/app/src/main/res/drawable-xxxhdpi/tab_3_active.png
new file mode 100644
index 0000000..03a96be
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/tab_3_active.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/tab_3_inactive.png b/app/src/main/res/drawable-xxxhdpi/tab_3_inactive.png
new file mode 100644
index 0000000..ffc26a3
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/tab_3_inactive.png differ
diff --git a/app/src/main/res/drawable/background_rounding.xml b/app/src/main/res/drawable/background_rounding.xml
new file mode 100644
index 0000000..439d45f
--- /dev/null
+++ b/app/src/main/res/drawable/background_rounding.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/circle.xml b/app/src/main/res/drawable/circle.xml
new file mode 100644
index 0000000..0d923d2
--- /dev/null
+++ b/app/src/main/res/drawable/circle.xml
@@ -0,0 +1,5 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/createborderline.xml b/app/src/main/res/drawable/createborderline.xml
new file mode 100644
index 0000000..d93a7ec
--- /dev/null
+++ b/app/src/main/res/drawable/createborderline.xml
@@ -0,0 +1,11 @@
+
+
+ android:padding = "10dp"
+ android:shape="rectangle"
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..0d025f9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_search.png b/app/src/main/res/drawable/ic_search.png
new file mode 100644
index 0000000..0e97d63
Binary files /dev/null and b/app/src/main/res/drawable/ic_search.png differ
diff --git a/app/src/main/res/drawable/launcher.png b/app/src/main/res/drawable/launcher.png
new file mode 100644
index 0000000..37b13e8
Binary files /dev/null and b/app/src/main/res/drawable/launcher.png differ
diff --git a/app/src/main/res/drawable/login_round_button_email.xml b/app/src/main/res/drawable/login_round_button_email.xml
new file mode 100644
index 0000000..0cdbec4
--- /dev/null
+++ b/app/src/main/res/drawable/login_round_button_email.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/login_round_button_kakao.xml b/app/src/main/res/drawable/login_round_button_kakao.xml
new file mode 100644
index 0000000..4b01bcc
--- /dev/null
+++ b/app/src/main/res/drawable/login_round_button_kakao.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/more.xml b/app/src/main/res/drawable/more.xml
new file mode 100644
index 0000000..1dba65a
--- /dev/null
+++ b/app/src/main/res/drawable/more.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/round_button.xml b/app/src/main/res/drawable/round_button.xml
new file mode 100644
index 0000000..b82ab4c
--- /dev/null
+++ b/app/src/main/res/drawable/round_button.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/round_button2.xml b/app/src/main/res/drawable/round_button2.xml
new file mode 100644
index 0000000..05b27a4
--- /dev/null
+++ b/app/src/main/res/drawable/round_button2.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/round_button3.xml b/app/src/main/res/drawable/round_button3.xml
new file mode 100644
index 0000000..f9058ab
--- /dev/null
+++ b/app/src/main/res/drawable/round_button3.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/roundborderline.xml b/app/src/main/res/drawable/roundborderline.xml
new file mode 100644
index 0000000..ca1bc06
--- /dev/null
+++ b/app/src/main/res/drawable/roundborderline.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/searchbox.xml b/app/src/main/res/drawable/searchbox.xml
new file mode 100644
index 0000000..222718f
--- /dev/null
+++ b/app/src/main/res/drawable/searchbox.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/side_nav_bar.xml b/app/src/main/res/drawable/side_nav_bar.xml
new file mode 100644
index 0000000..8578c89
--- /dev/null
+++ b/app/src/main/res/drawable/side_nav_bar.xml
@@ -0,0 +1,9 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/textbox_outline.xml b/app/src/main/res/drawable/textbox_outline.xml
new file mode 100644
index 0000000..d4a2ba3
--- /dev/null
+++ b/app/src/main/res/drawable/textbox_outline.xml
@@ -0,0 +1,21 @@
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_board.xml b/app/src/main/res/layout/activity_board.xml
new file mode 100644
index 0000000..13f2e3d
--- /dev/null
+++ b/app/src/main/res/layout/activity_board.xml
@@ -0,0 +1,153 @@
+
+
+
+
+
+
+
+ 툴바부분<-->
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 내용 들어갈곳<-->
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <-->
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_boardheader.xml b/app/src/main/res/layout/activity_boardheader.xml
new file mode 100644
index 0000000..c6a2954
--- /dev/null
+++ b/app/src/main/res/layout/activity_boardheader.xml
@@ -0,0 +1,104 @@
+
+
+
+
+
+
+
+
+
+ //달력 이름
+
+
+
+ //내용인데 보더값
+
+
+
+
+
+
+
+
+
+
+ //공유멤버사진 및 오른쪽 공유버튼
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_create_calendar.xml b/app/src/main/res/layout/activity_create_calendar.xml
new file mode 100644
index 0000000..fbd6a24
--- /dev/null
+++ b/app/src/main/res/layout/activity_create_calendar.xml
@@ -0,0 +1,165 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_create_calendar_dialog.xml b/app/src/main/res/layout/activity_create_calendar_dialog.xml
new file mode 100644
index 0000000..e0d3868
--- /dev/null
+++ b/app/src/main/res/layout/activity_create_calendar_dialog.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_create_member1.xml b/app/src/main/res/layout/activity_create_member1.xml
new file mode 100644
index 0000000..c7ae694
--- /dev/null
+++ b/app/src/main/res/layout/activity_create_member1.xml
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_create_member2.xml b/app/src/main/res/layout/activity_create_member2.xml
new file mode 100644
index 0000000..e2fadb2
--- /dev/null
+++ b/app/src/main/res/layout/activity_create_member2.xml
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_create_member3.xml b/app/src/main/res/layout/activity_create_member3.xml
new file mode 100644
index 0000000..9868bf5
--- /dev/null
+++ b/app/src/main/res/layout/activity_create_member3.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_delete_plan.xml b/app/src/main/res/layout/activity_delete_plan.xml
new file mode 100644
index 0000000..7bc2a01
--- /dev/null
+++ b/app/src/main/res/layout/activity_delete_plan.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_invite.xml b/app/src/main/res/layout/activity_invite.xml
new file mode 100644
index 0000000..941b558
--- /dev/null
+++ b/app/src/main/res/layout/activity_invite.xml
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..85150d3
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,106 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..c575fdc
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,191 @@
+
+
+
+
+
+ 툴바부분<-->
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 내용 들어갈곳<-->
+
+
+
+
+
+
+
+
+ 애니메이션 부분<-->
+
+
+
+
+
+
+
+
+
+
+
+
+ //아래버튼
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <-->
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_modify_calendar.xml b/app/src/main/res/layout/activity_modify_calendar.xml
new file mode 100644
index 0000000..564b719
--- /dev/null
+++ b/app/src/main/res/layout/activity_modify_calendar.xml
@@ -0,0 +1,161 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_modify_plan.xml b/app/src/main/res/layout/activity_modify_plan.xml
new file mode 100644
index 0000000..bf0d0c2
--- /dev/null
+++ b/app/src/main/res/layout/activity_modify_plan.xml
@@ -0,0 +1,338 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 7.10수정부분
+ Scrollview->Framelayout
+ <-->
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_notice.xml b/app/src/main/res/layout/activity_notice.xml
new file mode 100644
index 0000000..0c85294
--- /dev/null
+++ b/app/src/main/res/layout/activity_notice.xml
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+ 앱바 부분<-->
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_plan_detail.xml b/app/src/main/res/layout/activity_plan_detail.xml
new file mode 100644
index 0000000..22207f3
--- /dev/null
+++ b/app/src/main/res/layout/activity_plan_detail.xml
@@ -0,0 +1,155 @@
+
+
+
+
+
+ 툴바부분<-->
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 내용 들어갈곳<-->
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <-->
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_plandetailreply_header.xml b/app/src/main/res/layout/activity_plandetailreply_header.xml
new file mode 100644
index 0000000..c2db8d3
--- /dev/null
+++ b/app/src/main/res/layout/activity_plandetailreply_header.xml
@@ -0,0 +1,135 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_recommand_time.xml b/app/src/main/res/layout/activity_recommand_time.xml
new file mode 100644
index 0000000..89018ec
--- /dev/null
+++ b/app/src/main/res/layout/activity_recommand_time.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_register_plan.xml b/app/src/main/res/layout/activity_register_plan.xml
new file mode 100644
index 0000000..979a1c6
--- /dev/null
+++ b/app/src/main/res/layout/activity_register_plan.xml
@@ -0,0 +1,347 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 7.10수정부분
+ Scrollview->Framelayout
+ <-->
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_register_plan_dialog.xml b/app/src/main/res/layout/activity_register_plan_dialog.xml
new file mode 100644
index 0000000..20906ce
--- /dev/null
+++ b/app/src/main/res/layout/activity_register_plan_dialog.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_search_plan.xml b/app/src/main/res/layout/activity_search_plan.xml
new file mode 100644
index 0000000..f5ac020
--- /dev/null
+++ b/app/src/main/res/layout/activity_search_plan.xml
@@ -0,0 +1,109 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_setting.xml b/app/src/main/res/layout/activity_setting.xml
new file mode 100644
index 0000000..fceda50
--- /dev/null
+++ b/app/src/main/res/layout/activity_setting.xml
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_sidebar.xml b/app/src/main/res/layout/activity_sidebar.xml
new file mode 100644
index 0000000..e298c66
--- /dev/null
+++ b/app/src/main/res/layout/activity_sidebar.xml
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml
new file mode 100644
index 0000000..fb70e28
--- /dev/null
+++ b/app/src/main/res/layout/activity_splash.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_update_plan.xml b/app/src/main/res/layout/activity_update_plan.xml
new file mode 100644
index 0000000..468e122
--- /dev/null
+++ b/app/src/main/res/layout/activity_update_plan.xml
@@ -0,0 +1,323 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 7.10수정부분
+ Scrollview->Framelayout
+ <-->
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_wait_invite.xml b/app/src/main/res/layout/activity_wait_invite.xml
new file mode 100644
index 0000000..cf4f195
--- /dev/null
+++ b/app/src/main/res/layout/activity_wait_invite.xml
@@ -0,0 +1,83 @@
+
+
+
+
+
+ 툴바부분<-->
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 내용 들어갈곳<-->
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/boardplan_item.xml b/app/src/main/res/layout/boardplan_item.xml
new file mode 100644
index 0000000..1ec4264
--- /dev/null
+++ b/app/src/main/res/layout/boardplan_item.xml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/custom_recycleview_invite_item.xml b/app/src/main/res/layout/custom_recycleview_invite_item.xml
new file mode 100644
index 0000000..8861a78
--- /dev/null
+++ b/app/src/main/res/layout/custom_recycleview_invite_item.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/defualt_activity_main.xml b/app/src/main/res/layout/defualt_activity_main.xml
new file mode 100644
index 0000000..9bb7069
--- /dev/null
+++ b/app/src/main/res/layout/defualt_activity_main.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_demo2.xml b/app/src/main/res/layout/fragment_demo2.xml
new file mode 100644
index 0000000..48777f0
--- /dev/null
+++ b/app/src/main/res/layout/fragment_demo2.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_license.xml b/app/src/main/res/layout/fragment_license.xml
new file mode 100644
index 0000000..b3002cd
--- /dev/null
+++ b/app/src/main/res/layout/fragment_license.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/list_item.xml b/app/src/main/res/layout/list_item.xml
new file mode 100644
index 0000000..ee5ccb0
--- /dev/null
+++ b/app/src/main/res/layout/list_item.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/main_recycleritem.xml b/app/src/main/res/layout/main_recycleritem.xml
new file mode 100644
index 0000000..71f5853
--- /dev/null
+++ b/app/src/main/res/layout/main_recycleritem.xml
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/main_teamrecycleritem.xml b/app/src/main/res/layout/main_teamrecycleritem.xml
new file mode 100644
index 0000000..2e9073f
--- /dev/null
+++ b/app/src/main/res/layout/main_teamrecycleritem.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/nav_header_main.xml b/app/src/main/res/layout/nav_header_main.xml
new file mode 100644
index 0000000..0bf69c5
--- /dev/null
+++ b/app/src/main/res/layout/nav_header_main.xml
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/recommand_time_item.xml b/app/src/main/res/layout/recommand_time_item.xml
new file mode 100644
index 0000000..20e9a48
--- /dev/null
+++ b/app/src/main/res/layout/recommand_time_item.xml
@@ -0,0 +1,33 @@
+
+ 시간추천 화면의 recyclerview에 이용될 item들<-->
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/reply_item.xml b/app/src/main/res/layout/reply_item.xml
new file mode 100644
index 0000000..0510db0
--- /dev/null
+++ b/app/src/main/res/layout/reply_item.xml
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/searchplan_item.xml b/app/src/main/res/layout/searchplan_item.xml
new file mode 100644
index 0000000..8ad7a59
--- /dev/null
+++ b/app/src/main/res/layout/searchplan_item.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/sidebaritem.xml b/app/src/main/res/layout/sidebaritem.xml
new file mode 100644
index 0000000..01d6e73
--- /dev/null
+++ b/app/src/main/res/layout/sidebaritem.xml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/sidebarteamitem.xml b/app/src/main/res/layout/sidebarteamitem.xml
new file mode 100644
index 0000000..494df71
--- /dev/null
+++ b/app/src/main/res/layout/sidebarteamitem.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/teammember_recyclerview_item.xml b/app/src/main/res/layout/teammember_recyclerview_item.xml
new file mode 100644
index 0000000..e82072d
--- /dev/null
+++ b/app/src/main/res/layout/teammember_recyclerview_item.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/text_item.xml b/app/src/main/res/layout/text_item.xml
new file mode 100644
index 0000000..8b577ef
--- /dev/null
+++ b/app/src/main/res/layout/text_item.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/waitlist_item.xml b/app/src/main/res/layout/waitlist_item.xml
new file mode 100644
index 0000000..323a1a3
--- /dev/null
+++ b/app/src/main/res/layout/waitlist_item.xml
@@ -0,0 +1,107 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/activity_main_drawer.xml b/app/src/main/res/menu/activity_main_drawer.xml
new file mode 100644
index 0000000..ae80d2a
--- /dev/null
+++ b/app/src/main/res/menu/activity_main_drawer.xml
@@ -0,0 +1,46 @@
+
+
+
diff --git a/app/src/main/res/menu/demo.xml b/app/src/main/res/menu/demo.xml
new file mode 100644
index 0000000..016eac1
--- /dev/null
+++ b/app/src/main/res/menu/demo.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/main.xml b/app/src/main/res/menu/main.xml
new file mode 100644
index 0000000..e437218
--- /dev/null
+++ b/app/src/main/res/menu/main.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/app/src/main/res/menu/toolbar_menu.xml b/app/src/main/res/menu/toolbar_menu.xml
new file mode 100644
index 0000000..f60e61d
--- /dev/null
+++ b/app/src/main/res/menu/toolbar_menu.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..898f3ed
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 0000000..dffca36
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..64ba76f
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 0000000..dae5e08
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..e5ed465
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..14ed0af
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..b0907ca
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..d8ae031
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..2c18de9
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..beed3cd
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml
new file mode 100644
index 0000000..7d807ef
--- /dev/null
+++ b/app/src/main/res/values-v21/styles.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml
new file mode 100644
index 0000000..9b3c2ae
--- /dev/null
+++ b/app/src/main/res/values/arrays.xml
@@ -0,0 +1,16 @@
+
+
+
+ - "Android provides a rich application framework that allows you to build innovative apps and games for mobile devices in a Java language environment. The documents listed in the left navigation provide details about how to build apps using Android's various APIs."
+ - "Android apps are built as a combination of distinct components that can be invoked individually. For instance, an individual activity provides a single screen for a user interface, and a service independently performs work in the background."
+ - "From one component you can start another component using an intent. You can even start a component in a different app, such an activity in a maps app to show an address. This model provides multiple entry points for a single app and allows any app to behave as a user's "default" for an action that other apps may invoke."
+ - "You can query the availability of device features at runtime if any app features require specific hardware such as a camera. If necessary, you can also declare features your app requires so app markets such as Google Play Store do not allow installation on devices that do not support that feature."
+ - "Android provides an adaptive app framework that allows you to provide unique resources for different device configurations. For example, you can create different XML layout files for different screen sizes and the system determines which layout to apply based on the current device's screen size."
+ - "Android provides a rich application framework that allows you to build innovative apps and games for mobile devices in a Java language environment. The documents listed in the left navigation provide details about how to build apps using Android's various APIs."
+ - "Android provides a rich application framework that allows you to build innovative apps and games for mobile devices in a Java language environment. The documents listed in the left navigation provide details about how to build apps using Android's various APIs."
+ - "Android provides a rich application framework that allows you to build innovative apps and games for mobile devices in a Java language environment. The documents listed in the left navigation provide details about how to build apps using Android's various APIs."
+ - "Android provides a rich application framework that allows you to build innovative apps and games for mobile devices in a Java language environment. The documents listed in the left navigation provide details about how to build apps using Android's various APIs."
+ - "Android provides a rich application framework that allows you to build innovative apps and games for mobile devices in a Java language environment. The documents listed in the left navigation provide details about how to build apps using Android's various APIs."
+ - "test"
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..08aded3
--- /dev/null
+++ b/app/src/main/res/values/colors.xml
@@ -0,0 +1,17 @@
+
+
+ #FFFFFF
+ #00574B
+ #d81b60
+ #d81b60
+ #ff6067
+ #444444
+ #4a4a4a
+ #A4A4A4
+ #FFFFFF
+ #ffffff
+ #ff6067
+
+
+
+
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..6711963
--- /dev/null
+++ b/app/src/main/res/values/dimens.xml
@@ -0,0 +1,9 @@
+
+
+ 16dp
+ 16dp
+ 8dp
+ 176dp
+ 16dp
+ 8dp
+
\ No newline at end of file
diff --git a/app/src/main/res/values/drawables.xml b/app/src/main/res/values/drawables.xml
new file mode 100644
index 0000000..52c6a6c
--- /dev/null
+++ b/app/src/main/res/values/drawables.xml
@@ -0,0 +1,8 @@
+
+ - @android:drawable/ic_menu_camera
+ - @android:drawable/ic_menu_gallery
+ - @android:drawable/ic_menu_slideshow
+ - @android:drawable/ic_menu_manage
+ - @android:drawable/ic_menu_share
+ - @android:drawable/ic_menu_send
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..39ba5fd
--- /dev/null
+++ b/app/src/main/res/values/strings.xml
@@ -0,0 +1,20 @@
+
+ Shalendar
+ MainActivity
+ Open navigation drawer
+ Close navigation drawer
+ Android Studio
+ android.studio@android.com
+ Navigation header
+ Settings
+
+ 2019년 09월 08일 Ver 1.0.0
+ 상명대학교 졸업 프로젝트\n컴퓨터 과학과 고진권, 박성준, 박지상, 김형택, 정구일
+ Demo
+ 라이센스
+ 자주하는 질문
+ 일정 검색
+ test
+ test2
+
+
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..32664df
--- /dev/null
+++ b/app/src/main/res/values/styles.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/test/java/kr/ac/smu/cs/shalendar_java/ExampleUnitTest.java b/app/src/test/java/kr/ac/smu/cs/shalendar_java/ExampleUnitTest.java
new file mode 100644
index 0000000..c3adfac
--- /dev/null
+++ b/app/src/test/java/kr/ac/smu/cs/shalendar_java/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package kr.ac.smu.cs.shalendar_java;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+}
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..c6af026
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,32 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+
+ repositories {
+ google()
+ jcenter()
+ }
+
+ dependencies {
+// classpath 'com.android.tools.build:gradle:3.3.2'
+ classpath 'com.android.tools.build:gradle:3.2.1'
+// classpath 'com.google.gms:google-services:4.1.0'
+ classpath 'com.google.gms:google-services:4.2.0'
+
+
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ jcenter()
+ maven {url 'https://jitpack.io'}
+ }
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000..82618ce
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,15 @@
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx1536m
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
+
+
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..f6b961f
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..e0467c2
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Wed May 15 14:06:01 KST 2019
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip
diff --git a/gradlew b/gradlew
new file mode 100644
index 0000000..cccdd3d
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..f955316
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..e7b4def
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1 @@
+include ':app'