diff --git a/.idea/.name b/.idea/.name
new file mode 100644
index 0000000..01466ef
--- /dev/null
+++ b/.idea/.name
@@ -0,0 +1 @@
+MaLive
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
new file mode 100644
index 0000000..a5f05cd
--- /dev/null
+++ b/.idea/jarRepositories.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 9441db6..d40c667 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,29 +1,49 @@
apply plugin: 'com.android.application'
-
+apply plugin: 'com.google.gms.google-services'
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
+
defaultConfig {
applicationId "com.abbsolute.ma_livu"
- minSdkVersion 15
+ minSdkVersion 21
targetSdkVersion 29
versionCode 1
+
versionName "1.0"
+
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
+
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
+
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
- implementation 'androidx.appcompat:appcompat:1.0.2'
+ implementation 'androidx.appcompat:appcompat:1.1.0'
+ implementation 'androidx.legacy:legacy-support-v4:1.0.0'
+ implementation 'com.google.android.material:material:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+ implementation 'androidx.navigation:navigation-fragment:2.0.0'
+ implementation 'androidx.navigation:navigation-ui:2.0.0'
+ implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
+ implementation 'androidx.viewpager:viewpager:1.0.0'
testImplementation 'junit:junit:4.12'
- androidTestImplementation 'androidx.test.ext:junit:1.1.0'
- androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
+ androidTestImplementation 'androidx.test:runner:1.2.0'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+ implementation 'com.android.volley:volley:1.1.1'
+ implementation 'com.google.code.gson:gson:2.8.5'
+ implementation 'com.github.bumptech.glide:glide:3.7.0'
+ implementation 'com.google.firebase:firebase-analytics:17.2.2'
+
+ implementation 'com.google.firebase:firebase-messaging:20.1.0'
+ implementation 'com.google.android.material:material:1.2.0-alpha01'
+
+
}
diff --git a/app/google-services.json b/app/google-services.json
new file mode 100644
index 0000000..cd39c0d
--- /dev/null
+++ b/app/google-services.json
@@ -0,0 +1,48 @@
+{
+ "project_info": {
+ "project_number": "696969032271",
+ "firebase_url": "https://malive-5bf10.firebaseio.com",
+ "project_id": "malive-5bf10",
+ "storage_bucket": "malive-5bf10.appspot.com"
+ },
+ "client": [
+ {
+ "client_info": {
+ "mobilesdk_app_id": "1:696969032271:android:653f9b107aaedf1811f03a",
+ "android_client_info": {
+ "package_name": "com.abbsolute.ma_livu"
+ }
+ },
+ "oauth_client": [
+ {
+ "client_id": "696969032271-1h1v1pg1e6iatpjencm3492ecqsoh2lf.apps.googleusercontent.com",
+ "client_type": 1,
+ "android_info": {
+ "package_name": "com.abbsolute.ma_livu",
+ "certificate_hash": "d49d2be1fb079f85e63b4bc5d73e8a4f78e16f8a"
+ }
+ },
+ {
+ "client_id": "696969032271-n0n1ja36608ch9met0s8se6vmsg79u0c.apps.googleusercontent.com",
+ "client_type": 3
+ }
+ ],
+ "api_key": [
+ {
+ "current_key": "AIzaSyAiDTElMJXtGFMXTNXF_30KTbxoHY0TIIM"
+ }
+ ],
+ "services": {
+ "appinvite_service": {
+ "other_platform_oauth_client": [
+ {
+ "client_id": "696969032271-n0n1ja36608ch9met0s8se6vmsg79u0c.apps.googleusercontent.com",
+ "client_type": 3
+ }
+ ]
+ }
+ }
+ }
+ ],
+ "configuration_version": "1"
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 8773303..1db2933 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,21 +1,46 @@
-
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/abbsolute/ma_livu/Activities/ToDoAlarmActivity.java b/app/src/main/java/com/abbsolute/ma_livu/Activities/ToDoAlarmActivity.java
new file mode 100644
index 0000000..c16bd49
--- /dev/null
+++ b/app/src/main/java/com/abbsolute/ma_livu/Activities/ToDoAlarmActivity.java
@@ -0,0 +1,17 @@
+package com.abbsolute.ma_livu.Activities;
+
+import android.os.Bundle;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.abbsolute.ma_livu.R;
+
+public class ToDoAlarmActivity extends AppCompatActivity {
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.todo_activity_alarm);
+ getSupportActionBar().setTitle("Alarm Activity");
+ }
+}
diff --git a/app/src/main/java/com/abbsolute/ma_livu/Activities/ToDoMainActivity.java b/app/src/main/java/com/abbsolute/ma_livu/Activities/ToDoMainActivity.java
new file mode 100644
index 0000000..5eea144
--- /dev/null
+++ b/app/src/main/java/com/abbsolute/ma_livu/Activities/ToDoMainActivity.java
@@ -0,0 +1,384 @@
+package com.abbsolute.ma_livu.Activities;
+
+import android.app.Activity;
+import android.app.AlarmManager;
+import android.app.PendingIntent;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.icu.text.SimpleDateFormat;
+import android.os.Build;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.Toast;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.ActionBarDrawerToggle;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.widget.Toolbar;
+import androidx.core.view.GravityCompat;
+import androidx.drawerlayout.widget.DrawerLayout;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentTransaction;
+import androidx.viewpager.widget.ViewPager;
+
+import com.abbsolute.ma_livu.ToDoAlarmReceiver;
+import com.abbsolute.ma_livu.ToDoAppHelper;
+import com.abbsolute.ma_livu.ToDoDeviceBootReceiver;
+import com.abbsolute.ma_livu.Fragments.HelpFragment;
+import com.abbsolute.ma_livu.Fragments.ToDoNotiFragment;
+import com.abbsolute.ma_livu.Fragments.ToDoFragment;
+import com.abbsolute.ma_livu.GooeyMenu;
+import com.abbsolute.ma_livu.R;
+import com.abbsolute.ma_livu.TabPagerAdapter;
+import com.abbsolute.ma_livu.ToDoAdapter;
+import com.abbsolute.ma_livu.ToDoInfo;
+import com.google.android.gms.tasks.OnCompleteListener;
+import com.google.android.gms.tasks.Task;
+import com.google.android.material.navigation.NavigationView;
+import com.google.android.material.tabs.TabLayout;
+import com.google.firebase.iid.FirebaseInstanceId;
+import com.google.firebase.iid.InstanceIdResult;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Locale;
+
+public class ToDoMainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
+
+ private static final String CHANNEL_ID = "101" ;
+ private static final String TAG = "FCM";
+
+ private static int WRITE_RESULT = 100;
+ private ToDoFragment toDoFragment;
+ private ToDoNotiFragment toDoNotiFragment;
+ private HelpFragment helpFragment;
+ Toolbar toolbar;
+ private DrawerLayout mDrawerLayout;
+ private NavigationView navigationView;
+ ToDoAdapter toDoAdapter;
+ TabLayout tabLayout;
+ ViewPager viewPager;
+ private GooeyMenu mGooeyMenu;//밑에 네이버와 비슷한 모양의 UI
+ private Toast mToast;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.todo_activity_main);
+
+
+ /////
+ // new AlarmHATT(getApplicationContext()).Alarm();
+// createNotificationChannel();
+ ///
+ toDoAdapter=new ToDoAdapter();
+ //===데이터 불러오기
+ SharedPreferences pf=getSharedPreferences("pref", Activity.MODE_PRIVATE);
+ Boolean chk=pf.getBoolean("chk",false);
+ toDoAdapter.getCheckState(chk);
+ Toast.makeText(getApplicationContext(), ""+chk, Toast.LENGTH_SHORT).show();
+ ///
+ ToDoAppHelper.openDatabase(getApplicationContext(), "todo.db", 15);
+ getDays();//디데이 알림을 구현하려고 시도 한 코드
+ toolbar = (Toolbar) findViewById(R.id.toolbar);
+ setSupportActionBar(toolbar);
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+ getSupportActionBar().setDisplayShowTitleEnabled(false);
+ toolbar.setTitle("내가 할 일");
+ final FragmentTransaction fragmentTransaction=getSupportFragmentManager().beginTransaction();
+ toDoFragment=new ToDoFragment();
+ fragmentTransaction.add(R.id.main_frame,toDoFragment).commit();
+
+ getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_hamburger_menu);
+ mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
+ ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
+ mDrawerLayout.addDrawerListener(toggle);
+ toggle.syncState();
+ navigationView = findViewById(R.id.nav_view);
+ navigationView.setNavigationItemSelectedListener(this);
+ ////////
+ FirebaseInstanceId.getInstance().getInstanceId()
+ .addOnCompleteListener(new OnCompleteListener() {
+ @Override
+ public void onComplete(@NonNull Task task) {
+ if (!task.isSuccessful()) {
+ Log.w(TAG, "getInstanceId failed", task.getException());
+ return;
+ }
+ // Get new Instance ID token
+ String token = task.getResult().getToken();
+ // Log and toast
+ String msg = task.getResult().getToken();
+ Log.d(TAG, msg);
+ Toast.makeText(ToDoMainActivity.this, msg, Toast.LENGTH_SHORT).show();
+ }
+ });
+ //도움말기능
+ ImageView button=findViewById(R.id.help_image);
+ button.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ HelpFragment helpFragment=new HelpFragment();
+ FragmentTransaction fragmentTransaction=getSupportFragmentManager().beginTransaction();
+ fragmentTransaction.replace(R.id.main_frame,helpFragment).commit();
+ }
+ });
+ ///
+ viewPager=findViewById(R.id.main_pager);
+ tabLayout=findViewById(R.id.main_tab);//하단 탭
+ TabPagerAdapter tabPagerAdapter=new TabPagerAdapter(getSupportFragmentManager(),tabLayout.getTabCount());
+ viewPager.setAdapter(tabPagerAdapter);
+ tabLayout.setupWithViewPager(viewPager);
+
+
+ tabLayout.addTab(tabLayout.newTab().setText("Home"));
+ tabLayout.addTab(tabLayout.newTab().setText("Community"));
+ tabLayout.addTab(tabLayout.newTab().setText("Title"));
+ tabLayout.addTab(tabLayout.newTab().setText("Profile"));
+ tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
+ viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
+ @Override
+ public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+
+ }
+
+ @Override
+ public void onPageSelected(int position) {
+ tabLayout.getTabAt(0).setText("Home");
+ tabLayout.getTabAt(1).setText("Community");
+ tabLayout.getTabAt(2).setText("Title");
+ tabLayout.getTabAt(3).setText("Profile");
+ switch(position){
+ case 0:
+
+ tabLayout.getTabAt(0).setText("Home");
+
+ break;
+ case 1:
+ tabLayout.getTabAt(1).setText("Community");
+
+ break;
+ case 2:
+ tabLayout.getTabAt(2).setText("Title");
+
+ break;
+ case 3:
+ tabLayout.getTabAt(3).setText("Profile");
+
+ break;
+ }
+ }
+
+ @Override
+ public void onPageScrollStateChanged(int state) {
+
+ }
+ });
+ // mGooeyMenu = (GooeyMenu) findViewById(R.id.gooey_menu);
+ // mGooeyMenu.setOnMenuListener(this);
+
+ }//Oncreate()
+ @Override
+ public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
+ //FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
+ int id=menuItem.getItemId();
+ if(id==R.id.nav_home){
+ Toast.makeText(getApplicationContext(), "클릭!", Toast.LENGTH_SHORT).show();
+ onFragmentSelected(0,null);
+ }else if(id==R.id.nav_notification){
+ onFragmentSelected(1,null);
+ }
+ DrawerLayout drawer = findViewById(R.id.drawer_layout);
+ drawer.closeDrawer(GravityCompat.START);
+
+ return true;
+ }
+
+
+ public void onBackPressed() {
+ DrawerLayout drawer = findViewById(R.id.drawer_layout);
+ if (drawer.isDrawerOpen(GravityCompat.START)) {
+ drawer.closeDrawer(GravityCompat.START);
+ } else {
+ super.onBackPressed();
+ }
+ }
+ public void repaint(){
+ final FragmentTransaction fragmentTransaction=getSupportFragmentManager().beginTransaction();
+ toDoFragment=new ToDoFragment();
+ fragmentTransaction.replace(R.id.main_frame,toDoFragment).commit();
+ }
+
+
+
+
+
+ @Override
+ public void onPointerCaptureChanged(boolean hasCapture) {
+
+ }
+ //알림 채널 생성 코드
+ /*private void createNotificationChannel() {
+ // Create the NotificationChannel, but only on API 26+ because
+ // the NotificationChannel class is new and not in the support library
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ CharSequence name = getString(R.string.channel_name);
+ String description = getString(R.string.channel_description);
+ int importance = NotificationManager.IMPORTANCE_DEFAULT;
+ NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
+ channel.setDescription(description);
+ // Register the channel with the system; you can't change the importance
+ // or other notification behaviors after this
+ NotificationManager notificationManager = getSystemService(NotificationManager.class);
+ notificationManager.createNotificationChannel(channel);
+ }
+ }*/
+ public void onFragmentSelected(int pos, Bundle bundle) {
+ Fragment cur = null;
+ if (pos == 0) {
+ cur = new ToDoFragment();
+ toDoFragment = (ToDoFragment)cur;
+ } else if (pos == 1) {
+ cur=new ToDoNotiFragment();
+ toDoNotiFragment =(ToDoNotiFragment)cur;
+ }else if(pos==2){
+ cur=new HelpFragment();
+ helpFragment=(HelpFragment)cur;
+ }
+ getSupportFragmentManager().beginTransaction().replace(R.id.main_frame, cur).commit();
+ }
+ //디데이 알림 기능(수정필요!)
+ public void getDays() {
+ Log.d("alarm2"," method start");
+ //Toast.makeText(getApplicationContext(),"getDays실행!!!!!",Toast.LENGTH_SHORT).show();
+
+ //Calendar c = Calendar.getInstance();
+ ArrayList toDoInfos = ToDoAppHelper.selectTodoInfo("todoInfo");
+ Log.d("toDoInfoSize",Integer.toString(toDoInfos.size()));
+ long systemTime = System.currentTimeMillis();
+ SimpleDateFormat formatter = null;
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+ formatter = new SimpleDateFormat("yyyy-MM-dd", Locale.KOREA);
+ }
+ String date = formatter.format(systemTime);
+ String[] r = date.split("-");
+ String y = r[0];
+ String m = r[1];
+ String d = r[2];
+
+
+ //Toast.makeText(getApplicationContext(), ""+y+" "+m+" "+d, Toast.LENGTH_SHORT).show();
+ Log.d("currentTime",y + "," + m + "," + d);
+ //디데이 알림 체크
+ /*
+ try {
+ String toDoInfocheck = toDoInfos.get(0).content;
+ String Ddaycheck = toDoInfos.get(0).dDay;
+ Log.d("todoInfo","content = " + toDoInfocheck + "dDay = " + Ddaycheck);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ */
+
+
+ for (int i = 0; i < toDoInfos.size(); i++) {
+ String dates = toDoInfos.get(i).getDates();//d-day 등록한 날짜
+ String dDay = toDoInfos.get(i).getdDay();
+ String contents = toDoInfos.get(i).getContent();
+
+ String[] res = dDay.split("-");
+ String year = res[0];
+ String month = res[1];
+ String day = res[2];
+
+ int int_month = Integer.parseInt(month);
+ int int_day = Integer.parseInt(day);
+
+ //1월부터 9월일 때 앞에 0 붙여주기 ex)01월 이런식
+ //day도 마찬가지
+ /*if(int_month > 0 && int_month < 10){
+ month = "0" + month;
+ }
+ if(int_day > 0 && int_day < 10){
+ day = "0" + day;
+ }*/
+
+ Log.d("d-day",year + "," + month + "," + day);
+ Log.d("c-day",y + "," + m + "," + d);
+ //y,m,d는 현재 시간
+ //year,month,day는 d-day
+
+ //d-day는 한자리 수일 때 앞에 0이 안붙고 c-day는 한자리 수일 때 앞에 0이 붙어서 둘이 일치할수가 없음!
+ if (y.equals(year) && m.equals(month) && d.equals(day)) {
+ Log.d("correct","날짜일치...");
+ int sendYear = Integer.parseInt(year);
+ int sendMonth = Integer.parseInt(month);
+ int sendDay = Integer.parseInt(day);
+ //선택한 날짜와 시간으로 알람 설정
+ //GregorianCalendar calendar = new GregorianCalendar(sendYear, sendMonth, sendDay, 18, 44);
+//알람시간에 AlarmActivity 실행되도록.
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTimeInMillis(System.currentTimeMillis());
+ //UTC시간으로 지정시
+ calendar.set(Calendar.DAY_OF_YEAR,sendYear);
+ calendar.set(Calendar.DAY_OF_MONTH,sendMonth);
+ calendar.set(Calendar.DATE,sendDay);
+ calendar.set(Calendar.HOUR,10);
+ calendar.set(Calendar.MINUTE,0);
+ calendar.set(Calendar.SECOND,0);
+
+ // Preference에 설정한 값 저장
+ /////데이터 저장
+ // SharedPreferences pref = context.getSharedPreferences("pref", Activity.MODE_PRIVATE);
+ // SharedPreferences.Editor editor = pref.edit();
+ SharedPreferences preferences = getSharedPreferences("daily_alarm", MODE_PRIVATE);
+ SharedPreferences.Editor editor=preferences.edit();
+ editor.putLong("nextNotifyTime", (long)calendar.getTimeInMillis());
+ editor.commit();
+
+ AlarmNotification(calendar,contents);
+
+ }
+
+ }
+ }//getDays()
+
+ void AlarmNotification(Calendar calendar,String contents){
+ Boolean dailyNotify = true; // 무조건 알람을 사용
+
+ PackageManager pm = this.getPackageManager();
+ ComponentName receiver = new ComponentName(this, ToDoDeviceBootReceiver.class);
+ Intent intent = new Intent(ToDoMainActivity.this, ToDoAlarmReceiver.class);
+ intent.putExtra("alarmContents",contents);
+ PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 30, intent, PendingIntent.FLAG_UPDATE_CURRENT);
+
+ AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
+
+ if(dailyNotify){//사용자가 매일 알람을 허용해놨을 때
+ if(am != null){
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ //특정시간에 한번만 동작한다.
+ am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
+ // alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
+ } else {
+ am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
+ // alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
+ }
+ }
+
+ // 부팅 후 실행되는 리시버 사용가능하게 설정
+ pm.setComponentEnabledSetting(receiver,
+ PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
+ PackageManager.DONT_KILL_APP);
+
+ }
+ ////
+ }
+}
diff --git a/app/src/main/java/com/abbsolute/ma_livu/Activities/ToDoWriteMainActivity.java b/app/src/main/java/com/abbsolute/ma_livu/Activities/ToDoWriteMainActivity.java
new file mode 100644
index 0000000..366b08a
--- /dev/null
+++ b/app/src/main/java/com/abbsolute/ma_livu/Activities/ToDoWriteMainActivity.java
@@ -0,0 +1,72 @@
+package com.abbsolute.ma_livu.Activities;
+
+import android.os.Bundle;
+
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentPagerAdapter;
+import androidx.viewpager.widget.ViewPager;
+
+import com.abbsolute.ma_livu.Fragments.OnBackPressedListener;
+import com.abbsolute.ma_livu.Fragments.ToDoWriteFragment;
+import com.abbsolute.ma_livu.Fragments.ToDoWriteFragment2;
+import com.abbsolute.ma_livu.R;
+
+import java.util.ArrayList;
+
+public class ToDoWriteMainActivity extends AppCompatActivity {
+ OnBackPressedListener listener;
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.todo_write_main);
+ ViewPager pager=findViewById(R.id.pager);
+ pager.setOffscreenPageLimit(3);
+ PagerAdapter adapter = new PagerAdapter(getSupportFragmentManager());
+ adapter.addItem(new ToDoWriteFragment());
+ adapter.addItem(new ToDoWriteFragment2());
+ pager.setAdapter(adapter);
+ }
+ public void setOnBackPressedListener(OnBackPressedListener listener){
+ this.listener = listener;
+ }
+ @Override public void onBackPressed() {
+ if(listener!=null){
+ listener.onBackPressed();
+ }else{
+ super.onBackPressed();
+ }
+ }
+
+
+ //어댑터 안에서 각각의 아이템을 데이터로서 관리한다
+ class PagerAdapter extends FragmentPagerAdapter {
+ ArrayList items = new ArrayList();
+
+ public PagerAdapter(FragmentManager fm) {
+ super(fm);
+ }
+
+ public void addItem(Fragment item){
+ items.add(item);
+ }
+
+ @Override
+ public Fragment getItem(int position) {
+ switch (position){
+ case 0:
+ return ToDoWriteFragment.newInstance();
+ case 1:
+ return ToDoWriteFragment2.newInstance();
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ public int getCount() {
+ return items.size();
+ }
+}
+}
diff --git a/app/src/main/java/com/abbsolute/ma_livu/FirebaseMessages/ToDoMyFirebaseInstanceIdService.java b/app/src/main/java/com/abbsolute/ma_livu/FirebaseMessages/ToDoMyFirebaseInstanceIdService.java
new file mode 100644
index 0000000..5c6bf62
--- /dev/null
+++ b/app/src/main/java/com/abbsolute/ma_livu/FirebaseMessages/ToDoMyFirebaseInstanceIdService.java
@@ -0,0 +1,55 @@
+package com.abbsolute.ma_livu.FirebaseMessages;
+
+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.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.core.app.NotificationCompat;
+
+import com.abbsolute.ma_livu.Activities.ToDoMainActivity;
+import com.abbsolute.ma_livu.R;
+import com.google.firebase.messaging.FirebaseMessagingService;
+import com.google.firebase.messaging.RemoteMessage;
+
+public class ToDoMyFirebaseInstanceIdService extends FirebaseMessagingService {//FCM 알림 테스트 코드
+ @Override
+ public void onNewToken(@NonNull String s) {
+ super.onNewToken(s);
+ Log.d("FCM Log","Refreshed token"+s);
+ }
+
+ @Override
+ public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
+ if(remoteMessage.getNotification()!=null){
+ Log.d("FCM Log","알림 메시지:"+remoteMessage.getNotification().getBody());
+ String messageBody=remoteMessage.getNotification().getBody();
+ String messageTitle=remoteMessage.getNotification().getTitle();
+ Intent intent=new Intent(this, ToDoMainActivity.class);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ PendingIntent pendingIntent=PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_ONE_SHOT);
+ String channelId="Channel ID";
+ Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
+ NotificationCompat.Builder notificationBuilder=
+ new NotificationCompat.Builder(this,channelId)
+ .setSmallIcon(R.mipmap.ic_launcher)
+ .setContentTitle(messageTitle)
+ .setAutoCancel(true)
+ .setSound(defaultSoundUri)
+ .setContentIntent(pendingIntent);
+ NotificationManager notificationManager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
+ if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
+ String channelName="Channel Name";
+ NotificationChannel channel=new NotificationChannel(channelId,channelName,NotificationManager.IMPORTANCE_HIGH);
+ notificationManager.createNotificationChannel(channel);
+ }
+ notificationManager.notify(0,notificationBuilder.build());
+ }
+ }
+}
diff --git a/app/src/main/java/com/abbsolute/ma_livu/Fragments/CommunityFragment.java b/app/src/main/java/com/abbsolute/ma_livu/Fragments/CommunityFragment.java
new file mode 100644
index 0000000..055d4f5
--- /dev/null
+++ b/app/src/main/java/com/abbsolute/ma_livu/Fragments/CommunityFragment.java
@@ -0,0 +1,27 @@
+package com.abbsolute.ma_livu.Fragments;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.abbsolute.ma_livu.R;
+
+public class CommunityFragment extends Fragment {
+ public static CommunityFragment newInstance() {
+ Bundle args = new Bundle();
+ CommunityFragment communityFragment = new CommunityFragment();
+
+ return communityFragment;
+ }
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ ViewGroup viewGroup=(ViewGroup)inflater.inflate(R.layout.fragment_community,container,false);
+ return viewGroup;
+ }
+}
diff --git a/app/src/main/java/com/abbsolute/ma_livu/Fragments/HelpFragment.java b/app/src/main/java/com/abbsolute/ma_livu/Fragments/HelpFragment.java
new file mode 100644
index 0000000..35ffc90
--- /dev/null
+++ b/app/src/main/java/com/abbsolute/ma_livu/Fragments/HelpFragment.java
@@ -0,0 +1,34 @@
+package com.abbsolute.ma_livu.Fragments;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.abbsolute.ma_livu.Activities.ToDoMainActivity;
+import com.abbsolute.ma_livu.R;
+
+public class HelpFragment extends Fragment {
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ View view=inflater.inflate(R.layout.fragment_help,container,false);
+ Button bacKButton=view.findViewById(R.id.back);
+ bacKButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ getActivity().finish();
+ startActivity(new Intent(getContext(), ToDoMainActivity.class));
+ }
+ });
+ return view;
+ }
+
+
+}
diff --git a/app/src/main/java/com/abbsolute/ma_livu/Fragments/HomeFragment.java b/app/src/main/java/com/abbsolute/ma_livu/Fragments/HomeFragment.java
new file mode 100644
index 0000000..8a8f80c
--- /dev/null
+++ b/app/src/main/java/com/abbsolute/ma_livu/Fragments/HomeFragment.java
@@ -0,0 +1,28 @@
+package com.abbsolute.ma_livu.Fragments;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.abbsolute.ma_livu.R;
+
+public class HomeFragment extends Fragment {
+ public static HomeFragment newInstance() {
+ Bundle args = new Bundle();
+ HomeFragment homeFragment = new HomeFragment();
+
+ return homeFragment;
+ }
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ ViewGroup viewGroup=(ViewGroup)inflater.inflate(R.layout.fragment_home,container,false);
+
+ return viewGroup;
+ }
+}
diff --git a/app/src/main/java/com/abbsolute/ma_livu/Fragments/OnBackPressedListener.java b/app/src/main/java/com/abbsolute/ma_livu/Fragments/OnBackPressedListener.java
new file mode 100644
index 0000000..ace4562
--- /dev/null
+++ b/app/src/main/java/com/abbsolute/ma_livu/Fragments/OnBackPressedListener.java
@@ -0,0 +1,5 @@
+package com.abbsolute.ma_livu.Fragments;
+
+public interface OnBackPressedListener {
+ void onBackPressed();
+}
diff --git a/app/src/main/java/com/abbsolute/ma_livu/Fragments/ProfileFragment.java b/app/src/main/java/com/abbsolute/ma_livu/Fragments/ProfileFragment.java
new file mode 100644
index 0000000..b300eda
--- /dev/null
+++ b/app/src/main/java/com/abbsolute/ma_livu/Fragments/ProfileFragment.java
@@ -0,0 +1,27 @@
+package com.abbsolute.ma_livu.Fragments;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.abbsolute.ma_livu.R;
+
+public class ProfileFragment extends Fragment {
+ public static ProfileFragment newInstance() {
+ Bundle args = new Bundle();
+ ProfileFragment ProfileFragment = new ProfileFragment();
+
+ return ProfileFragment;
+ }
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ ViewGroup viewGroup=(ViewGroup)inflater.inflate(R.layout.fragment_profile,container,false);
+ return viewGroup;
+ }
+}
diff --git a/app/src/main/java/com/abbsolute/ma_livu/Fragments/TitleFragment.java b/app/src/main/java/com/abbsolute/ma_livu/Fragments/TitleFragment.java
new file mode 100644
index 0000000..432deb1
--- /dev/null
+++ b/app/src/main/java/com/abbsolute/ma_livu/Fragments/TitleFragment.java
@@ -0,0 +1,27 @@
+package com.abbsolute.ma_livu.Fragments;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.abbsolute.ma_livu.R;
+
+public class TitleFragment extends Fragment {
+ public static TitleFragment newInstance() {
+ Bundle args = new Bundle();
+ TitleFragment titleFragment = new TitleFragment();
+
+ return titleFragment;
+ }
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ ViewGroup viewGroup=(ViewGroup)inflater.inflate(R.layout.fragment_title,container,false);
+ return viewGroup;
+ }
+}
diff --git a/app/src/main/java/com/abbsolute/ma_livu/Fragments/ToDoFixInfo.java b/app/src/main/java/com/abbsolute/ma_livu/Fragments/ToDoFixInfo.java
new file mode 100644
index 0000000..baf9131
--- /dev/null
+++ b/app/src/main/java/com/abbsolute/ma_livu/Fragments/ToDoFixInfo.java
@@ -0,0 +1,22 @@
+package com.abbsolute.ma_livu.Fragments;
+
+public class ToDoFixInfo {
+ String fixToDo;
+ String fixPeriod;
+
+ public String getFixToDo() {
+ return fixToDo;
+ }
+
+ public void setFixToDo(String fixToDo) {
+ this.fixToDo = fixToDo;
+ }
+
+ public String getFixPeriod() {
+ return fixPeriod;
+ }
+
+ public void setFixPeriod(String fixPeriod) {
+ this.fixPeriod = fixPeriod;
+ }
+}
diff --git a/app/src/main/java/com/abbsolute/ma_livu/Fragments/ToDoFixListAdapter.java b/app/src/main/java/com/abbsolute/ma_livu/Fragments/ToDoFixListAdapter.java
new file mode 100644
index 0000000..9df79d8
--- /dev/null
+++ b/app/src/main/java/com/abbsolute/ma_livu/Fragments/ToDoFixListAdapter.java
@@ -0,0 +1,48 @@
+package com.abbsolute.ma_livu.Fragments;
+
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.abbsolute.ma_livu.R;
+
+import java.util.ArrayList;
+
+public class ToDoFixListAdapter extends RecyclerView.Adapter {
+ ArrayList arrayList=new ArrayList<>();
+ public class ViewHolder extends RecyclerView.ViewHolder{
+ protected TextView fixToDoTextView;
+ protected TextView fixPeriodTextView;
+ public ViewHolder(View v){
+ super(v);
+ fixToDoTextView=v.findViewById(R.id.todo);
+ fixPeriodTextView=v.findViewById(R.id.todo_date);
+ }
+ }
+ public void addFixItem(ToDoFixInfo fixInfo){
+ arrayList.add(fixInfo);
+ }
+ @NonNull
+ @Override
+ public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ LayoutInflater inflater = LayoutInflater.from(parent.getContext());
+ View itemView = inflater.inflate(R.layout.todo_fix_list, parent, false);
+ return new ToDoFixListAdapter.ViewHolder(itemView);
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
+ ToDoFixInfo info=arrayList.get(position);
+ holder.fixToDoTextView.setText(info.getFixToDo());
+ holder.fixPeriodTextView.setText(info.getFixPeriod());
+ }
+
+ @Override
+ public int getItemCount() {
+ return arrayList.size();
+ }
+}
diff --git a/app/src/main/java/com/abbsolute/ma_livu/Fragments/ToDoFragment.java b/app/src/main/java/com/abbsolute/ma_livu/Fragments/ToDoFragment.java
new file mode 100644
index 0000000..7a6b763
--- /dev/null
+++ b/app/src/main/java/com/abbsolute/ma_livu/Fragments/ToDoFragment.java
@@ -0,0 +1,144 @@
+package com.abbsolute.ma_livu.Fragments;
+
+import android.app.Activity;
+import android.app.AlarmManager;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.recyclerview.widget.ItemTouchHelper;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.abbsolute.ma_livu.Activities.ToDoWriteMainActivity;
+import com.abbsolute.ma_livu.ToDoAppHelper;
+import com.abbsolute.ma_livu.R;
+import com.abbsolute.ma_livu.ToDoAdapter;
+import com.abbsolute.ma_livu.ToDoInfo;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+
+import static android.app.Activity.RESULT_OK;
+
+
+public class ToDoFragment extends Fragment {//ToDoList 추가, 삭제, 수정 클래스
+ RecyclerView recyclerView;
+ ToDoAdapter toDoAdapter;
+
+ private static int WRITE_RESULT = 100;
+ String res;
+ Bundle bundle;
+ ArrayList toDoInfos;
+ LinearLayout linearLayout;
+ TextView Contents;
+ private int UPDATE_OK = 5;
+ //멤버변수
+ int Year, Month, Day;
+ int Hour, Min;
+ AlarmManager alarmManager;
+ //CheckBox checkBox;
+ ///
+
+
+ ///
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.fragment_todo, container, false);
+ recyclerView = view.findViewById(R.id.todo_recyclerview);
+
+// fragmentTransaction.add(R.id.contentMain,FirstFragment.newInstance());
+ LinearLayoutManager layoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false);
+ recyclerView.setLayoutManager(layoutManager);
+ toDoAdapter = new ToDoAdapter();
+
+ Button fab = view.findViewById(R.id.fab);//추가
+ fab.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ Intent intent = new Intent(getContext(), ToDoWriteMainActivity.class);
+ startActivityForResult(intent, WRITE_RESULT);
+ }
+ });
+ toDoInfos = ToDoAppHelper.selectTodoInfo("todoInfo");
+ toDoAdapter.setItem(toDoInfos);
+ toDoAdapter.GetContext(getContext());
+ toDoAdapter.notifyDataSetChanged();
+ recyclerView.setItemAnimator(null);
+
+ //밀어서 할일 삭제
+ ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
+ @Override
+ public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
+ return false;
+ }
+
+ @Override
+ public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
+ if(direction==ItemTouchHelper.LEFT){
+ final int position = viewHolder.getAdapterPosition();
+ ToDoAppHelper.deleteData(getContext(), "todoInfo", position, toDoInfos.get(position));
+ toDoInfos.remove(position);
+ toDoAdapter.notifyItemRemoved(position);
+ }else if(direction==ItemTouchHelper.RIGHT){
+ toDoInfos = ToDoAppHelper.selectTodoInfo("todoInfo");
+ // toDoAdapter.clearData();
+ toDoAdapter.setItem(toDoInfos);
+ recyclerView.setAdapter(toDoAdapter);
+ }
+ }
+ };
+ ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
+ itemTouchHelper.attachToRecyclerView(recyclerView);
+ recyclerView.setAdapter(toDoAdapter);
+
+ return view;
+ }
+ //다시 그리기
+ @Override
+ public void onResume() {
+ super.onResume();
+ toDoInfos = ToDoAppHelper.selectTodoInfo("todoInfo");
+ // toDoAdapter.clearData();
+ toDoAdapter.setItem(toDoInfos);
+ recyclerView.setAdapter(toDoAdapter);
+ }
+ //작성하기 내용 보여주기
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ if (requestCode == WRITE_RESULT) {
+ if (resultCode == RESULT_OK) {
+ toDoInfos = ToDoAppHelper.selectTodoInfo("todoInfo");
+ Comparator cmpAsc = new Comparator() {
+
+ @Override
+ public int compare(ToDoInfo o1, ToDoInfo o2) {
+ return o2.getDates().compareTo(o1.getDates()) ;
+ }
+ } ;
+ // toDoAdapter.clearData();
+ Collections.sort(toDoInfos,cmpAsc);
+
+ toDoAdapter.setItem(toDoInfos);
+ recyclerView.setAdapter(toDoAdapter);
+ }
+ }
+ }///onActivityResult
+
+
+
+}
diff --git a/app/src/main/java/com/abbsolute/ma_livu/Fragments/ToDoNotiFragment.java b/app/src/main/java/com/abbsolute/ma_livu/Fragments/ToDoNotiFragment.java
new file mode 100644
index 0000000..516ddd5
--- /dev/null
+++ b/app/src/main/java/com/abbsolute/ma_livu/Fragments/ToDoNotiFragment.java
@@ -0,0 +1,36 @@
+package com.abbsolute.ma_livu.Fragments;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.widget.SwitchCompat;
+import androidx.core.app.NotificationCompat;
+import androidx.fragment.app.Fragment;
+
+import com.abbsolute.ma_livu.R;
+
+public class ToDoNotiFragment extends Fragment {
+ SwitchCompat switchCompat;
+ private static final String CHANNEL_ID = "101" ;
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ View view=inflater.inflate(R.layout.fragment_notification,container,false);
+ switchCompat=view.findViewById(R.id.notify_switch);
+ if(switchCompat.isChecked()){
+ NotificationCompat.Builder builder = new NotificationCompat.Builder(getContext(), CHANNEL_ID)
+ .setSmallIcon(R.drawable.notification_icon)
+ .setContentTitle("My notification")
+ .setContentText("Much longer text that cannot fit one line...")
+ .setStyle(new NotificationCompat.BigTextStyle()
+ .bigText("Much longer text that cannot fit one line..."))
+ .setPriority(NotificationCompat.PRIORITY_DEFAULT);
+
+ }
+ return view;
+ }
+}
diff --git a/app/src/main/java/com/abbsolute/ma_livu/Fragments/ToDoWriteFragment.java b/app/src/main/java/com/abbsolute/ma_livu/Fragments/ToDoWriteFragment.java
new file mode 100644
index 0000000..abcf8d9
--- /dev/null
+++ b/app/src/main/java/com/abbsolute/ma_livu/Fragments/ToDoWriteFragment.java
@@ -0,0 +1,221 @@
+package com.abbsolute.ma_livu.Fragments;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.database.sqlite.SQLiteDatabase;
+import android.graphics.Color;
+import android.icu.text.SimpleDateFormat;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.EditText;
+import android.widget.NumberPicker;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.abbsolute.ma_livu.ToDoAppHelper;
+import com.abbsolute.ma_livu.ToDoCategoryAdapter;
+import com.abbsolute.ma_livu.ToDoCategoryInfo;
+import com.abbsolute.ma_livu.R;
+import com.abbsolute.ma_livu.ToDoInfo;
+
+import java.util.ArrayList;
+import java.util.Locale;
+
+import static android.app.Activity.RESULT_OK;
+import static com.abbsolute.ma_livu.ToDoAppHelper.insertData;
+
+
+public class ToDoWriteFragment extends Fragment implements OnBackPressedListener{
+ // newInstance constructor for creating fragment with arguments
+ public static ToDoWriteFragment newInstance() {
+ ToDoWriteFragment fragment = new ToDoWriteFragment();
+
+ return fragment;
+ }
+ EditText write;
+ EditText detailWrite;
+ TextView storing;
+ TextView cancel;
+ TextView setDday;
+ /////
+ private int year=0;
+ private int month=0;
+ private int day=0;
+ int val=0;
+ private int UPDATE_OK=5;
+ ///NumberPicker 정의
+ NumberPicker yearPicker;
+ NumberPicker monthPicker;
+ NumberPicker dayPicker;
+ ///
+ ToDoCategoryAdapter categoryAdapter;
+ RecyclerView categoryRecyclerview;
+ ArrayList categoryInfos=new ArrayList<>();
+
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ ViewGroup view=(ViewGroup)inflater.inflate(R.layout.todo_activity_write,container,false);
+ categoryRecyclerview=view.findViewById(R.id.todo_list_category);
+ LinearLayoutManager linearLayoutManager=new LinearLayoutManager(getContext(),LinearLayoutManager.HORIZONTAL,false);
+ categoryRecyclerview.setLayoutManager(linearLayoutManager);
+ categoryAdapter=new ToDoCategoryAdapter();
+ categoryInfos.add(new ToDoCategoryInfo(R.drawable.house_cleaning,"청소하기"));
+ categoryInfos.add(new ToDoCategoryInfo(R.drawable.laundry,"빨래하기"));
+ categoryInfos.add(new ToDoCategoryInfo(R.drawable.trash,"쓰레기"));
+ categoryInfos.add(new ToDoCategoryInfo(R.drawable.user1,"기타"));
+ categoryAdapter.setItem(categoryInfos);
+ categoryAdapter.getCategoryContext(getContext());
+ categoryRecyclerview.setAdapter(categoryAdapter);
+ ///intent 얻기
+ write=view.findViewById(R.id.write_todo);
+
+ storing=view.findViewById(R.id.store);
+ yearPicker=view.findViewById(R.id.set_year);
+ monthPicker=view.findViewById(R.id.set_month);
+ dayPicker=view.findViewById(R.id.set_day);
+ ////////////
+ yearPicker.setMinValue(2020);
+ yearPicker.setMaxValue(2030);
+ monthPicker.setMinValue(1);
+ monthPicker.setMaxValue(12);
+ dayPicker.setMinValue(1);
+ dayPicker.setMaxValue(31);
+ ///////////
+ ///
+ long systemTime = System.currentTimeMillis();
+ SimpleDateFormat formatter= null;
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
+ formatter = new SimpleDateFormat("yyyy-MM-dd", Locale.KOREA);
+ }
+ String date=formatter.format(systemTime);
+ String[] splitData=date.split("-");
+ String tmp1=splitData[0];
+ String tmp2=splitData[1];
+ String tmp3=splitData[2];
+ int splitYear=Integer.parseInt(tmp1);
+ int splitMonth=Integer.parseInt(tmp2);
+ int splitDay=Integer.parseInt(tmp3);
+ ///
+ yearPicker.setValue(splitYear);
+ monthPicker.setValue(splitMonth);
+ dayPicker.setValue(splitDay);
+ year=yearPicker.getValue();
+ month=monthPicker.getValue();
+ day=dayPicker.getValue();
+ SQLiteDatabase todo;
+ //저장
+ storing.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent1=getActivity().getIntent();
+ String word=intent1.getStringExtra("modify");
+ SharedPreferences pf=getContext().getSharedPreferences("pref", Activity.MODE_PRIVATE);
+ if(word!=null){//수정작업
+ String res=pf.getString("toDo","");
+ String resDetailTodo=write.getText().toString();
+ long systemTime = System.currentTimeMillis();
+ SimpleDateFormat formatter= null;
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
+ formatter = new SimpleDateFormat("yyyy-MM-dd", Locale.KOREA);
+ }
+ String date=formatter.format(systemTime);
+ String dDate=date;
+ if(year!=2020&&month!=1&&day!=1)
+ {
+ String months="0"+month;
+ dDate=year+"-"+months+"-"+day;
+ }
+ ToDoInfo toDoInfo=new ToDoInfo(res,resDetailTodo,date,dDate,Color.WHITE);
+ ToDoAppHelper.updateData(getContext(),"todoInfo",toDoInfo,word);
+ Intent intent=new Intent();
+ getActivity().setResult(RESULT_OK,intent);
+ getActivity().finish();
+ }else{//추가
+ ToDoFragment toDoFragment=new ToDoFragment();
+ Bundle bundle=new Bundle(1);
+ String res=pf.getString("toDo","");
+ String resDetailTodo=write.getText().toString();
+ bundle.putString("write_result_detail",resDetailTodo);
+ bundle.putString("write_result",res);
+ toDoFragment.setArguments(bundle);
+ Intent intent=new Intent();
+ getActivity().setResult(RESULT_OK,intent);
+ //sqlite쓰기
+ if(!res.equals("")&&!resDetailTodo.equals(""))
+ {
+ addData();
+ }else{
+ Toast.makeText(getContext(),"데이터를 입력하세요",Toast.LENGTH_SHORT).show();
+ }
+ getActivity().finish();
+ }
+
+ }
+ });
+ /*cancel=findViewById(R.id.undo);
+ cancel.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ finish();
+ }
+ });*/
+
+ /*setDday.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ checkDate();
+ }
+ });*/
+ return view;
+ }
+
+
+ @Override
+ public void onBackPressed() {
+ getActivity().finish();
+ }
+ public void addData(){
+ SharedPreferences pf=getContext().getSharedPreferences("pref", Activity.MODE_PRIVATE);
+ String data=pf.getString("toDo","");
+ String detailData=write.getText().toString();
+ long systemTime = System.currentTimeMillis();
+ SimpleDateFormat formatter= null;
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
+ formatter = new SimpleDateFormat("yyyy-MM-dd", Locale.KOREA);
+ }
+ String date=formatter.format(systemTime);
+ String dDate=date;
+ if(year!=2020&&month!=1&&day!=1)
+ {
+ String months="0"+month;
+ dDate=year+"-"+months+"-"+day;
+ }
+ ToDoInfo toDoInfo=new ToDoInfo(data,detailData,date,dDate,R.drawable.todo_border);
+ insertData("todoInfo",toDoInfo);
+ SharedPreferences pref = getContext().getSharedPreferences("set_theme", Activity.MODE_PRIVATE);
+ SharedPreferences.Editor editor = pref.edit();
+ editor.putInt("theme",1);
+ editor.commit();
+ //파이어베이스에 카테고리 클릭 할 때 마다 특정 점수 올라가는 코드 작성
+ }
+ final static int req1=1;
+ public String a = "0"; // initialize this globally at the top of your class.
+
+ /*public void setAlarm(Calendar target){
+ Intent intent = new Intent(getBaseContext(), MainActivity.class);
+ PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), req1, intent, 0);
+ AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
+ alarmManager.set(AlarmManager.RTC_WAKEUP, target.getTimeInMillis(), pendingIntent);
+ a ="1";
+ }*/
+}
diff --git a/app/src/main/java/com/abbsolute/ma_livu/Fragments/ToDoWriteFragment2.java b/app/src/main/java/com/abbsolute/ma_livu/Fragments/ToDoWriteFragment2.java
new file mode 100644
index 0000000..508efc7
--- /dev/null
+++ b/app/src/main/java/com/abbsolute/ma_livu/Fragments/ToDoWriteFragment2.java
@@ -0,0 +1,139 @@
+package com.abbsolute.ma_livu.Fragments;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.icu.text.SimpleDateFormat;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.NumberPicker;
+import android.widget.Toast;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.abbsolute.ma_livu.R;
+import com.abbsolute.ma_livu.ToDoCategoryAdapter;
+import com.abbsolute.ma_livu.ToDoCategoryInfo;
+import com.abbsolute.ma_livu.ToDoInfo;
+
+import java.util.ArrayList;
+import java.util.Locale;
+
+import static android.app.Activity.RESULT_OK;
+import static com.abbsolute.ma_livu.ToDoAppHelper.insertData;
+
+public class ToDoWriteFragment2 extends Fragment {
+ ToDoCategoryAdapter categoryAdapter;
+ RecyclerView categoryRecyclerview;
+ ArrayList categoryInfos=new ArrayList<>();
+ NumberPicker setPeriodDay;
+ NumberPicker setPeriod;
+ final String[] values={"매주","격주","매달"};
+ final String[] day={"월요일","화요일","수요일","목요일","금요일","토요일","일요일"};
+ EditText fixWrite;
+ // newInstance constructor for creating fragment with arguments
+ public static ToDoWriteFragment2 newInstance() {
+ ToDoWriteFragment2 fragment = new ToDoWriteFragment2();
+
+ return fragment;
+ }
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ ViewGroup view=(ViewGroup)inflater.inflate(R.layout.todo_activity_write2,container,false);
+ //기본 카테고리
+ categoryRecyclerview=view.findViewById(R.id.todo_list_category2);
+ LinearLayoutManager linearLayoutManager=new LinearLayoutManager(getContext(),LinearLayoutManager.HORIZONTAL,false);
+ categoryRecyclerview.setLayoutManager(linearLayoutManager);
+ categoryAdapter=new ToDoCategoryAdapter();
+ categoryInfos.add(new ToDoCategoryInfo(R.drawable.house_cleaning,"청소하기"));
+ categoryInfos.add(new ToDoCategoryInfo(R.drawable.laundry,"빨래하기"));
+ categoryInfos.add(new ToDoCategoryInfo(R.drawable.trash,"쓰레기"));
+ categoryInfos.add(new ToDoCategoryInfo(R.drawable.user1,"기타"));
+ categoryAdapter.setItem(categoryInfos);
+ categoryAdapter.getCategoryContext(getContext());
+ categoryRecyclerview.setAdapter(categoryAdapter);
+ ///기본 카데고리
+ setPeriod=view.findViewById(R.id.set_period);
+ setPeriodDay=view.findViewById(R.id.set_period_day);
+ //기간설정
+ setPeriod.setMinValue(0);
+ setPeriod.setMaxValue(values.length-1);
+ setPeriod.setWrapSelectorWheel(true);
+ setPeriod.setDisplayedValues(values);
+ //요일 설정
+ setPeriodDay.setMinValue(0);
+ setPeriodDay.setMaxValue(day.length-1);
+ setPeriodDay.setWrapSelectorWheel(true);
+ setPeriodDay.setDisplayedValues(day);
+ //
+ NumberPicker.OnScrollListener onScrollListener=new NumberPicker.OnScrollListener(){
+ @Override
+ public void onScrollStateChange(NumberPicker view, int scrollState) {
+ NumberPicker picker=view;
+
+ if(scrollState==SCROLL_STATE_IDLE){
+ if(view.getId()==R.id.set_period){
+ int val=picker.getValue();
+ if(val==values.length-1){
+ setPeriodDay.setDisplayedValues(null);
+ setPeriodDay.setMinValue(1);
+ setPeriodDay.setMaxValue(30);
+ setPeriodDay.setWrapSelectorWheel(true);
+ }
+ }
+ Toast.makeText(getContext(), ""+picker.getValue(), Toast.LENGTH_SHORT).show();
+ }
+ }
+ };
+ Button save=view.findViewById(R.id.write);
+ fixWrite=view.findViewById(R.id.todo_write2);
+ save.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ SharedPreferences pf=getContext().getSharedPreferences("pref", Activity.MODE_PRIVATE);
+ String res=pf.getString("toDo","");
+ String resDetailTodo=fixWrite.getText().toString();
+ Intent intent=new Intent();
+ getActivity().setResult(RESULT_OK,intent);
+ //sqlite쓰기
+ if(!res.equals("")&&!resDetailTodo.equals(""))
+ {
+ fixAddData();
+ }else{
+ Toast.makeText(getContext(),"데이터를 입력하세요",Toast.LENGTH_SHORT).show();
+ }
+ getActivity().finish();
+ }
+ });
+ return view;
+ }
+
+ private void fixAddData() {
+ SharedPreferences pf=getContext().getSharedPreferences("pref", Activity.MODE_PRIVATE);
+ String data=pf.getString("toDo","");
+ String detailData=fixWrite.getText().toString();
+ long systemTime = System.currentTimeMillis();
+ SimpleDateFormat formatter= null;
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
+ formatter = new SimpleDateFormat("yyyy-MM-dd", Locale.KOREA);
+ }
+ String date=formatter.format(systemTime);
+ String dDate=date;
+ ToDoInfo toDoInfo=new ToDoInfo(data,detailData,date,dDate,R.drawable.todo_border2);
+ insertData("todoInfo",toDoInfo);
+ SharedPreferences pref = getContext().getSharedPreferences("set_theme", Activity.MODE_PRIVATE);
+ SharedPreferences.Editor editor = pref.edit();
+ editor.putInt("theme",2);
+ editor.commit();
+ //파이어베이스에 카테고리 클릭 할 때 마다 특정 점수 올라가는 코드 작성
+ }
+}
diff --git a/app/src/main/java/com/abbsolute/ma_livu/GooeyMenu.java b/app/src/main/java/com/abbsolute/ma_livu/GooeyMenu.java
new file mode 100644
index 0000000..8732549
--- /dev/null
+++ b/app/src/main/java/com/abbsolute/ma_livu/GooeyMenu.java
@@ -0,0 +1,497 @@
+package com.abbsolute.ma_livu;
+
+import android.animation.Animator;
+import android.animation.ObjectAnimator;
+import android.animation.ValueAnimator;
+import android.content.Context;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Path;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.util.TypedValue;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.animation.AccelerateInterpolator;
+import android.view.animation.AnticipateOvershootInterpolator;
+import android.view.animation.LinearInterpolator;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by Anshul on 24/06/15.
+ */
+public class GooeyMenu extends View {
+ private static final int PLUS_HEIGHT=250;
+ private static final long ANIMATION_DURATION = 1000;
+ private static final int DEFUALT_MENU_NO = 5;
+ private final float START_ANGLE = 0f;
+ private final float END_ANGLE = 45f;
+ private int mNumberOfMenu;//Todo
+ private final float BEZIER_CONSTANT = 0.551915024494f;// pre-calculated value
+
+ private int mFabButtonRadius;
+ private int mMenuButtonRadius;
+ private int mGab;
+ private int mCenterX;
+ private int mCenterY;
+ private Paint mCirclePaint;
+ private ArrayList mMenuPoints = new ArrayList<>();
+ private ArrayList mShowAnimation = new ArrayList<>();
+ private ArrayList mHideAnimation = new ArrayList<>();
+ private ValueAnimator mBezierAnimation, mBezierEndAnimation, mRotationAnimation;
+ private boolean isMenuVisible = true;
+ private Float bezierConstant = BEZIER_CONSTANT;
+ private Bitmap mPlusBitmap;
+ private float mRotationAngle;
+ private ValueAnimator mRotationReverseAnimation;
+ private GooeyMenuInterface mGooeyMenuInterface;
+ private boolean gooeyMenuTouch;
+ private Paint mCircleBorder;
+ private List mDrawableArray;
+
+ public static final int[] STATE_ACTIVE =
+ {android.R.attr.state_enabled, android.R.attr.state_active};
+ public static final int[] STATE_PRESSED =
+ {android.R.attr.state_enabled, -android.R.attr.state_active,
+ android.R.attr.state_pressed};
+
+ public GooeyMenu(Context context) {
+ super(context);
+ init(null);
+ }
+
+ public GooeyMenu(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init(attrs);
+ }
+
+
+ public GooeyMenu(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ init(attrs);
+ }
+
+ public GooeyMenu(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ init(attrs);
+ }
+
+ private void init(AttributeSet attrs) {
+ if (attrs != null) {
+ TypedArray typedArray = getContext().getTheme().obtainStyledAttributes(
+ attrs,
+ R.styleable.GooeyMenu,
+ 0, 0);
+ try {
+ mNumberOfMenu = typedArray.getInt(R.styleable.GooeyMenu_no_of_menu, DEFUALT_MENU_NO);
+ mFabButtonRadius = (int) typedArray.getDimension(R.styleable.GooeyMenu_fab_radius, getResources().getDimension(R.dimen.big_circle_radius));
+ mMenuButtonRadius = (int) typedArray.getDimension(R.styleable.GooeyMenu_menu_radius, getResources().getDimension(R.dimen.small_circle_radius));
+ mGab = (int) typedArray.getDimension(R.styleable.GooeyMenu_gap_between_menu_fab, getResources().getDimensionPixelSize(R.dimen.min_gap));
+
+ TypedValue outValue = new TypedValue();
+ // Read array of target drawables
+ if (typedArray.getValue(R.styleable.GooeyMenu_menu_drawable, outValue)) {
+ Resources res = getContext().getResources();
+ TypedArray array = res.obtainTypedArray(outValue.resourceId);
+ mDrawableArray = new ArrayList<>(array.length());
+ for (int i = 0; i < array.length(); i++) {
+ TypedValue value = array.peekValue(i);
+ mDrawableArray.add(getResources().getDrawable(value != null ? value.resourceId : 0));
+ }
+ array.recycle();
+ }
+
+ } finally {
+ typedArray.recycle();
+ typedArray = null;
+ }
+
+ }
+
+ mCirclePaint = new Paint();
+ mCirclePaint.setColor(getResources().getColor(R.color.default_color));
+ mCirclePaint.setStyle(Paint.Style.FILL_AND_STROKE);
+
+ mCircleBorder = new Paint(mCirclePaint);
+ mCircleBorder.setStyle(Paint.Style.STROKE);
+ mCircleBorder.setStrokeWidth(1f);
+ mCircleBorder.setColor(getResources().getColor(R.color.default_color_dark));
+
+ mBezierEndAnimation = ValueAnimator.ofFloat(BEZIER_CONSTANT + .2f, BEZIER_CONSTANT);
+ mBezierEndAnimation.setInterpolator(new LinearInterpolator());
+ mBezierEndAnimation.setDuration(300);
+ mBezierEndAnimation.addUpdateListener(mBezierUpdateListener);
+
+ mBezierAnimation = ValueAnimator.ofFloat(BEZIER_CONSTANT - .02f, BEZIER_CONSTANT + .2f);
+ mBezierAnimation.setDuration(ANIMATION_DURATION / 4);
+ mBezierAnimation.setRepeatCount(4);
+ mBezierAnimation.setInterpolator(new LinearInterpolator());
+ mBezierAnimation.addUpdateListener(mBezierUpdateListener);
+ mBezierAnimation.addListener(mBezierAnimationListener);
+
+ mRotationAnimation = ValueAnimator.ofFloat(START_ANGLE, END_ANGLE);
+ mRotationAnimation.setDuration(ANIMATION_DURATION / 4);
+ mRotationAnimation.setInterpolator(new AccelerateInterpolator());
+ mRotationAnimation.addUpdateListener(mRotationUpdateListener);
+ mRotationReverseAnimation = ValueAnimator.ofFloat(END_ANGLE, START_ANGLE);
+ mRotationReverseAnimation.setDuration(ANIMATION_DURATION / 4);
+ mRotationReverseAnimation.setInterpolator(new AccelerateInterpolator());
+ mRotationReverseAnimation.addUpdateListener(mRotationUpdateListener);
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+
+ int desiredWidth;
+ int desiredHeight;
+ desiredWidth = getMeasuredWidth();
+ desiredHeight = getContext().getResources().getDimensionPixelSize(R.dimen.min_height);
+
+ int widthMode = MeasureSpec.getMode(widthMeasureSpec);
+ int widthSize = MeasureSpec.getSize(widthMeasureSpec);
+ int heightMode = MeasureSpec.getMode(heightMeasureSpec);
+ int heightSize = MeasureSpec.getSize(heightMeasureSpec);
+
+ int width;
+ int height;
+ //Measure Width
+ if (widthMode == MeasureSpec.EXACTLY) {
+ //Must be this size
+ width = widthSize;
+ } else if (widthMode == MeasureSpec.AT_MOST) {
+ //Can't be bigger than...
+ width = Math.min(desiredWidth, widthSize);
+ } else {
+ //Be whatever you want
+ width = desiredWidth;
+ }
+
+ //Measure Height
+ if (heightMode == MeasureSpec.EXACTLY) {
+ //Must be this size
+ height = heightSize;
+ } else if (heightMode == MeasureSpec.AT_MOST) {
+ //Can't be bigger than...
+ height = Math.min(desiredHeight, heightSize);
+ } else {
+ //Be whatever you want
+ height = desiredHeight;
+ }
+ setMeasuredDimension(width, height);
+ }
+
+ @Override
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ super.onSizeChanged(w, h, oldw, oldh);
+ mCenterX = w / 2;
+ mCenterY = h/2+mFabButtonRadius*11;
+ //h - mFabButtonRadius
+ for (int i = 0; i < mNumberOfMenu; i++) {
+ CirclePoint circlePoint = new CirclePoint();
+ circlePoint.setRadius(mGab);
+ circlePoint.setAngle((Math.PI / (mNumberOfMenu + 1)) * (i + 1));
+ mMenuPoints.add(circlePoint);
+ ObjectAnimator animShow = ObjectAnimator.ofFloat(mMenuPoints.get(i), "Radius", 0f, mGab);
+ animShow.setDuration(ANIMATION_DURATION);
+ animShow.setInterpolator(new AnticipateOvershootInterpolator());
+ animShow.setStartDelay((ANIMATION_DURATION * (mNumberOfMenu - i)) / 10);
+ animShow.addUpdateListener(mUpdateListener);
+ mShowAnimation.add(animShow);
+ ObjectAnimator animHide = animShow.clone();
+ animHide.setFloatValues(mGab, 0f);
+ animHide.setStartDelay((ANIMATION_DURATION * i) / 10);
+ mHideAnimation.add(animHide);
+ if (mDrawableArray != null) {
+ for (Drawable drawable : mDrawableArray)
+ drawable.setBounds(0, 0, /*2 * */mMenuButtonRadius,/* 2 * */mMenuButtonRadius);
+ }
+ }
+
+ }
+
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ mPlusBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.plus2);
+ }
+
+ @Override
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ mPlusBitmap = null;
+ mBezierAnimation = null;
+ mHideAnimation.clear();
+ mHideAnimation = null;
+ mShowAnimation.clear();
+ mHideAnimation = null;
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+ for (int i = 0; i < mNumberOfMenu; i++) {
+ CirclePoint circlePoint = mMenuPoints.get(i);
+ float x = (float) (circlePoint.radius * Math.cos(circlePoint.angle));
+ float y = (float) (circlePoint.radius * Math.sin(circlePoint.angle));
+ canvas.drawCircle(x + mCenterX, mCenterY - y, mMenuButtonRadius, mCirclePaint);
+ if (i < mDrawableArray.size()) {
+ canvas.save();
+ canvas.translate(x + mCenterX - mMenuButtonRadius / 2, mCenterY - y - mMenuButtonRadius / 2);
+ mDrawableArray.get(i).draw(canvas);
+ canvas.restore();
+ }
+ }
+ canvas.save();
+ canvas.translate(mCenterX, mCenterY);
+ Path path = createPath();
+ canvas.drawPath(path, mCirclePaint);
+ canvas.drawPath(path, mCircleBorder);
+ canvas.rotate(mRotationAngle);
+ canvas.drawBitmap(mPlusBitmap, -mPlusBitmap.getWidth() / 2, -mPlusBitmap.getHeight() / 2, mCirclePaint);
+ canvas.restore();
+ }
+
+ // Use Bezier path to create circle,
+ /* P_0 = (0,1), P_1 = (c,1), P_2 = (1,c), P_3 = (1,0)
+ P_0 = (1,0), P_1 = (1,-c), P_2 = (c,-1), P_3 = (0,-1)
+ P_0 = (0,-1), P_1 = (-c,-1), P_3 = (-1,-c), P_4 = (-1,0)
+ P_0 = (-1,0), P_1 = (-1,c), P_2 = (-c,1), P_3 = (0,1)
+ with c = 0.551915024494*/
+
+ private Path createPath() {
+ Path path = new Path();
+ float c = bezierConstant * mFabButtonRadius;
+
+ path.moveTo(0, mFabButtonRadius);
+ path.cubicTo(bezierConstant * mFabButtonRadius, mFabButtonRadius, mFabButtonRadius, BEZIER_CONSTANT * mFabButtonRadius, mFabButtonRadius, 0);
+ path.cubicTo(mFabButtonRadius, BEZIER_CONSTANT * mFabButtonRadius * (-1), c, (-1) * mFabButtonRadius, 0, (-1) * mFabButtonRadius);
+ path.cubicTo((-1) * c, (-1) * mFabButtonRadius, (-1) * mFabButtonRadius, (-1) * BEZIER_CONSTANT * mFabButtonRadius, (-1) * mFabButtonRadius, 0);
+ path.cubicTo((-1) * mFabButtonRadius, BEZIER_CONSTANT * mFabButtonRadius, (-1) * bezierConstant * mFabButtonRadius, mFabButtonRadius, 0, mFabButtonRadius);
+
+ return path;
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ if (isGooeyMenuTouch(event)) {
+ return true;
+ }
+ int menuItem = isMenuItemTouched(event);
+ if (isMenuVisible && menuItem > 0) {
+ if (menuItem <= mDrawableArray.size()) {
+ mDrawableArray.get(mMenuPoints.size() - menuItem).setState(STATE_PRESSED);
+ invalidate();
+ }
+
+ return true;
+ }
+ return false;
+ case MotionEvent.ACTION_UP:
+ if (isGooeyMenuTouch(event)) {
+ mBezierAnimation.start();
+ cancelAllAnimation();
+ if (isMenuVisible) {
+ startHideAnimate();
+ if (mGooeyMenuInterface != null) {
+ mGooeyMenuInterface.menuClose();
+ }
+ } else {
+ startShowAnimate();
+ if (mGooeyMenuInterface != null) {
+ mGooeyMenuInterface.menuOpen();
+ }
+ }
+ isMenuVisible = !isMenuVisible;
+ return true;
+ }
+
+ if (isMenuVisible) {
+ menuItem = isMenuItemTouched(event);
+ invalidate();
+ if (menuItem > 0) {
+ if (menuItem <= mDrawableArray.size()) {
+ mDrawableArray.get(mMenuPoints.size() - menuItem).setState(STATE_ACTIVE);
+ postInvalidateDelayed(1000);
+ }
+ if (mGooeyMenuInterface != null) {
+ mGooeyMenuInterface.menuItemClicked(menuItem);
+ }
+ return true;
+ }
+ }
+ return false;
+
+ }
+ return true;
+ }
+
+ private int isMenuItemTouched(MotionEvent event) {
+
+ if (!isMenuVisible) {
+ return -1;
+ }
+
+ for (int i = 0; i < mMenuPoints.size(); i++) {
+ CirclePoint circlePoint = mMenuPoints.get(i);
+ float x = (float) (mGab * Math.cos(circlePoint.angle)) + mCenterX;
+ float y = mCenterY - (float) (mGab * Math.sin(circlePoint.angle));
+ if (event.getX() >= x - mMenuButtonRadius && event.getX() <= x + mMenuButtonRadius) {
+ if (event.getY() >= y - mMenuButtonRadius && event.getY() <= y + mMenuButtonRadius) {
+ return mMenuPoints.size() - i;
+ }
+ }
+ }
+
+ return -1;
+ }
+
+ public void setOnMenuListener(GooeyMenuInterface onMenuListener) {
+ mGooeyMenuInterface = onMenuListener;
+ }
+
+ public boolean isGooeyMenuTouch(MotionEvent event) {
+ if (event.getX() >= mCenterX - mFabButtonRadius && event.getX() <= mCenterX + mFabButtonRadius) {
+ if (event.getY() >= mCenterY - mFabButtonRadius && event.getY() <= mCenterY + mFabButtonRadius) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // Helper class for animation and Menu Item cicle center Points
+ public class CirclePoint {
+ private float x;
+ private float y;
+ private float radius = 0.0f;
+ private double angle = 0.0f;
+
+ public void setX(float x1) {
+ x = x1;
+ }
+
+ public float getX() {
+ return x;
+ }
+
+ public void setY(float y1) {
+ y = y1;
+ }
+
+ public float getY() {
+ return y;
+ }
+
+ public void setRadius(float r) {
+ radius = r;
+ }
+
+ public float getRadius() {
+ return radius;
+ }
+
+ public void setAngle(double angle) {
+ this.angle = angle;
+ }
+
+ public double getAngle() {
+ return angle;
+ }
+ }
+
+ private void startShowAnimate() {
+ mRotationAnimation.start();
+ for (ObjectAnimator objectAnimator : mShowAnimation) {
+ objectAnimator.start();
+ }
+ }
+
+ private void startHideAnimate() {
+ mRotationReverseAnimation.start();
+ for (ObjectAnimator objectAnimator : mHideAnimation) {
+ objectAnimator.start();
+ }
+ }
+
+ private void cancelAllAnimation() {
+ for (ObjectAnimator objectAnimator : mHideAnimation) {
+ objectAnimator.cancel();
+ }
+ for (ObjectAnimator objectAnimator : mShowAnimation) {
+ objectAnimator.cancel();
+ }
+ }
+
+ ValueAnimator.AnimatorUpdateListener mUpdateListener = new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator valueAnimator) {
+ invalidate();
+ }
+ };
+
+ ValueAnimator.AnimatorUpdateListener mBezierUpdateListener = new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator valueAnimator) {
+ bezierConstant = (float) valueAnimator.getAnimatedValue();
+ invalidate();
+ }
+ };
+ ValueAnimator.AnimatorUpdateListener mRotationUpdateListener = new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator valueAnimator) {
+ mRotationAngle = (float) valueAnimator.getAnimatedValue();
+ invalidate();
+ }
+ };
+
+ ValueAnimator.AnimatorListener mBezierAnimationListener = new Animator.AnimatorListener() {
+ @Override
+ public void onAnimationStart(Animator animator) {
+
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animator) {
+ mBezierEndAnimation.start();
+ }
+
+ @Override
+ public void onAnimationCancel(Animator animator) {
+
+ }
+
+ @Override
+ public void onAnimationRepeat(Animator animator) {
+
+ }
+ };
+
+
+ public interface GooeyMenuInterface {
+ /**
+ * Called when menu opened
+ */
+ void menuOpen();
+
+ /**
+ * Called when menu Closed
+ */
+ void menuClose();
+
+ /**
+ * Called when Menu item Clicked
+ *
+ * @param menuNumber give menu number which clicked.
+ */
+ void menuItemClicked(int menuNumber);
+ }
+}
diff --git a/app/src/main/java/com/abbsolute/ma_livu/HelpFragment.java b/app/src/main/java/com/abbsolute/ma_livu/HelpFragment.java
new file mode 100644
index 0000000..2604d79
--- /dev/null
+++ b/app/src/main/java/com/abbsolute/ma_livu/HelpFragment.java
@@ -0,0 +1,33 @@
+package com.abbsolute.ma_livu;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.abbsolute.ma_livu.Activities.ToDoMainActivity;
+
+public class HelpFragment extends Fragment {
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ View view=inflater.inflate(R.layout.fragment_help,container,false);
+ Button bacKButton=view.findViewById(R.id.back);
+ bacKButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ getActivity().finish();
+ startActivity(new Intent(getContext(), ToDoMainActivity.class));
+ }
+ });
+ return view;
+ }
+
+
+}
diff --git a/app/src/main/java/com/abbsolute/ma_livu/HomeFragment.java b/app/src/main/java/com/abbsolute/ma_livu/HomeFragment.java
new file mode 100644
index 0000000..b8cc643
--- /dev/null
+++ b/app/src/main/java/com/abbsolute/ma_livu/HomeFragment.java
@@ -0,0 +1,26 @@
+package com.abbsolute.ma_livu;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+public class HomeFragment extends Fragment {
+ public static HomeFragment newInstance() {
+ Bundle args = new Bundle();
+ HomeFragment homeFragment = new HomeFragment();
+
+ return homeFragment;
+ }
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ ViewGroup viewGroup=(ViewGroup)inflater.inflate(R.layout.fragment_home,container,false);
+
+ return viewGroup;
+ }
+}
diff --git a/app/src/main/java/com/abbsolute/ma_livu/Interfaces/OnItemClickListner.java b/app/src/main/java/com/abbsolute/ma_livu/Interfaces/OnItemClickListner.java
new file mode 100644
index 0000000..69b2b87
--- /dev/null
+++ b/app/src/main/java/com/abbsolute/ma_livu/Interfaces/OnItemClickListner.java
@@ -0,0 +1,9 @@
+package com.abbsolute.ma_livu.Interfaces;
+
+import android.view.View;
+
+import com.abbsolute.ma_livu.ToDoAdapter;
+
+public interface OnItemClickListner {
+ public void onItemClick(ToDoAdapter.ViewHolder holder, View view, int position);
+}
diff --git a/app/src/main/java/com/abbsolute/ma_livu/Interfaces/OnbackPressedInferface.java b/app/src/main/java/com/abbsolute/ma_livu/Interfaces/OnbackPressedInferface.java
new file mode 100644
index 0000000..d165d28
--- /dev/null
+++ b/app/src/main/java/com/abbsolute/ma_livu/Interfaces/OnbackPressedInferface.java
@@ -0,0 +1,5 @@
+package com.abbsolute.ma_livu.Interfaces;
+
+public interface OnbackPressedInferface {
+ public void onBackPressed();
+}
diff --git a/app/src/main/java/com/abbsolute/ma_livu/MainActivity.java b/app/src/main/java/com/abbsolute/ma_livu/MainActivity.java
deleted file mode 100644
index 7ef7c35..0000000
--- a/app/src/main/java/com/abbsolute/ma_livu/MainActivity.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.abbsolute.ma_livu;
-
-import androidx.appcompat.app.AppCompatActivity;
-
-import android.os.Bundle;
-
-public class MainActivity extends AppCompatActivity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- }
-}
diff --git a/app/src/main/java/com/abbsolute/ma_livu/MyFirebaseInstanceIdService.java b/app/src/main/java/com/abbsolute/ma_livu/MyFirebaseInstanceIdService.java
new file mode 100644
index 0000000..c2e106d
--- /dev/null
+++ b/app/src/main/java/com/abbsolute/ma_livu/MyFirebaseInstanceIdService.java
@@ -0,0 +1,54 @@
+package com.abbsolute.ma_livu;
+
+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.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.core.app.NotificationCompat;
+
+import com.abbsolute.ma_livu.Activities.ToDoMainActivity;
+import com.google.firebase.messaging.FirebaseMessagingService;
+import com.google.firebase.messaging.RemoteMessage;
+
+public class MyFirebaseInstanceIdService extends FirebaseMessagingService {//FCM 알림 테스트 코드
+ @Override
+ public void onNewToken(@NonNull String s) {
+ super.onNewToken(s);
+ Log.d("FCM Log","Refreshed token"+s);
+ }
+
+ @Override
+ public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
+ if(remoteMessage.getNotification()!=null){
+ Log.d("FCM Log","알림 메시지:"+remoteMessage.getNotification().getBody());
+ String messageBody=remoteMessage.getNotification().getBody();
+ String messageTitle=remoteMessage.getNotification().getTitle();
+ Intent intent=new Intent(this, ToDoMainActivity.class);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ PendingIntent pendingIntent=PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_ONE_SHOT);
+ String channelId="Channel ID";
+ Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
+ NotificationCompat.Builder notificationBuilder=
+ new NotificationCompat.Builder(this,channelId)
+ .setSmallIcon(R.mipmap.ic_launcher)
+ .setContentTitle(messageTitle)
+ .setAutoCancel(true)
+ .setSound(defaultSoundUri)
+ .setContentIntent(pendingIntent);
+ NotificationManager notificationManager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
+ if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
+ String channelName="Channel Name";
+ NotificationChannel channel=new NotificationChannel(channelId,channelName,NotificationManager.IMPORTANCE_HIGH);
+ notificationManager.createNotificationChannel(channel);
+ }
+ notificationManager.notify(0,notificationBuilder.build());
+ }
+ }
+}
diff --git a/app/src/main/java/com/abbsolute/ma_livu/TabPagerAdapter.java b/app/src/main/java/com/abbsolute/ma_livu/TabPagerAdapter.java
new file mode 100644
index 0000000..2b0d4b9
--- /dev/null
+++ b/app/src/main/java/com/abbsolute/ma_livu/TabPagerAdapter.java
@@ -0,0 +1,42 @@
+package com.abbsolute.ma_livu;
+
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentStatePagerAdapter;
+
+import com.abbsolute.ma_livu.Fragments.CommunityFragment;
+import com.abbsolute.ma_livu.Fragments.HomeFragment;
+import com.abbsolute.ma_livu.Fragments.ProfileFragment;
+import com.abbsolute.ma_livu.Fragments.TitleFragment;
+
+public class TabPagerAdapter extends FragmentStatePagerAdapter {
+ private int tabCount;
+ public TabPagerAdapter(@NonNull FragmentManager fm, int tabCount) {
+ super(fm, tabCount);
+ this.tabCount=tabCount;
+ }
+
+ @NonNull
+ @Override
+ public Fragment getItem(int position) {
+ switch (position){
+ case 0:
+ return HomeFragment.newInstance();
+ case 1:
+ return CommunityFragment.newInstance();
+ case 2:
+ return TitleFragment.newInstance();
+ case 3:
+ return ProfileFragment.newInstance();
+ default:
+ return null;
+ }
+
+ }
+
+ @Override
+ public int getCount() {
+ return tabCount;
+ }
+}
diff --git a/app/src/main/java/com/abbsolute/ma_livu/TitleFragment.java b/app/src/main/java/com/abbsolute/ma_livu/TitleFragment.java
new file mode 100644
index 0000000..c5d5af7
--- /dev/null
+++ b/app/src/main/java/com/abbsolute/ma_livu/TitleFragment.java
@@ -0,0 +1,25 @@
+package com.abbsolute.ma_livu;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+public class TitleFragment extends Fragment {
+ public static TitleFragment newInstance() {
+ Bundle args = new Bundle();
+ TitleFragment titleFragment = new TitleFragment();
+
+ return titleFragment;
+ }
+ @Nullable
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ ViewGroup viewGroup=(ViewGroup)inflater.inflate(R.layout.fragment_title,container,false);
+ return viewGroup;
+ }
+}
diff --git a/app/src/main/java/com/abbsolute/ma_livu/ToDoAdapter.java b/app/src/main/java/com/abbsolute/ma_livu/ToDoAdapter.java
new file mode 100644
index 0000000..b8fee50
--- /dev/null
+++ b/app/src/main/java/com/abbsolute/ma_livu/ToDoAdapter.java
@@ -0,0 +1,109 @@
+package com.abbsolute.ma_livu;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.graphics.Color;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.CheckBox;
+import android.widget.FrameLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.abbsolute.ma_livu.Fragments.ToDoWriteFragment;
+import com.abbsolute.ma_livu.Interfaces.OnItemClickListner;
+
+import java.util.ArrayList;
+
+
+
+public class ToDoAdapter extends RecyclerView.Adapter {
+ ArrayList arrayList = new ArrayList<>();
+ OnItemClickListner listener;
+ CheckBox[] checkBoxes=new CheckBox[arrayList.size()];
+ Context context;
+ private static int UPDATE_RESULT=101;
+ // CheckBox checkBox;
+ boolean check=false;
+ public void setOnItemClickListner(OnItemClickListner listener) {
+ this.listener = listener;
+ }
+
+ public static class ViewHolder extends RecyclerView.ViewHolder {
+ protected TextView ContentsDetail;
+ protected TextView Contents;
+ protected TextView writeDates;
+ protected TextView dDays;
+ protected FrameLayout toDoFrame;
+ protected FrameLayout toDoDetailFrame;
+ public ViewHolder(View v) {
+ super(v);
+ this.Contents = v.findViewById(R.id.todo_text);//내용
+ this.ContentsDetail=v.findViewById(R.id.todo_text_detail);//상세내용
+ this.writeDates=v.findViewById(R.id.write_date);//작성 날짜
+ this.dDays=v.findViewById(R.id.d_date);//디데이
+ this.toDoFrame=v.findViewById(R.id.todo_frame);
+ this.toDoDetailFrame=v.findViewById(R.id.todo_detail_frame);
+ }
+
+ }
+ public void addItem(ToDoInfo info) {
+ arrayList.add(info);
+ }
+ public void removeTask(int pos){
+ arrayList.remove(pos);
+ notifyDataSetChanged();
+ }
+ public void setItem(ArrayList arrayList) {
+ this.arrayList = arrayList;
+ }
+ public void GetContext(Context context){
+ this.context=context;
+ }
+ @NonNull
+ @Override
+ public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ LayoutInflater inflater = LayoutInflater.from(parent.getContext());
+ View itemView = inflater.inflate(R.layout.todolist, parent, false);
+
+ return new ViewHolder(itemView);
+ }
+ public void getCheckState(boolean is){
+ check=is;
+ }
+ @Override
+ public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
+ final ToDoInfo toDoInfo = arrayList.get(position);
+ holder.Contents.setText(toDoInfo.getContent());
+ holder.ContentsDetail.setText(toDoInfo.getDetailContent());
+ holder.writeDates.setText(toDoInfo.getDates());
+ if(toDoInfo.getdDay()!=null){
+ holder.dDays.setText(toDoInfo.getdDay());
+ }
+ //수정
+ holder.Contents.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ Intent intent=new Intent(context, ToDoWriteFragment.class);
+ intent.putExtra("modify",toDoInfo.getContent());
+ context.startActivity(intent);
+ }
+ });
+ //고정 할 일 데이터는 뒷배경 회색으로, 카테고리는 흰색
+
+ holder.Contents.setBackgroundResource(toDoInfo.getColor());
+ holder.ContentsDetail.setBackgroundResource(toDoInfo.getColor());
+
+
+ }
+ @Override
+ public int getItemCount() {
+ return arrayList.size();
+ }
+}
diff --git a/app/src/main/java/com/abbsolute/ma_livu/ToDoAlarmReceiver.java b/app/src/main/java/com/abbsolute/ma_livu/ToDoAlarmReceiver.java
new file mode 100644
index 0000000..eff3025
--- /dev/null
+++ b/app/src/main/java/com/abbsolute/ma_livu/ToDoAlarmReceiver.java
@@ -0,0 +1,72 @@
+package com.abbsolute.ma_livu;
+
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build;
+import android.util.Log;
+
+import androidx.core.app.NotificationCompat;
+
+import com.abbsolute.ma_livu.Activities.ToDoMainActivity;
+
+public class ToDoAlarmReceiver extends BroadcastReceiver {// 알람을 받는 클래스
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+
+ Log.d("alarmStartttttt","START!!!!!");
+
+ String alarmContents = intent.getStringExtra("alarmContents");
+ Log.d("alarmContents",alarmContents);
+
+ NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
+ Intent notiIntent = new Intent(context, ToDoMainActivity.class);
+
+ notiIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
+ | Intent.FLAG_ACTIVITY_SINGLE_TOP);
+
+ PendingIntent pendingI = PendingIntent.getActivity(context, 0,
+ notiIntent, 0);
+
+
+ NotificationCompat.Builder builder = new NotificationCompat.Builder(context, "default");
+
+ if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){//채널생성
+ String channelName = "알람채널";
+ String description = "정해진 시간에 알람합니다";
+ int importance = NotificationManager.IMPORTANCE_HIGH;//소리와 알람메시지 같이 보여줌
+
+ NotificationChannel channel = null;
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ channel = new NotificationChannel("default", channelName, importance);
+ }
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ channel.setDescription(description);
+ }
+
+ if (notificationManager != null) {
+ // 노티피케이션 채널을 시스템에 등록
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ notificationManager.createNotificationChannel(channel);
+ }
+ }
+ }else builder.setSmallIcon(R.mipmap.ic_launcher); // Oreo 이하에서 mipmap 사용하지 않으면 Couldn't create icon: StatusBarIcon 에러남
+
+ builder.setAutoCancel(true)
+ .setDefaults(NotificationCompat.DEFAULT_ALL)
+ .setWhen(System.currentTimeMillis())
+ .setContentTitle(alarmContents+"하는 날입니다!")
+ .setContentText("완료하셨나용?")
+ .setContentIntent(pendingI)
+ .setSmallIcon(R.drawable.notification_icon);
+
+ if(notificationManager!=null){
+ notificationManager.notify(1234, builder.build());
+ }
+
+ }
+}
diff --git a/app/src/main/java/com/abbsolute/ma_livu/ToDoAppHelper.java b/app/src/main/java/com/abbsolute/ma_livu/ToDoAppHelper.java
new file mode 100644
index 0000000..d49e91d
--- /dev/null
+++ b/app/src/main/java/com/abbsolute/ma_livu/ToDoAppHelper.java
@@ -0,0 +1,155 @@
+package com.abbsolute.ma_livu;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.util.Log;
+
+import androidx.annotation.Nullable;
+
+import com.android.volley.RequestQueue;
+import com.android.volley.toolbox.Volley;
+
+import java.util.ArrayList;
+
+import static java.sql.Types.NULL;
+
+public class ToDoAppHelper {//db 쿼리문 다루는 클래스 delete, select, update, insert
+ private static final String TAG = "AppHelper";
+ private static SQLiteDatabase database;
+ public static RequestQueue requestQueue;
+ private static String createTableToDoInfoSql="create table if not exists todoInfo"+
+ "("+
+ "_id integer PRIMARY KEY autoincrement, " +
+ "content text, "+
+ "detailcontent text," +
+ "dates text, "+
+ "d_day text, "+
+ "colors integer"+
+ ")";
+ private static String SQL="drop table todoInfo";
+ public static void openDatabase(Context context, String databaseName, int version) {
+ println("openDatabase 호출됨");
+ // 헬퍼이용
+ DatabaseHelper helper = new DatabaseHelper(context, databaseName, null, version);
+ database = helper.getWritableDatabase();
+ createTable(database, "todoInfo");
+ // requestMovieList 안에서 나머지도 요청하도록 하였음.
+ // requestMovieList(database);
+ }
+
+ private static void createTable(SQLiteDatabase db, String tableName) {
+ println("createTable 호출됨 : " + tableName);
+
+ if (db != null) {
+ if (tableName.equals("todoInfo")) {
+ db.execSQL(createTableToDoInfoSql);
+ println("movieInfo 테이블 생성 요청됨.");
+ }
+ } else {
+ println("데이터베이스가 없습니다. 먼저 만들어 주세요.");
+ }
+ }
+ public static void insertData(String tableName, ToDoInfo toDoInfo) {
+ if (database != null) {
+ String sql = "insert into " + tableName + "(content,detailcontent,dates,d_day,colors) " +
+ "values(?, ?,?,?,?)";
+ Object[] params = {toDoInfo.content,toDoInfo.detailContent,toDoInfo.dates,toDoInfo.dDay,toDoInfo.color};
+ database.execSQL(sql, params);
+ println("할일 정보들 추가함.");
+ } else {
+ println("먼저 데이터베이스를 오픈하세요.");
+ }
+ }
+ public static void updateData(Context context,String tableName,ToDoInfo toDoInfo,String contents){
+ DatabaseHelper helper = new DatabaseHelper(context, "todo.db", null, 15);
+ database = helper.getWritableDatabase();
+ String sql="update "+ tableName +" set content='"+toDoInfo.getContent()+"',detailcontent='"+toDoInfo.getDetailContent()+"',dates='"+toDoInfo.getDates()+"'" +
+ ",d_day='"+toDoInfo.getdDay()+"'"+
+ " where content='"+contents+"';";
+ database.execSQL(sql);
+ }
+ public static ArrayList deleteData(Context context, String tableName, int id, ToDoInfo toDoInfo){
+ ArrayList toDoInfos=new ArrayList<>();
+ if(database!=null){
+ id++;
+ String tmp=Integer.toString(id);
+ // 헬퍼이용
+ DatabaseHelper helper = new DatabaseHelper(context, "todo.db", null, 15);
+ database = helper.getWritableDatabase();
+ String sql="delete from "+ tableName +" where content='" + toDoInfo.getContent() + "';";
+ database.execSQL(sql);
+ println(sql);
+ Cursor cursor = database.rawQuery(sql, null);
+ println("조회된 데이터 개수 : " + cursor.getCount());
+ for (int i = 0; i < cursor.getCount(); i++) {
+ cursor.moveToNext();
+ String content=cursor.getString(0);
+ String detailContent=cursor.getString(1);
+ String dates=cursor.getString(2);
+ String dDay=cursor.getString(3);
+ int colors=cursor.getInt(4);
+ toDoInfos.add(new ToDoInfo(content,detailContent,dates,dDay,colors));
+ }
+ cursor.close();
+ }
+ return toDoInfos;
+ }
+ public static ArrayList selectTodoInfo(String tableName) {
+ println("selectToDoInfo() 호출됨.");
+ ArrayList toDoInfos=new ArrayList<>();
+ if (database != null) {
+ String sql = "select content,detailcontent,dates,d_day,colors " +
+ "from " + tableName;
+ Log.d("Database",sql);
+ Cursor cursor = database.rawQuery(sql, null);
+ println("조회된 데이터 개수 : " + cursor.getCount());
+ for (int i = 0; i < cursor.getCount(); i++) {
+ cursor.moveToNext();
+ String content = cursor.getString(0);
+ String detailContent = cursor.getString(1);
+ String dates=cursor.getString(2);
+ String dDay=cursor.getString(3);
+ int colors=cursor.getInt(4);
+ toDoInfos.add(new ToDoInfo(content,detailContent,dates,dDay,colors));
+ }
+ cursor.close();
+ }
+ return toDoInfos;
+ }
+ public static void println(String data) {
+ Log.d(TAG, data);
+ }
+ static class DatabaseHelper extends SQLiteOpenHelper{
+ Context context;
+ public DatabaseHelper(@Nullable Context context, @Nullable String name, SQLiteDatabase.CursorFactory factory, int version) {
+ super(context, name, factory, version);
+ this.context = context;
+
+ if (requestQueue == null) {
+ requestQueue = Volley.newRequestQueue(context);
+ }
+ }
+
+ @Override
+ public void onCreate(SQLiteDatabase db) {
+ println("onCreate() 호출됨");
+ sameTasks(db);
+ }
+
+ private void sameTasks(SQLiteDatabase db) {
+ createTable(db, "todoInfo");
+ }
+
+ @Override
+ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+ println("onUpgrade() 호출됨: " + oldVersion + "," + newVersion);
+ if (newVersion > oldVersion) {
+ db.execSQL("drop table if exists todoInfo");
+ println("테이블 삭제함");
+ sameTasks(db);
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/abbsolute/ma_livu/ToDoCategoryAdapter.java b/app/src/main/java/com/abbsolute/ma_livu/ToDoCategoryAdapter.java
new file mode 100644
index 0000000..3918b14
--- /dev/null
+++ b/app/src/main/java/com/abbsolute/ma_livu/ToDoCategoryAdapter.java
@@ -0,0 +1,85 @@
+package com.abbsolute.ma_livu;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import java.util.ArrayList;
+
+public class ToDoCategoryAdapter extends RecyclerView.Adapter {
+ ArrayList arrayList=new ArrayList<>();
+ Context context;
+ public class ViewHolder extends RecyclerView.ViewHolder{
+ protected ImageView todoImg;
+ protected TextView todoText;
+
+ ViewHolder(View v){
+ super(v);
+ this.todoImg=v.findViewById(R.id.todo_image);
+ this.todoText=v.findViewById(R.id.todo_image_text);
+ }
+ }
+ public void setItem(ArrayList arrayList){
+ this.arrayList=arrayList;
+ }
+ public void getCategoryContext(Context context){
+ this.context=context;
+ }
+ @NonNull
+ @Override
+ public ToDoCategoryAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ LayoutInflater inflater = LayoutInflater.from(parent.getContext());
+ View itemView = inflater.inflate(R.layout.todo_category_list, parent, false);
+
+ return new ToDoCategoryAdapter.ViewHolder(itemView);
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
+ ToDoCategoryInfo categoryInfo=arrayList.get(position);
+ int img=categoryInfo.getToDoImage();
+ final String text=categoryInfo.getToDoText();
+ holder.todoImg.setImageResource(img);
+ holder.todoText.setText(text);
+ holder.todoImg.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ SharedPreferences pref = context.getSharedPreferences("pref", Activity.MODE_PRIVATE);
+ SharedPreferences.Editor editor = pref.edit();
+ if(text.equals("청소하기")){
+ Toast.makeText(context, "청소하기 이미지 클릭!", Toast.LENGTH_SHORT).show();
+ editor.putString("toDo", "청소");
+ editor.commit();
+ }
+ else if(text.equals("빨래하기")){
+ Toast.makeText(context, "빨래하기 이미지 클릭!", Toast.LENGTH_SHORT).show();
+ editor.putString("toDo","빨래");
+ editor.commit();
+ }
+ else if(text.equals("쓰레기")){
+ Toast.makeText(context, "쓰레기 이미지 클릭!", Toast.LENGTH_SHORT).show();
+ editor.putString("toDo","쓰레기");
+ editor.commit();
+ }
+ }
+ });
+
+
+ }
+
+
+
+ @Override
+ public int getItemCount() {
+ return arrayList.size();
+ }
+}
diff --git a/app/src/main/java/com/abbsolute/ma_livu/ToDoCategoryInfo.java b/app/src/main/java/com/abbsolute/ma_livu/ToDoCategoryInfo.java
new file mode 100644
index 0000000..c23fa89
--- /dev/null
+++ b/app/src/main/java/com/abbsolute/ma_livu/ToDoCategoryInfo.java
@@ -0,0 +1,26 @@
+package com.abbsolute.ma_livu;
+
+public class ToDoCategoryInfo {
+ int toDoImage;
+ String toDoText;
+ public ToDoCategoryInfo(int toDoImage, String toDoText){
+ this.toDoImage=toDoImage;
+ this.toDoText=toDoText;
+ }
+
+ public int getToDoImage() {
+ return toDoImage;
+ }
+
+ public void setToDoImage(int toDoImage) {
+ this.toDoImage = toDoImage;
+ }
+
+ public String getToDoText() {
+ return toDoText;
+ }
+
+ public void setToDoText(String toDoText) {
+ this.toDoText = toDoText;
+ }
+}
diff --git a/app/src/main/java/com/abbsolute/ma_livu/ToDoDeviceBootReceiver.java b/app/src/main/java/com/abbsolute/ma_livu/ToDoDeviceBootReceiver.java
new file mode 100644
index 0000000..131818e
--- /dev/null
+++ b/app/src/main/java/com/abbsolute/ma_livu/ToDoDeviceBootReceiver.java
@@ -0,0 +1,50 @@
+package com.abbsolute.ma_livu;
+
+import android.app.AlarmManager;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.Objects;
+
+import static android.content.Context.MODE_PRIVATE;
+
+public class ToDoDeviceBootReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (Objects.equals(intent.getAction(), "android.intent.action.BOOT_COMPLETED")) {
+
+ // on device boot complete, reset the alarm
+ Intent alarmIntent = new Intent(context, ToDoAlarmReceiver.class);
+ PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0);
+
+ AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
+//
+
+ SharedPreferences sharedPreferences = context.getSharedPreferences("daily_alarm", MODE_PRIVATE);
+ long millis = sharedPreferences.getLong("nextNotifyTime", Calendar.getInstance().getTimeInMillis());
+
+
+ Calendar current_calendar = Calendar.getInstance();
+ Calendar nextNotifyTime = new GregorianCalendar();
+ nextNotifyTime.setTimeInMillis(sharedPreferences.getLong("nextNotifyTime", millis));
+
+ if (current_calendar.after(nextNotifyTime)) {
+ nextNotifyTime.add(Calendar.DATE, 1);
+ }
+
+ /* Date currentDateTime = nextNotifyTime.getTime();
+ String date_text = new SimpleDateFormat("yyyy년 MM월 dd일 EE요일 a hh시 mm분 ", Locale.getDefault()).format(currentDateTime);
+ Toast.makeText(context.getApplicationContext(),"[재부팅후] 다음 알람은 " + date_text + "으로 알람이 설정되었습니다!", Toast.LENGTH_SHORT).show();
+ */
+
+ if (manager != null) {
+ manager.set(AlarmManager.RTC_WAKEUP, nextNotifyTime.getTimeInMillis(),pendingIntent);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/abbsolute/ma_livu/ToDoInfo.java b/app/src/main/java/com/abbsolute/ma_livu/ToDoInfo.java
new file mode 100644
index 0000000..e193357
--- /dev/null
+++ b/app/src/main/java/com/abbsolute/ma_livu/ToDoInfo.java
@@ -0,0 +1,63 @@
+package com.abbsolute.ma_livu;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.SharedPreferences;
+
+public class ToDoInfo {
+
+ String content;
+ String detailContent;
+ String dates;
+ String dDay;
+ Context context;
+ int color;
+ public ToDoInfo(){
+
+ }
+ public ToDoInfo(String content, String detailContent, String dates, String dDay,int color){
+ this.content=content;
+ this.detailContent=detailContent;
+ this.dates=dates;
+ this.dDay=dDay;
+ this.color=color;
+ }
+
+ public int getColor() {
+ return color;
+ }
+
+ public void setColor(int color) {
+ this.color = color;
+ }
+
+ public String getdDay() {
+ return dDay;
+ }
+
+ public void setdDay(String dDay) {
+ this.dDay = dDay;
+ }
+
+ public String getDates() {
+ return dates;
+ }
+
+ public void setDates(String dates) {
+ this.dates = dates;
+ }
+
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+ public String getDetailContent(){return detailContent;}
+ public void setDetailContent(String detailContent){
+ this.detailContent=detailContent;
+ }
+
+}
diff --git a/app/src/main/res/drawable/alarm_done.png b/app/src/main/res/drawable/alarm_done.png
new file mode 100644
index 0000000..11e0868
Binary files /dev/null and b/app/src/main/res/drawable/alarm_done.png differ
diff --git a/app/src/main/res/drawable/alarm_snooze_pressed.png b/app/src/main/res/drawable/alarm_snooze_pressed.png
new file mode 100644
index 0000000..a727a97
Binary files /dev/null and b/app/src/main/res/drawable/alarm_snooze_pressed.png differ
diff --git a/app/src/main/res/drawable/button_background.xml b/app/src/main/res/drawable/button_background.xml
new file mode 100644
index 0000000..0a78ef6
--- /dev/null
+++ b/app/src/main/res/drawable/button_background.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/cooking.png b/app/src/main/res/drawable/cooking.png
new file mode 100644
index 0000000..bc9b621
Binary files /dev/null and b/app/src/main/res/drawable/cooking.png differ
diff --git a/app/src/main/res/drawable/copy.png b/app/src/main/res/drawable/copy.png
new file mode 100644
index 0000000..9924b82
Binary files /dev/null and b/app/src/main/res/drawable/copy.png differ
diff --git a/app/src/main/res/drawable/desk_cleaning.png b/app/src/main/res/drawable/desk_cleaning.png
new file mode 100644
index 0000000..675635b
Binary files /dev/null and b/app/src/main/res/drawable/desk_cleaning.png differ
diff --git a/app/src/main/res/drawable/edge.xml b/app/src/main/res/drawable/edge.xml
new file mode 100644
index 0000000..a6bb331
--- /dev/null
+++ b/app/src/main/res/drawable/edge.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/edit_black.xml b/app/src/main/res/drawable/edit_black.xml
new file mode 100644
index 0000000..07e9d7d
--- /dev/null
+++ b/app/src/main/res/drawable/edit_black.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/help.png b/app/src/main/res/drawable/help.png
new file mode 100644
index 0000000..709bbe7
Binary files /dev/null and b/app/src/main/res/drawable/help.png differ
diff --git a/app/src/main/res/drawable/house_cleaning.png b/app/src/main/res/drawable/house_cleaning.png
new file mode 100644
index 0000000..1a8ef7e
Binary files /dev/null and b/app/src/main/res/drawable/house_cleaning.png differ
diff --git a/app/src/main/res/drawable/ic_audio.png b/app/src/main/res/drawable/ic_audio.png
new file mode 100644
index 0000000..d044848
Binary files /dev/null and b/app/src/main/res/drawable/ic_audio.png differ
diff --git a/app/src/main/res/drawable/ic_doc.png b/app/src/main/res/drawable/ic_doc.png
new file mode 100644
index 0000000..6f85acb
Binary files /dev/null and b/app/src/main/res/drawable/ic_doc.png differ
diff --git a/app/src/main/res/drawable/ic_hamburger_menu.png b/app/src/main/res/drawable/ic_hamburger_menu.png
new file mode 100644
index 0000000..06498a0
Binary files /dev/null and b/app/src/main/res/drawable/ic_hamburger_menu.png differ
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
index 0d025f9..07d5da9 100644
--- a/app/src/main/res/drawable/ic_launcher_background.xml
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -5,7 +5,7 @@
android:viewportWidth="108"
android:viewportHeight="108">
+
+
+
diff --git a/app/src/main/res/drawable/ic_menu_gallery.xml b/app/src/main/res/drawable/ic_menu_gallery.xml
new file mode 100644
index 0000000..03c7709
--- /dev/null
+++ b/app/src/main/res/drawable/ic_menu_gallery.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_menu_slideshow.xml b/app/src/main/res/drawable/ic_menu_slideshow.xml
new file mode 100644
index 0000000..5e9e163
--- /dev/null
+++ b/app/src/main/res/drawable/ic_menu_slideshow.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_photo.png b/app/src/main/res/drawable/ic_photo.png
new file mode 100644
index 0000000..8a3e99d
Binary files /dev/null and b/app/src/main/res/drawable/ic_photo.png differ
diff --git a/app/src/main/res/drawable/ic_video.png b/app/src/main/res/drawable/ic_video.png
new file mode 100644
index 0000000..ab94a7c
Binary files /dev/null and b/app/src/main/res/drawable/ic_video.png differ
diff --git a/app/src/main/res/drawable/item_selector.xml b/app/src/main/res/drawable/item_selector.xml
new file mode 100644
index 0000000..0339f9f
--- /dev/null
+++ b/app/src/main/res/drawable/item_selector.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/laundry.png b/app/src/main/res/drawable/laundry.png
new file mode 100644
index 0000000..30cd4de
Binary files /dev/null and b/app/src/main/res/drawable/laundry.png differ
diff --git a/app/src/main/res/drawable/minus.png b/app/src/main/res/drawable/minus.png
new file mode 100644
index 0000000..403bbff
Binary files /dev/null and b/app/src/main/res/drawable/minus.png differ
diff --git a/app/src/main/res/drawable/notification_icon.png b/app/src/main/res/drawable/notification_icon.png
new file mode 100644
index 0000000..043c566
Binary files /dev/null and b/app/src/main/res/drawable/notification_icon.png differ
diff --git a/app/src/main/res/drawable/plus.png b/app/src/main/res/drawable/plus.png
new file mode 100644
index 0000000..a36656c
Binary files /dev/null and b/app/src/main/res/drawable/plus.png differ
diff --git a/app/src/main/res/drawable/plus2.png b/app/src/main/res/drawable/plus2.png
new file mode 100644
index 0000000..0bfbd90
Binary files /dev/null and b/app/src/main/res/drawable/plus2.png differ
diff --git a/app/src/main/res/drawable/selector_cooking.xml b/app/src/main/res/drawable/selector_cooking.xml
new file mode 100644
index 0000000..7fc65ab
--- /dev/null
+++ b/app/src/main/res/drawable/selector_cooking.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/selector_house_cleaning.xml b/app/src/main/res/drawable/selector_house_cleaning.xml
new file mode 100644
index 0000000..f281379
--- /dev/null
+++ b/app/src/main/res/drawable/selector_house_cleaning.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/selector_laundry.xml b/app/src/main/res/drawable/selector_laundry.xml
new file mode 100644
index 0000000..c556083
--- /dev/null
+++ b/app/src/main/res/drawable/selector_laundry.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/selector_video.xml b/app/src/main/res/drawable/selector_video.xml
new file mode 100644
index 0000000..7d8c7a5
--- /dev/null
+++ b/app/src/main/res/drawable/selector_video.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/share.png b/app/src/main/res/drawable/share.png
new file mode 100644
index 0000000..0838468
Binary files /dev/null and b/app/src/main/res/drawable/share.png differ
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..6d81870
--- /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/tab_border.xml b/app/src/main/res/drawable/tab_border.xml
new file mode 100644
index 0000000..2dcb8dd
--- /dev/null
+++ b/app/src/main/res/drawable/tab_border.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/todo_border.xml b/app/src/main/res/drawable/todo_border.xml
new file mode 100644
index 0000000..f320e03
--- /dev/null
+++ b/app/src/main/res/drawable/todo_border.xml
@@ -0,0 +1,11 @@
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/todo_border2.xml b/app/src/main/res/drawable/todo_border2.xml
new file mode 100644
index 0000000..42fa582
--- /dev/null
+++ b/app/src/main/res/drawable/todo_border2.xml
@@ -0,0 +1,11 @@
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/trash.png b/app/src/main/res/drawable/trash.png
new file mode 100644
index 0000000..abb5041
Binary files /dev/null and b/app/src/main/res/drawable/trash.png differ
diff --git a/app/src/main/res/drawable/user1.png b/app/src/main/res/drawable/user1.png
new file mode 100644
index 0000000..25a86c4
Binary files /dev/null and b/app/src/main/res/drawable/user1.png differ
diff --git a/app/src/main/res/drawable/washing_dishes.png b/app/src/main/res/drawable/washing_dishes.png
new file mode 100644
index 0000000..07d2f00
Binary files /dev/null and b/app/src/main/res/drawable/washing_dishes.png differ
diff --git a/app/src/main/res/layout/app_bar_main.xml b/app/src/main/res/layout/app_bar_main.xml
new file mode 100644
index 0000000..11646d5
--- /dev/null
+++ b/app/src/main/res/layout/app_bar_main.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/content_main.xml b/app/src/main/res/layout/content_main.xml
new file mode 100644
index 0000000..27922d4
--- /dev/null
+++ b/app/src/main/res/layout/content_main.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_community.xml b/app/src/main/res/layout/fragment_community.xml
new file mode 100644
index 0000000..eeeaa2b
--- /dev/null
+++ b/app/src/main/res/layout/fragment_community.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_gallery.xml b/app/src/main/res/layout/fragment_gallery.xml
new file mode 100644
index 0000000..643fe25
--- /dev/null
+++ b/app/src/main/res/layout/fragment_gallery.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_help.xml b/app/src/main/res/layout/fragment_help.xml
new file mode 100644
index 0000000..eb592ac
--- /dev/null
+++ b/app/src/main/res/layout/fragment_help.xml
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/fragment_home.xml
similarity index 57%
rename from app/src/main/res/layout/activity_main.xml
rename to app/src/main/res/layout/fragment_home.xml
index 4fc2444..f3d9b08 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -4,15 +4,19 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
- tools:context=".MainActivity">
+ tools:context=".ui.home.HomeFragment">
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_notification.xml b/app/src/main/res/layout/fragment_notification.xml
new file mode 100644
index 0000000..f7d3a87
--- /dev/null
+++ b/app/src/main/res/layout/fragment_notification.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_profile.xml b/app/src/main/res/layout/fragment_profile.xml
new file mode 100644
index 0000000..61a4490
--- /dev/null
+++ b/app/src/main/res/layout/fragment_profile.xml
@@ -0,0 +1,6 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_slideshow.xml b/app/src/main/res/layout/fragment_slideshow.xml
new file mode 100644
index 0000000..2141a33
--- /dev/null
+++ b/app/src/main/res/layout/fragment_slideshow.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_title.xml b/app/src/main/res/layout/fragment_title.xml
new file mode 100644
index 0000000..61a4490
--- /dev/null
+++ b/app/src/main/res/layout/fragment_title.xml
@@ -0,0 +1,6 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_todo.xml b/app/src/main/res/layout/fragment_todo.xml
new file mode 100644
index 0000000..eccc558
--- /dev/null
+++ b/app/src/main/res/layout/fragment_todo.xml
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/nav_header_main.xml b/app/src/main/res/layout/nav_header_main.xml
new file mode 100644
index 0000000..4c3439a
--- /dev/null
+++ b/app/src/main/res/layout/nav_header_main.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/todo_activity_alarm.xml b/app/src/main/res/layout/todo_activity_alarm.xml
new file mode 100644
index 0000000..61a4490
--- /dev/null
+++ b/app/src/main/res/layout/todo_activity_alarm.xml
@@ -0,0 +1,6 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/todo_activity_main.xml b/app/src/main/res/layout/todo_activity_main.xml
new file mode 100644
index 0000000..4716b52
--- /dev/null
+++ b/app/src/main/res/layout/todo_activity_main.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/todo_activity_write.xml b/app/src/main/res/layout/todo_activity_write.xml
new file mode 100644
index 0000000..30c5781
--- /dev/null
+++ b/app/src/main/res/layout/todo_activity_write.xml
@@ -0,0 +1,140 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/todo_activity_write2.xml b/app/src/main/res/layout/todo_activity_write2.xml
new file mode 100644
index 0000000..501237e
--- /dev/null
+++ b/app/src/main/res/layout/todo_activity_write2.xml
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/todo_category_list.xml b/app/src/main/res/layout/todo_category_list.xml
new file mode 100644
index 0000000..6f3ff5f
--- /dev/null
+++ b/app/src/main/res/layout/todo_category_list.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/todo_fix_list.xml b/app/src/main/res/layout/todo_fix_list.xml
new file mode 100644
index 0000000..d1f52d6
--- /dev/null
+++ b/app/src/main/res/layout/todo_fix_list.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/todo_write_main.xml b/app/src/main/res/layout/todo_write_main.xml
new file mode 100644
index 0000000..82fde57
--- /dev/null
+++ b/app/src/main/res/layout/todo_write_main.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/todolist.xml b/app/src/main/res/layout/todolist.xml
new file mode 100644
index 0000000..64657be
--- /dev/null
+++ b/app/src/main/res/layout/todolist.xml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/activity_main_drawer.xml b/app/src/main/res/menu/activity_main_drawer.xml
new file mode 100644
index 0000000..3b0f154
--- /dev/null
+++ b/app/src/main/res/menu/activity_main_drawer.xml
@@ -0,0 +1,16 @@
+
+
diff --git a/app/src/main/res/menu/main.xml b/app/src/main/res/menu/main.xml
new file mode 100644
index 0000000..a2411e3
--- /dev/null
+++ b/app/src/main/res/menu/main.xml
@@ -0,0 +1,9 @@
+
+
diff --git a/app/src/main/res/menu/tab_menu.xml b/app/src/main/res/menu/tab_menu.xml
new file mode 100644
index 0000000..93a7191
--- /dev/null
+++ b/app/src/main/res/menu/tab_menu.xml
@@ -0,0 +1,15 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/array.xml b/app/src/main/res/values/array.xml
new file mode 100644
index 0000000..5b02fd1
--- /dev/null
+++ b/app/src/main/res/values/array.xml
@@ -0,0 +1,11 @@
+
+
+
+
+ - @drawable/washing_dishes
+ - @drawable/desk_cleaning
+ - @drawable/selector_laundry
+ - @drawable/selector_cooking
+ - @drawable/selector_house_cleaning
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml
new file mode 100644
index 0000000..7726a47
--- /dev/null
+++ b/app/src/main/res/values/attrs.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 69b2233..25a6764 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -1,6 +1,9 @@
- #008577
- #00574B
- #D81B60
+ #6200EE
+ #3700B3
+ #03DAC5
+ #02a6d8
+ #52a6b8
+ #FF0000
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..12de361
--- /dev/null
+++ b/app/src/main/res/values/dimens.xml
@@ -0,0 +1,17 @@
+
+
+ 16dp
+ 16dp
+ 8dp
+ 176dp
+ 16dp
+
+
+
+ 260dp
+ 30dp
+ 32dp
+
+ 105dp
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index f942611..79a4eb2 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,3 +1,18 @@
- MaLive
+ ToDoList
+ Open navigation drawer
+ Close navigation drawer
+ Android Studio
+ android.studio@android.com
+ Navigation header
+ Settings
+
+ Home
+ Gallery
+ Slideshow
+
+ Home Second
+
+
+ Fcm
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 5885930..545b9c6 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -8,4 +8,13 @@
- @color/colorAccent
+
+
+
+
+
+
diff --git a/build.gradle b/build.gradle
index a5bb815..f77bc2f 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,14 +1,17 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
+
repositories {
google()
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.5.3'
+ classpath 'com.android.tools.build:gradle:3.6.1'
+ classpath 'com.google.gms:google-services:4.3.3'
+
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
diff --git a/dribble.gif b/dribble.gif
new file mode 100644
index 0000000..a81a34f
Binary files /dev/null and b/dribble.gif differ
diff --git a/gooeyeffect.gif b/gooeyeffect.gif
new file mode 100644
index 0000000..fa913fd
Binary files /dev/null and b/gooeyeffect.gif differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 5b80d82..1760bf9 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip