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 @@ + + + + + + + + 툴바부분<--> + + + + + + + + + + + + + + + + + + + 내용 들어갈곳<--> + + + + + + + + + + + + + + + + + +