From 8c7bc94c2c7377530c3b8d57b52723f014c695e3 Mon Sep 17 00:00:00 2001 From: kdh123456 Date: Tue, 26 May 2020 20:33:22 +0900 Subject: [PATCH 01/19] Create fragment_community.xml --- app/src/main/res/layout/fragment_community.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 app/src/main/res/layout/fragment_community.xml 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..a2b48c5 --- /dev/null +++ b/app/src/main/res/layout/fragment_community.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file From 1e365ae9e1d40fb6c57dc65d0ab67318d0c28b94 Mon Sep 17 00:00:00 2001 From: kdh123456 Date: Tue, 26 May 2020 20:45:58 +0900 Subject: [PATCH 02/19] uploadTodoList --- app/build.gradle | 34 +- app/src/main/AndroidManifest.xml | 24 +- .../com/abbsolute/ma_livu/AlarmActivity.java | 15 + .../com/abbsolute/ma_livu/AlarmReceiver.java | 37 ++ .../java/com/abbsolute/ma_livu/AppHelper.java | 152 ++++++ .../abbsolute/ma_livu/CommunityFragment.java | 25 + .../java/com/abbsolute/ma_livu/GooeyMenu.java | 497 ++++++++++++++++++ .../com/abbsolute/ma_livu/HelpFragment.java | 32 ++ .../com/abbsolute/ma_livu/HomeFragment.java | 26 + .../com/abbsolute/ma_livu/MainActivity.java | 323 +++++++++++- .../ma_livu/MyFirebaseInstanceIdService.java | 55 ++ .../com/abbsolute/ma_livu/NotiFragment.java | 34 ++ .../abbsolute/ma_livu/OnItemClickListner.java | 7 + .../ma_livu/OnbackPressedInferface.java | 5 + .../abbsolute/ma_livu/ProfileFragment.java | 25 + .../abbsolute/ma_livu/TabPagerAdapter.java | 37 ++ .../com/abbsolute/ma_livu/TitleFragment.java | 25 + .../com/abbsolute/ma_livu/ToDoAdapter.java | 93 ++++ .../com/abbsolute/ma_livu/ToDoFragment.java | 127 +++++ .../java/com/abbsolute/ma_livu/ToDoInfo.java | 48 ++ .../com/abbsolute/ma_livu/WriteActivity.java | 143 +++++ .../ma_livu/ui/gallery/GalleryFragment.java | 35 ++ .../ma_livu/ui/gallery/GalleryViewModel.java | 19 + .../ma_livu/ui/home/HomeFragment.java | 35 ++ .../ma_livu/ui/home/HomeViewModel.java | 19 + .../ui/slideshow/SlideshowFragment.java | 35 ++ .../ui/slideshow/SlideshowViewModel.java | 19 + app/src/main/res/drawable/alarm_done.png | Bin 0 -> 964 bytes .../res/drawable/alarm_snooze_pressed.png | Bin 0 -> 2679 bytes app/src/main/res/drawable/edge.xml | 8 + app/src/main/res/drawable/edit_black.xml | 14 + app/src/main/res/drawable/help.png | Bin 0 -> 13584 bytes app/src/main/res/drawable/ic_audio.png | Bin 0 -> 587 bytes app/src/main/res/drawable/ic_doc.png | Bin 0 -> 594 bytes .../main/res/drawable/ic_hamburger_menu.png | Bin 0 -> 113 bytes .../res/drawable/ic_launcher_background.xml | 2 +- app/src/main/res/drawable/ic_menu_camera.xml | 12 + app/src/main/res/drawable/ic_menu_gallery.xml | 9 + .../main/res/drawable/ic_menu_slideshow.xml | 9 + app/src/main/res/drawable/ic_photo.png | Bin 0 -> 656 bytes app/src/main/res/drawable/ic_video.png | Bin 0 -> 799 bytes app/src/main/res/drawable/item_selector.xml | 10 + app/src/main/res/drawable/minus.png | Bin 0 -> 22518 bytes .../main/res/drawable/notification_icon.png | Bin 0 -> 9588 bytes app/src/main/res/drawable/plus.png | Bin 0 -> 22874 bytes app/src/main/res/drawable/plus2.png | Bin 0 -> 205 bytes app/src/main/res/drawable/selector_audio.xml | 9 + app/src/main/res/drawable/selector_doc.xml | 9 + app/src/main/res/drawable/selector_photo.xml | 9 + app/src/main/res/drawable/selector_video.xml | 9 + app/src/main/res/drawable/side_nav_bar.xml | 9 + app/src/main/res/drawable/tab_border.xml | 34 ++ app/src/main/res/drawable/todo_border.xml | 11 + app/src/main/res/drawable/user1.png | Bin 0 -> 976 bytes app/src/main/res/layout/activity_alarm.xml | 6 + app/src/main/res/layout/activity_main.xml | 41 +- app/src/main/res/layout/activity_write.xml | 75 +++ app/src/main/res/layout/app_bar_main.xml | 34 ++ app/src/main/res/layout/content_main.xml | 39 ++ .../main/res/layout/fragment_community.xml | 23 +- app/src/main/res/layout/fragment_gallery.xml | 22 + app/src/main/res/layout/fragment_help.xml | 62 +++ app/src/main/res/layout/fragment_home.xml | 22 + .../main/res/layout/fragment_notification.xml | 28 + app/src/main/res/layout/fragment_profile.xml | 6 + .../main/res/layout/fragment_slideshow.xml | 22 + app/src/main/res/layout/fragment_title.xml | 6 + app/src/main/res/layout/fragment_todo.xml | 56 ++ app/src/main/res/layout/nav_header_main.xml | 36 ++ app/src/main/res/layout/todolist.xml | 59 +++ .../main/res/menu/activity_main_drawer.xml | 16 + app/src/main/res/menu/main.xml | 9 + app/src/main/res/menu/tab_menu.xml | 15 + app/src/main/res/values/array.xml | 11 + app/src/main/res/values/attrs.xml | 11 + app/src/main/res/values/colors.xml | 9 +- app/src/main/res/values/dimens.xml | 17 + app/src/main/res/values/strings.xml | 17 +- app/src/main/res/values/styles.xml | 9 + build.gradle | 5 +- dribble.gif | Bin 0 -> 486009 bytes gooeyeffect.gif | Bin 0 -> 791450 bytes 82 files changed, 2701 insertions(+), 35 deletions(-) create mode 100644 app/src/main/java/com/abbsolute/ma_livu/AlarmActivity.java create mode 100644 app/src/main/java/com/abbsolute/ma_livu/AlarmReceiver.java create mode 100644 app/src/main/java/com/abbsolute/ma_livu/AppHelper.java create mode 100644 app/src/main/java/com/abbsolute/ma_livu/CommunityFragment.java create mode 100644 app/src/main/java/com/abbsolute/ma_livu/GooeyMenu.java create mode 100644 app/src/main/java/com/abbsolute/ma_livu/HelpFragment.java create mode 100644 app/src/main/java/com/abbsolute/ma_livu/HomeFragment.java create mode 100644 app/src/main/java/com/abbsolute/ma_livu/MyFirebaseInstanceIdService.java create mode 100644 app/src/main/java/com/abbsolute/ma_livu/NotiFragment.java create mode 100644 app/src/main/java/com/abbsolute/ma_livu/OnItemClickListner.java create mode 100644 app/src/main/java/com/abbsolute/ma_livu/OnbackPressedInferface.java create mode 100644 app/src/main/java/com/abbsolute/ma_livu/ProfileFragment.java create mode 100644 app/src/main/java/com/abbsolute/ma_livu/TabPagerAdapter.java create mode 100644 app/src/main/java/com/abbsolute/ma_livu/TitleFragment.java create mode 100644 app/src/main/java/com/abbsolute/ma_livu/ToDoAdapter.java create mode 100644 app/src/main/java/com/abbsolute/ma_livu/ToDoFragment.java create mode 100644 app/src/main/java/com/abbsolute/ma_livu/ToDoInfo.java create mode 100644 app/src/main/java/com/abbsolute/ma_livu/WriteActivity.java create mode 100644 app/src/main/java/com/abbsolute/ma_livu/ui/gallery/GalleryFragment.java create mode 100644 app/src/main/java/com/abbsolute/ma_livu/ui/gallery/GalleryViewModel.java create mode 100644 app/src/main/java/com/abbsolute/ma_livu/ui/home/HomeFragment.java create mode 100644 app/src/main/java/com/abbsolute/ma_livu/ui/home/HomeViewModel.java create mode 100644 app/src/main/java/com/abbsolute/ma_livu/ui/slideshow/SlideshowFragment.java create mode 100644 app/src/main/java/com/abbsolute/ma_livu/ui/slideshow/SlideshowViewModel.java create mode 100644 app/src/main/res/drawable/alarm_done.png create mode 100644 app/src/main/res/drawable/alarm_snooze_pressed.png create mode 100644 app/src/main/res/drawable/edge.xml create mode 100644 app/src/main/res/drawable/edit_black.xml create mode 100644 app/src/main/res/drawable/help.png create mode 100644 app/src/main/res/drawable/ic_audio.png create mode 100644 app/src/main/res/drawable/ic_doc.png create mode 100644 app/src/main/res/drawable/ic_hamburger_menu.png create mode 100644 app/src/main/res/drawable/ic_menu_camera.xml create mode 100644 app/src/main/res/drawable/ic_menu_gallery.xml create mode 100644 app/src/main/res/drawable/ic_menu_slideshow.xml create mode 100644 app/src/main/res/drawable/ic_photo.png create mode 100644 app/src/main/res/drawable/ic_video.png create mode 100644 app/src/main/res/drawable/item_selector.xml create mode 100644 app/src/main/res/drawable/minus.png create mode 100644 app/src/main/res/drawable/notification_icon.png create mode 100644 app/src/main/res/drawable/plus.png create mode 100644 app/src/main/res/drawable/plus2.png create mode 100644 app/src/main/res/drawable/selector_audio.xml create mode 100644 app/src/main/res/drawable/selector_doc.xml create mode 100644 app/src/main/res/drawable/selector_photo.xml create mode 100644 app/src/main/res/drawable/selector_video.xml create mode 100644 app/src/main/res/drawable/side_nav_bar.xml create mode 100644 app/src/main/res/drawable/tab_border.xml create mode 100644 app/src/main/res/drawable/todo_border.xml create mode 100644 app/src/main/res/drawable/user1.png create mode 100644 app/src/main/res/layout/activity_alarm.xml create mode 100644 app/src/main/res/layout/activity_write.xml create mode 100644 app/src/main/res/layout/app_bar_main.xml create mode 100644 app/src/main/res/layout/content_main.xml create mode 100644 app/src/main/res/layout/fragment_gallery.xml create mode 100644 app/src/main/res/layout/fragment_help.xml create mode 100644 app/src/main/res/layout/fragment_home.xml create mode 100644 app/src/main/res/layout/fragment_notification.xml create mode 100644 app/src/main/res/layout/fragment_profile.xml create mode 100644 app/src/main/res/layout/fragment_slideshow.xml create mode 100644 app/src/main/res/layout/fragment_title.xml create mode 100644 app/src/main/res/layout/fragment_todo.xml create mode 100644 app/src/main/res/layout/nav_header_main.xml create mode 100644 app/src/main/res/layout/todolist.xml create mode 100644 app/src/main/res/menu/activity_main_drawer.xml create mode 100644 app/src/main/res/menu/main.xml create mode 100644 app/src/main/res/menu/tab_menu.xml create mode 100644 app/src/main/res/values/array.xml create mode 100644 app/src/main/res/values/attrs.xml create mode 100644 app/src/main/res/values/dimens.xml create mode 100644 dribble.gif create mode 100644 gooeyeffect.gif diff --git a/app/build.gradle b/app/build.gradle index 9441db6..4ebfd92 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,29 +1,47 @@ apply plugin: 'com.android.application' - +apply plugin: 'com.google.gms.google-services' android { - compileSdkVersion 29 + compileSdkVersion 28 buildToolsVersion "29.0.2" + defaultConfig { - applicationId "com.abbsolute.ma_livu" - minSdkVersion 15 - targetSdkVersion 29 + applicationId "com.appsolute.org.todolist" + minSdkVersion 21 + targetSdkVersion 28 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' 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.android.support:support-compat:28.0.0" + implementation 'com.google.firebase:firebase-messaging:20.1.0' + implementation 'com.google.android.material:material:1.2.0-alpha01' + + } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8773303..4cb05f2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,21 +1,39 @@ - + package="com.appsolute.org.todolist"> + + + + - + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/abbsolute/ma_livu/AlarmActivity.java b/app/src/main/java/com/abbsolute/ma_livu/AlarmActivity.java new file mode 100644 index 0000000..da48f22 --- /dev/null +++ b/app/src/main/java/com/abbsolute/ma_livu/AlarmActivity.java @@ -0,0 +1,15 @@ +package com.appsolute.org.todolist; + +import android.os.Bundle; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + +public class AlarmActivity extends AppCompatActivity { + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_alarm); + getSupportActionBar().setTitle("Alarm Activity"); + } +} diff --git a/app/src/main/java/com/abbsolute/ma_livu/AlarmReceiver.java b/app/src/main/java/com/abbsolute/ma_livu/AlarmReceiver.java new file mode 100644 index 0000000..7b5e10f --- /dev/null +++ b/app/src/main/java/com/abbsolute/ma_livu/AlarmReceiver.java @@ -0,0 +1,37 @@ +package com.appsolute.org.todolist; + +import android.app.AlarmManager; +import android.app.Notification; +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.widget.Toast; + +import java.util.Date; + +public class AlarmReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + + Toast.makeText(context,new Date().toString(), Toast.LENGTH_SHORT).show(); + +//반복알람을 위해 알람이 울리면 +//다시 새로운 알람을 설정 + +//알람관리자 소환 + AlarmManager alarmManager= (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + Intent i= new Intent(context,AlarmReceiver.class); + PendingIntent pendingIntent=PendingIntent.getBroadcast(context,20,intent,PendingIntent.FLAG_UPDATE_CURRENT); + +//알람 설정(20초 후) + if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){ + alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+20000,pendingIntent); + }else{ + alarmManager.setExact(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+20000,pendingIntent); + } + + } +} diff --git a/app/src/main/java/com/abbsolute/ma_livu/AppHelper.java b/app/src/main/java/com/abbsolute/ma_livu/AppHelper.java new file mode 100644 index 0000000..fb37752 --- /dev/null +++ b/app/src/main/java/com/abbsolute/ma_livu/AppHelper.java @@ -0,0 +1,152 @@ +package com.appsolute.org.todolist; + +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 AppHelper { + 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 "+ + ")"; + 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) " + + "values(?, ?,?,?)"; + Object[] params = {toDoInfo.content,toDoInfo.detailContent,toDoInfo.dates,toDoInfo.dDay}; + 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, 14); + 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, 14); + 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); + toDoInfos.add(new ToDoInfo(content,detailContent,dates,dDay)); + } + 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 " + + "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); + toDoInfos.add(new ToDoInfo(content,detailContent,dates,dDay)); + } + 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/CommunityFragment.java b/app/src/main/java/com/abbsolute/ma_livu/CommunityFragment.java new file mode 100644 index 0000000..e9b4d44 --- /dev/null +++ b/app/src/main/java/com/abbsolute/ma_livu/CommunityFragment.java @@ -0,0 +1,25 @@ +package com.appsolute.org.todolist; + +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 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/GooeyMenu.java b/app/src/main/java/com/abbsolute/ma_livu/GooeyMenu.java new file mode 100644 index 0000000..e50fa14 --- /dev/null +++ b/app/src/main/java/com/abbsolute/ma_livu/GooeyMenu.java @@ -0,0 +1,497 @@ +package com.appsolute.org.todolist; + +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-PLUS_HEIGHT; + //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..2dd072b --- /dev/null +++ b/app/src/main/java/com/abbsolute/ma_livu/HelpFragment.java @@ -0,0 +1,32 @@ +package com.appsolute.org.todolist; + +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.activity.OnBackPressedCallback; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; + +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(),MainActivity.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..ee6dcc0 --- /dev/null +++ b/app/src/main/java/com/abbsolute/ma_livu/HomeFragment.java @@ -0,0 +1,26 @@ +package com.appsolute.org.todolist; + +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/MainActivity.java b/app/src/main/java/com/abbsolute/ma_livu/MainActivity.java index 7ef7c35..352f606 100644 --- a/app/src/main/java/com/abbsolute/ma_livu/MainActivity.java +++ b/app/src/main/java/com/abbsolute/ma_livu/MainActivity.java @@ -1,14 +1,331 @@ -package com.abbsolute.ma_livu; +package com.appsolute.org.todolist; +import android.app.AlarmManager; +import android.app.DatePickerDialog; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.app.TimePickerDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +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.view.Menu; +import android.widget.Button; +import android.widget.DatePicker; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TimePicker; +import android.widget.Toast; + +import com.google.android.gms.tasks.OnCompleteListener; +import com.google.android.gms.tasks.Task; +import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.google.android.material.snackbar.Snackbar; +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 androidx.annotation.NonNull; +import androidx.appcompat.app.ActionBarDrawerToggle; +import androidx.appcompat.app.AlertDialog; +import androidx.core.view.GravityCompat; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentTransaction; +import androidx.navigation.NavController; +import androidx.navigation.Navigation; +import androidx.navigation.ui.AppBarConfiguration; +import androidx.navigation.ui.NavigationUI; +import androidx.drawerlayout.widget.DrawerLayout; import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.viewpager.widget.ViewPager; -import android.os.Bundle; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.GregorianCalendar; +import java.util.Locale; + +public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener,GooeyMenu.GooeyMenuInterface{ + + private static final String CHANNEL_ID = "101" ; + private static final String TAG = "FCM"; + private AppBarConfiguration mAppBarConfiguration; -public class MainActivity extends AppCompatActivity { + private ToDoFragment toDoFragment; + private NotiFragment notiFragment; + private HelpFragment helpFragment; + Toolbar toolbar; + private DrawerLayout mDrawerLayout; + private NavigationView navigationView; + ToDoAdapter toDoAdapter; + TabLayout tabLayout; + ViewPager viewPager; + private GooeyMenu mGooeyMenu; + private Toast mToast; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); + + + ///// + // new AlarmHATT(getApplicationContext()).Alarm(); +// createNotificationChannel(); + /// + getDays(); + toDoAdapter=new ToDoAdapter(); + /// + AppHelper.openDatabase(getApplicationContext(), "todo.db", 14); + 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(MainActivity.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); + + } + @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 class AlarmHATT{ + private Context context; + AlarmHATT(Context context){ + this.context=context; + } + public void Alarm(){ + AlarmManager am=(AlarmManager)getSystemService(Context.ALARM_SERVICE); + Intent intent=new Intent(MainActivity.this,BroadcastD.class); + + PendingIntent sender=PendingIntent.getBroadcast(MainActivity.this,0,intent,0); + Calendar calendar=Calendar.getInstance(); + + calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DATE),18,40,0); + + am.set(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),sender); + } + }*/ + public void onBackPressed() { + DrawerLayout drawer = findViewById(R.id.drawer_layout); + if (drawer.isDrawerOpen(GravityCompat.START)) { + drawer.closeDrawer(GravityCompat.START); + } else { + super.onBackPressed(); + } + } + + + + @Override + public void menuOpen() { + + } + + @Override + public void menuClose() { + showToast( "Menu Close"); + } + + @Override + public void menuItemClicked(int menuNumber) { + showToast( "Menu item clicked : " + menuNumber); + } + private void showToast(String msg){ + if(mToast!=null){ + mToast.cancel(); + } + mToast= Toast.makeText(this,msg,Toast.LENGTH_SHORT); + mToast.setGravity(Gravity.CENTER,0,0); + mToast.show(); + } + + @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 NotiFragment(); + notiFragment=(NotiFragment)cur; + }else if(pos==2){ + cur=new HelpFragment(); + helpFragment=(HelpFragment)cur; + } + getSupportFragmentManager().beginTransaction().replace(R.id.main_frame, cur).commit(); + } + //디데이 알림 기능 + public void getDays() { + Calendar c = Calendar.getInstance(); + ArrayList toDoInfos = AppHelper.selectTodoInfo("todoInfo"); + 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[] r = date.split("-"); + String y = r[0]; + String m = r[1]; + String d = r[2]; + // Toast.makeText(getContext(), ""+y+" "+m+" "+d, Toast.LENGTH_SHORT).show(); + //디데이 알림 체크 + for (int i = 0; i < toDoInfos.size(); i++) { + String dates = toDoInfos.get(i).getDates(); + //Toast.makeText(getContext(), "" + dates, Toast.LENGTH_SHORT).show(); + String[] res = dates.split("-"); + String year = res[0]; + String month = res[1]; + String day = res[2]; + if (y.equals(year) && m.equals(month) && d.equals(day)) { + int sendYear = Integer.parseInt(year); + int sendMonth = Integer.parseInt(month); + int sendDay = Integer.parseInt(day); + //선택한 날짜와 시간으로 알람 설정 + GregorianCalendar calendar = new GregorianCalendar(sendYear, sendMonth, sendDay, 18, 44); + AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); +//알람시간에 AlarmActivity 실행되도록. + Intent intent = new Intent(MainActivity.this, AlarmActivity.class); + PendingIntent pendingIntent = PendingIntent.getActivity(this, 30, intent, PendingIntent.FLAG_UPDATE_CURRENT); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); + } else { + alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); + } + } + + } + }//getDays() } 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..4bb55a6 --- /dev/null +++ b/app/src/main/java/com/abbsolute/ma_livu/MyFirebaseInstanceIdService.java @@ -0,0 +1,55 @@ +package com.appsolute.org.todolist; + +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.google.firebase.iid.FirebaseInstanceId; +import com.google.firebase.messaging.FirebaseMessagingService; +import com.google.firebase.messaging.RemoteMessage; +import com.google.firebase.provider.FirebaseInitProvider; + +public class MyFirebaseInstanceIdService extends FirebaseMessagingService { + @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,MainActivity.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/NotiFragment.java b/app/src/main/java/com/abbsolute/ma_livu/NotiFragment.java new file mode 100644 index 0000000..d77f3e1 --- /dev/null +++ b/app/src/main/java/com/abbsolute/ma_livu/NotiFragment.java @@ -0,0 +1,34 @@ +package com.appsolute.org.todolist; + +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; + +public class NotiFragment 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/OnItemClickListner.java b/app/src/main/java/com/abbsolute/ma_livu/OnItemClickListner.java new file mode 100644 index 0000000..4fc4c6d --- /dev/null +++ b/app/src/main/java/com/abbsolute/ma_livu/OnItemClickListner.java @@ -0,0 +1,7 @@ +package com.appsolute.org.todolist; + +import android.view.View; + +public interface OnItemClickListner { + public void onItemClick(ToDoAdapter.ViewHolder holder, View view, int position); +} diff --git a/app/src/main/java/com/abbsolute/ma_livu/OnbackPressedInferface.java b/app/src/main/java/com/abbsolute/ma_livu/OnbackPressedInferface.java new file mode 100644 index 0000000..6958a60 --- /dev/null +++ b/app/src/main/java/com/abbsolute/ma_livu/OnbackPressedInferface.java @@ -0,0 +1,5 @@ +package com.appsolute.org.todolist; + +public interface OnbackPressedInferface { + public void onBackPressed(); +} diff --git a/app/src/main/java/com/abbsolute/ma_livu/ProfileFragment.java b/app/src/main/java/com/abbsolute/ma_livu/ProfileFragment.java new file mode 100644 index 0000000..29c421e --- /dev/null +++ b/app/src/main/java/com/abbsolute/ma_livu/ProfileFragment.java @@ -0,0 +1,25 @@ +package com.appsolute.org.todolist; + +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 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/TabPagerAdapter.java b/app/src/main/java/com/abbsolute/ma_livu/TabPagerAdapter.java new file mode 100644 index 0000000..fd855c9 --- /dev/null +++ b/app/src/main/java/com/abbsolute/ma_livu/TabPagerAdapter.java @@ -0,0 +1,37 @@ +package com.appsolute.org.todolist; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentStatePagerAdapter; + +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..424acee --- /dev/null +++ b/app/src/main/java/com/abbsolute/ma_livu/TitleFragment.java @@ -0,0 +1,25 @@ +package com.appsolute.org.todolist; + +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..207b6eb --- /dev/null +++ b/app/src/main/java/com/abbsolute/ma_livu/ToDoAdapter.java @@ -0,0 +1,93 @@ +package com.appsolute.org.todolist; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.database.sqlite.SQLiteDatabase; +import android.graphics.Canvas; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentTransaction; +import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.ArrayList; + + + +public class ToDoAdapter extends RecyclerView.Adapter { + ArrayList arrayList = new ArrayList<>(); + OnItemClickListner listener; + Context context; + private static int UPDATE_RESULT=101; + public void setOnItemClickListner(OnItemClickListner listener) { + this.listener = listener; + } + + public class ViewHolder extends RecyclerView.ViewHolder { + protected TextView ContentsDetail; + protected TextView Contents; + protected TextView writeDates; + protected TextView dDays; + 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); + } + + } + 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); + } + + @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,WriteActivity.class); + intent.putExtra("modify",toDoInfo.getContent()); + context.startActivity(intent); + } + }); + } + @Override + public int getItemCount() { + return arrayList.size(); + } +} diff --git a/app/src/main/java/com/abbsolute/ma_livu/ToDoFragment.java b/app/src/main/java/com/abbsolute/ma_livu/ToDoFragment.java new file mode 100644 index 0000000..99840fc --- /dev/null +++ b/app/src/main/java/com/abbsolute/ma_livu/ToDoFragment.java @@ -0,0 +1,127 @@ +package com.appsolute.org.todolist; + +import android.app.AlarmManager; +import android.app.DatePickerDialog; +import android.app.PendingIntent; +import android.app.TimePickerDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.icu.text.SimpleDateFormat; +import android.os.Build; +import android.os.Bundle; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.DatePicker; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.widget.TimePicker; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.google.android.material.floatingactionbutton.FloatingActionButton; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.GregorianCalendar; +import java.util.Locale; + +import static android.app.Activity.RESULT_OK; + + +public class ToDoFragment extends Fragment { + 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; + + @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(); + + + + FloatingActionButton fab = view.findViewById(R.id.fab); + fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(getContext(), WriteActivity.class); + startActivityForResult(intent, WRITE_RESULT); + } + }); + toDoInfos = AppHelper.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) { + final int position = viewHolder.getAdapterPosition(); + AppHelper.deleteData(getContext(), "todoInfo", position, toDoInfos.get(position)); + toDoInfos.remove(position); + toDoAdapter.notifyItemRemoved(position); + } + }; + ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback); + itemTouchHelper.attachToRecyclerView(recyclerView); + recyclerView.setAdapter(toDoAdapter); + + return view; + } + + @Override + public void onResume() { + super.onResume(); + toDoInfos = AppHelper.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 = AppHelper.selectTodoInfo("todoInfo"); + // toDoAdapter.clearData(); + toDoAdapter.setItem(toDoInfos); + recyclerView.setAdapter(toDoAdapter); + } + } + }///onActivityResult + + + +} 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..d2ff514 --- /dev/null +++ b/app/src/main/java/com/abbsolute/ma_livu/ToDoInfo.java @@ -0,0 +1,48 @@ +package com.appsolute.org.todolist; + +public class ToDoInfo { + + String content; + String detailContent; + String dates; + String dDay; + + public ToDoInfo(){ + + } + ToDoInfo(String content,String detailContent,String dates,String dDay){ + this.content=content; + this.detailContent=detailContent; + this.dates=dates; + this.dDay=dDay; + } + + 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/java/com/abbsolute/ma_livu/WriteActivity.java b/app/src/main/java/com/abbsolute/ma_livu/WriteActivity.java new file mode 100644 index 0000000..770037e --- /dev/null +++ b/app/src/main/java/com/abbsolute/ma_livu/WriteActivity.java @@ -0,0 +1,143 @@ +package com.appsolute.org.todolist; + +import android.app.AlarmManager; +import android.app.DatePickerDialog; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.database.sqlite.SQLiteDatabase; +import android.icu.text.SimpleDateFormat; +import android.os.Bundle; +import android.view.View; +import android.widget.DatePicker; +import android.widget.EditText; +import android.widget.QuickContactBadge; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + +import java.util.Calendar; +import java.util.Locale; + +import static com.appsolute.org.todolist.AppHelper.insertData; + +public class WriteActivity extends AppCompatActivity { + 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; + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_write); + write=findViewById(R.id.write_todo); + detailWrite=findViewById(R.id.write_todo_detail); + storing=findViewById(R.id.store); + setDday=findViewById(R.id.set_d_day); + SQLiteDatabase todo; + storing.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent1=getIntent(); + String word=intent1.getStringExtra("modify"); + if(word!=null){ + String res=write.getText().toString(); + String resDetailTodo=detailWrite.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="디데이"; + if(year>0&&month>0&&day>0) + dDate=year+"-"+month+"-"+day; + ToDoInfo toDoInfo=new ToDoInfo(res,resDetailTodo,date,dDate); + AppHelper.updateData(getApplicationContext(),"todoInfo",toDoInfo,word); + Intent intent=new Intent(); + setResult(RESULT_OK,intent); + finish(); + }else{ + ToDoFragment toDoFragment=new ToDoFragment(); + Bundle bundle=new Bundle(1); + String res=write.getText().toString(); + String resDetailTodo=detailWrite.getText().toString(); + bundle.putString("write_result_detail",resDetailTodo); + bundle.putString("write_result",res); + toDoFragment.setArguments(bundle); + Intent intent=new Intent(); + setResult(RESULT_OK,intent); + //sqlite쓰기 + if(!res.equals("")&&!resDetailTodo.equals("")) + { + addData(); + }else{ + Toast.makeText(getApplicationContext(),"데이터를 입력하세요",Toast.LENGTH_SHORT).show(); + } + 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(); + } + }); + + + } + public void checkDate(){ + DatePickerDialog datePickerDialog=new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() { + @Override + public void onDateSet(DatePicker datePicker, int y, int m, int d) { + year=y; + month=m+1; + day=d; + } + },2020,1,1); + datePickerDialog.show(); + } + public void addData(){ + String data=write.getText().toString(); + String detailData=detailWrite.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="디데이"; + if(year>0&&month>0&&day>0) + dDate=year+"-"+month+"-"+day; + ToDoInfo toDoInfo=new ToDoInfo(data,detailData,date,dDate); + insertData("todoInfo",toDoInfo); + } + 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/ui/gallery/GalleryFragment.java b/app/src/main/java/com/abbsolute/ma_livu/ui/gallery/GalleryFragment.java new file mode 100644 index 0000000..e82ee52 --- /dev/null +++ b/app/src/main/java/com/abbsolute/ma_livu/ui/gallery/GalleryFragment.java @@ -0,0 +1,35 @@ +package com.appsolute.org.todolist.ui.gallery; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProviders; + +import com.appsolute.org.todolist.R; + +public class GalleryFragment extends Fragment { + + private GalleryViewModel galleryViewModel; + + public View onCreateView(@NonNull LayoutInflater inflater, + ViewGroup container, Bundle savedInstanceState) { + galleryViewModel = + ViewModelProviders.of(this).get(GalleryViewModel.class); + View root = inflater.inflate(R.layout.fragment_gallery, container, false); + final TextView textView = root.findViewById(R.id.text_gallery); + galleryViewModel.getText().observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(@Nullable String s) { + textView.setText(s); + } + }); + return root; + } +} diff --git a/app/src/main/java/com/abbsolute/ma_livu/ui/gallery/GalleryViewModel.java b/app/src/main/java/com/abbsolute/ma_livu/ui/gallery/GalleryViewModel.java new file mode 100644 index 0000000..2ecef8a --- /dev/null +++ b/app/src/main/java/com/abbsolute/ma_livu/ui/gallery/GalleryViewModel.java @@ -0,0 +1,19 @@ +package com.appsolute.org.todolist.ui.gallery; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +public class GalleryViewModel extends ViewModel { + + private MutableLiveData mText; + + public GalleryViewModel() { + mText = new MutableLiveData<>(); + mText.setValue("This is gallery fragment"); + } + + public LiveData getText() { + return mText; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/abbsolute/ma_livu/ui/home/HomeFragment.java b/app/src/main/java/com/abbsolute/ma_livu/ui/home/HomeFragment.java new file mode 100644 index 0000000..250c456 --- /dev/null +++ b/app/src/main/java/com/abbsolute/ma_livu/ui/home/HomeFragment.java @@ -0,0 +1,35 @@ +package com.appsolute.org.todolist.ui.home; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProviders; + +import com.appsolute.org.todolist.R; + +public class HomeFragment extends Fragment { + + private HomeViewModel homeViewModel; + + public View onCreateView(@NonNull LayoutInflater inflater, + ViewGroup container, Bundle savedInstanceState) { + homeViewModel = + ViewModelProviders.of(this).get(HomeViewModel.class); + View root = inflater.inflate(R.layout.fragment_home, container, false); + final TextView textView = root.findViewById(R.id.text_home); + homeViewModel.getText().observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(@Nullable String s) { + textView.setText(s); + } + }); + return root; + } +} diff --git a/app/src/main/java/com/abbsolute/ma_livu/ui/home/HomeViewModel.java b/app/src/main/java/com/abbsolute/ma_livu/ui/home/HomeViewModel.java new file mode 100644 index 0000000..c444be8 --- /dev/null +++ b/app/src/main/java/com/abbsolute/ma_livu/ui/home/HomeViewModel.java @@ -0,0 +1,19 @@ +package com.appsolute.org.todolist.ui.home; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +public class HomeViewModel extends ViewModel { + + private MutableLiveData mText; + + public HomeViewModel() { + mText = new MutableLiveData<>(); + mText.setValue("This is home fragment"); + } + + public LiveData getText() { + return mText; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/abbsolute/ma_livu/ui/slideshow/SlideshowFragment.java b/app/src/main/java/com/abbsolute/ma_livu/ui/slideshow/SlideshowFragment.java new file mode 100644 index 0000000..58b4c01 --- /dev/null +++ b/app/src/main/java/com/abbsolute/ma_livu/ui/slideshow/SlideshowFragment.java @@ -0,0 +1,35 @@ +package com.appsolute.org.todolist.ui.slideshow; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProviders; + +import com.appsolute.org.todolist.R; + +public class SlideshowFragment extends Fragment { + + private SlideshowViewModel slideshowViewModel; + + public View onCreateView(@NonNull LayoutInflater inflater, + ViewGroup container, Bundle savedInstanceState) { + slideshowViewModel = + ViewModelProviders.of(this).get(SlideshowViewModel.class); + View root = inflater.inflate(R.layout.fragment_slideshow, container, false); + final TextView textView = root.findViewById(R.id.text_slideshow); + slideshowViewModel.getText().observe(getViewLifecycleOwner(), new Observer() { + @Override + public void onChanged(@Nullable String s) { + textView.setText(s); + } + }); + return root; + } +} diff --git a/app/src/main/java/com/abbsolute/ma_livu/ui/slideshow/SlideshowViewModel.java b/app/src/main/java/com/abbsolute/ma_livu/ui/slideshow/SlideshowViewModel.java new file mode 100644 index 0000000..9ef6972 --- /dev/null +++ b/app/src/main/java/com/abbsolute/ma_livu/ui/slideshow/SlideshowViewModel.java @@ -0,0 +1,19 @@ +package com.appsolute.org.todolist.ui.slideshow; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +public class SlideshowViewModel extends ViewModel { + + private MutableLiveData mText; + + public SlideshowViewModel() { + mText = new MutableLiveData<>(); + mText.setValue("This is slideshow fragment"); + } + + public LiveData getText() { + return mText; + } +} \ No newline at end of file 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 0000000000000000000000000000000000000000..11e0868f09b6194dff10d4c6c242182a5592e3fa GIT binary patch literal 964 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGojKx9jP7LeL$-HD>V6O9YaSW+o ze0%-nYTrPK;~%r-*3C3ucHO8|Kxs;chsq?ENh*_`@GERq2~_e_>U2?3(&xCSy2oU% z+4;{EwfT2LmtVg3ZSyzV<-6B>j{cfGfA{yzZO=FF2@GAT$jIs8z$7%Gfkj1u6lP-w zYgTsl^$BYQw@c(@A6T!Jm&5mciQqh*uc3bX9_%zc6m~e9^TSlu7f0={x0gTa@N4_ZMHXur_S!I7zrFgSz)$X=XF#0Wza^RCd*h`YPe0tk@Ggk|5AVY{HcgWm z_8(!c4`$JAzs&TZ+xElumf}wweoTLq`2XYzZjtfhKA^9%zcV$5|M?TaIV>Mpk96%< zZkl#Dlkvw-xgXYtEh|~n8SCVJy6Pl{v*<40-r$gbNq6s}E%7(9^)^0wulM#{f$^l& zcFh-8E_f&ONzS6^8`=taGm&F)gWE!XWq?*Sh6*H$l8H{P2ja^%yP4@LO;xAMttlKx_xHu z;zjcvcvSQ|Q)3pdh&7aWuQqZ0G}aZCZY}X0948b$bwwNt?OJuWrp{j_?9byXT=yS} z+BHi0!~v~#3N)SRurER_pt#9I|4#7!ZWab9r+WgYS1dfyRX-`}p?IbGKh7%wpQcU8 znv=9ptaJ9u)J+Tthdng)9&Y(Cx!3qUllh!I%9Y0@)wZ3v`~Q}0ywR?kRY^+W g(A?nQ%JGNw`leFr)oUi)0%l7FPgg&ebxsLQ00^a{rT_o{ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a727a9737d20ed3991cc50c8dc74c054c5d1dcf0 GIT binary patch literal 2679 zcmV--3W)WIP)PxIr4WnsdP7?UwVE0mS|Cux6ca)SGy!8N6w+ct32EUL zYlwa#7`}ini3o;(UjP&PVpPC_Mw*sZNhm3{g|s11-WxQzCO3ewMWGEX*iwK0?e4NW z&+a_?_B_wNo#fn|nKN_dod4OKnVsEz?(k4a>DaMjBbYYZ;2Gpq9%QmZ2MnGdzc9@wN2037(Rv=Xx}f@0(mKGI^9~2y#1oh#oVw&tz%28)>ueI)kvdFwYQ_~g_hDIa1}$5b??X;0KnJfq=(ye+}lYHXZjY}z?(x5G%rL_w;||m zTD9OuLYJse8+gJnmSV2}&VD_J*bc|miPhQ)f(Ym)?Lw}Coxwsc9SJVr>rveEuwD&m z8VRts6F7Y`bxuuCPgV3v%r^+aQM3MuW`Ubu!Lfe6n-s` zPLdR+!uH`{<0Ly(zn-Bs!;8h+JocS|J>&{jypsWF9k=dV^QMHRN0Hh04&-LHNo5_*$$y z2ImDI6%NM2+M!?ouJ;NXe*75!^?32601gk3zBG`}oAj}Eh9E94eH`&FT*a4BwX)cj z5s_197aEhv{~GYW>*)ga ze!$lT+D3SeDH~vZh9+UHf{LP@D7vL6WriNzaOu&WjkY1Yk+WYb44(jBcldvR^`b$U zXhZ>+QlLe8p88yY`g~P@c>K2AFX>3UPRZ5u|51lzXy`%8u8b%jbkT@bK}B8xgL3F! zbga*XbWac>0{3GIZVDBaCsT_6d;p$T0RFg%E8q+GADQJP$~!|)iR?*jipKhD0e`pI z67bKVY$g1>DKql=4WiSGvc6@t6|s-rrWMqq#^H|TUl-kv1K>Zp)X~o43)C^+L^wp- zPj_o;lcV=;7i`DCSl#K7Zrdr(REJ>ga1t3`?}Q!q@Pg71ixFeD##CL5>@~P zLA&TwPoDGyDwY6$4B;KI6{;;b;9UXzc4M3l_008XOaH}{+z8|O=NuyfOaU?*?7k=L(0zjqe7ElhI5q`* zxx7c%YYq@Sef&`P-@l`A5gmPK)6Chg{d@mqC|lhc$sEkR0Br4nWBbvm9ZDTz3Gi1S z{Ap~3`U)J(otqLsDEiezo$;3f{@-l)(eJmAYq@D#>)TXRRdy7^omUf`D*&MMutQ^Y z5v0jQPo=tnuRG8`!c7BT81HZ~551oLJ4p(lJ5c_xO%G@OSCDUpr`YP%SmtBx?~4G+ zC=R~^PtM`EKIgf?)}DT}^QvdZXV~i1SaulS{0}tz0LWp$(ca5{7 zV+~G(jxyHXMXlALn%y(n*oz9NT88GD2vvFI5h_bpbeFI-t%`IUASY2#uXD^b8?^aM z2xzl2^5<$I&saB7de*8rp{0BX2*aDB&VH$l41feQ(9P01rCZ8{z&aPpNF|X&kXMtT zXgcXPVBNj8lpX=?1ZV%zJ|edd1!L*^ZCkhq=wF@)!&r(Pg1i8#TQlfQVOd1jeKotqXOb)wY%?mBXBcLIt*dOm! zUqo}9gEs39!YxH3AZ+v)c05|#S=x0D2sS~nu7JgG*Gntdt|4jftv_Lum{J8mS_#6F z9G1iFO_~5XPQqfji;Y*7=$JYH(n?3pi&iAtE8#c>dg)AmOq44C>X9JK&If*M={6a=k(n?mwcOU+#1 z3#{A$kP-|T=Wrq1gga*WsGBVLoSSkFL8b)^NsB033r{s=70+v9t-Sxv)&rL_LwiTF zVFjTMOI7(GU$mO4g4eh@)A9T0~!X$VMeiN<=$yV8{N3-=HIRh_)UxCX?vQ0MD z2YB=J!8yG>u>jV8n>z##nq-4)kxhj!N=*MtmB-;xcqP0IJ_7fP)R+2H-+C!|U{soj z1B5;jxd@)`^0^#~vQI0Sm*A}~Kf{Vf-$V?YigK`UM+nFWO0}E~@(l7S4>DQj_b&9Y lp~n-X^#Qui04`bS=>Nm@$nK-EVb}lw002ovPDHLkV1j1u5W)Ze literal 0 HcmV?d00001 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..be66ed5 --- /dev/null +++ b/app/src/main/res/drawable/edit_black.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/help.png b/app/src/main/res/drawable/help.png new file mode 100644 index 0000000000000000000000000000000000000000..709bbe7a2ac2dda2697e90ad89ca322aceb61a1f GIT binary patch literal 13584 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 Ke3h(4`2PbiR3wxD literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d0448482734756e6e15b8101cc7a62f35bd57684 GIT binary patch literal 587 zcmV-R0<`^!P)6gC!OAzCR|1kzZg5G(|XRH;O4tddCl z2Nogu6QXG2k-;YlzW3aDJ3F}V-L3DPJKs6?&g`zyV~_P1FAm)8j=RI|aF;3IE!|~? zKEiQ_-Qg}%z+1X%LnVC#79#8XF|(D(oTlN~9hS5Te2Lurftk%l<~VRrz#UG}Htp8% zmcCc#KXBecte~{*Nc566r)e5(nVRyI+@x7(1Q1#)O-qQDK_zYLk zZ9c zr6uhGpGrDBW@i6NuJL4gl8*;TOTgBX)mjIHKb8SlCDtgEnhN-3NDyf@d%14riA^3?1w#M;002ovPDHLkV1iW96r2D6 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6f85acb4f346368238e79366f3121b7fb5bf351a GIT binary patch literal 594 zcmV-Y0Xcjv-o#0fh(VY~$J*c}gt!{L!B5Knq!hECyx!{PAA z6o@BXVyKy&0d4>nfwKiQz5ov-{VvFLrF3@K%+3MtfEm}#)4|Vx<<`(OfR}-%g|NSX z(^+nUz9}hv-sIE(POu5O%_^tFrAg9V;I-vKr=z%5C)Mhl!lZvdx& zT}ku*GqAV!0QM@@_Y8ac4Trsog~MLO%&g0w2k&+9q`ivOc+xM@Upeo^h4F)MIDiY? zJ5E|Sd>obXn3!R&VrCXI>=n%sA2aL_>mW2{*sEB~uval({2*pH?SmG5eHTaXNLnh+ zt~A3dz*d(g9Jwo!wjJ?Pp*4QA&I2DNyWuXq9F_YCxFqTOQGx&ZzB6ztZf0o-o)&5s zfV3R1dD3p_Gw{5|a;*w*O}f^#0=Tupeb*0%`*xu9{o!zHh5N1_4)^Uq>-)pu)(ZDs gKOFAcf!6o$1G`t>Jq+s7;Q#;t07*qoM6N<$g0E^6TL1t6 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..06498a07a789b12532c227cac2857025e2e31720 GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC3r`ovkcwMxuO8%NaNuBe{Js9{ zyrT8ljxK2jnEs@!W?)Fzt72OzXYrk30draiJA + + + 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 0000000000000000000000000000000000000000..8a3e99d91fdeafbd47e9d38fe6705591d2a39f36 GIT binary patch literal 656 zcmV;B0&o3^P)?o5VeN-4?wPLvE3@-e?jiIDgk6eBWG zMksl->fG9$>)iA1)jrPNXRmj7_PaiQ&$HgM&v}>VS*T~c6yRBRyf|DOo-qZ=k)AO_ z*WeU~i^DUfKsnNN47I%hH~?&iiT_MB@CA4$>35xdR&%o*w!IU02<*>YJagQ8U_sKS zobg$}183h%0d|!!LC@tloeMk%yv|X$!7+y42ph)@mZlp`GxwA64!rBcHYm732fH5}2j)Nn+lQo|9In$PKU z4SxrgfLp+}pf;TaPMwTJNq23Z2kr&CC#?kj7I17?(xp{bZ7%~C11`4?_%m<>xB;9V z0q_bqCh127cr);P&?{SyyH&uc$#zoGitViffW1Sz{|X$G^l_NV_HN)Ukj9RRRsmm; zbiLx*F5o4wWAIrLm;u!aUZR_)_CSF@%BKs=95tX`}QylKHdy%~tha)O= qIj1<>W%nX`FAhgk>T*u+9R3TLo0000V0z~1;uum9_jZo;q{{&UuKB^P zE*oWvA{YZ)Ch!?bN=ga}N;5ch{8-y?Q;1RU;Nl}E3?xop3f}&F)dL@^SNlF$zEYpQ z_PIcP7*nFJdJKm_JPU_I!^{TDd7RXs>`WQgZhbvT&U2UU%eJ3e*L40@dl_@-cE^u> z%N)0*ZEXs`T3(*_?nm11-Fo<= zr@?>HyLFs*GtNHm*m1o$Px+7dq&(LnbLZWKvh zuI?kp58q_NBep-B+mCMj9WKXY#VXU#->~Rw&Nr=jK*nl;0v0 z_dhwK7azR!PD^^;p|xApC&hW~YHL{JUAyRPeE3JFA3Bb%asLD^Fv>GtWwLsxyddZR z*AI>rLJBV*H%Y%+XmO8K)Z>TN%V%eH&s{0OBEoTEi-SX3oTDximqJ>Uf`aq<1!9b> z0>-)m6BdRCbT=?{%oO7|aY1{9s{`W^A8wYE7ot~`7BDEuyNWoR*&-o#>FMDeJO@+W zo=s^Ieb3e#%^2xTJXTw-45W ze?lDBZ`}Jh{C`ak!45{VKb^^Uby(l#kj1&mvi1LNZl*K;1REHP8H;U%DWnp_ aJ}@7stt#+nP`eFG_za$|elF{r5}E)&?o%89 literal 0 HcmV?d00001 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/minus.png b/app/src/main/res/drawable/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..403bbff7fbfd8df0e6553e7cd9a87f925973fdbf GIT binary patch literal 22518 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 d8$3PHB=dpbsN^sPrx{|Dh)3Ecny literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/plus2.png b/app/src/main/res/drawable/plus2.png new file mode 100644 index 0000000000000000000000000000000000000000..0bfbd904cd936dcb9b48aa9cc96b5b0ec5de4037 GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3jKx9jP7LeL$-D$|+C5zyLp*rj zP7CB}FyL`sUa{fs8QEO()x0m->vLDUIn2T&JZswCt{YN{#?tTHn=>w!sfA3u_<*Zx zp`4TKp^!k8E21LKw*T6zKI{LLO!}<%>K}*mXR~vOi5ps1b8}CB`{RQ*&m*O~#s((& zkN>Q#vHm6Kp&a+ED6^m{JjY>0WYNnx0m~ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_doc.xml b/app/src/main/res/drawable/selector_doc.xml new file mode 100644 index 0000000..476fd24 --- /dev/null +++ b/app/src/main/res/drawable/selector_doc.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_photo.xml b/app/src/main/res/drawable/selector_photo.xml new file mode 100644 index 0000000..476fd24 --- /dev/null +++ b/app/src/main/res/drawable/selector_photo.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..476fd24 --- /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/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/user1.png b/app/src/main/res/drawable/user1.png new file mode 100644 index 0000000000000000000000000000000000000000..25a86c4e9ce94e3dfb95b44d14f4fdc36c76fc97 GIT binary patch literal 976 zcmeAS@N?(olHy`uVBq!ia0vp^+91rq1SIq9pG^l+Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8ZKG?e4&pI+ONv96*Cb$-3v zsA{REO*+djx0h@^Br(5%fnl2Gswqk{-q6CQ-b_Y0ck_*OqB;wS3e%z2(}x zjapN-FW-t*`Jy> ze1#s&i{qb`7IgI*eqP=>#Z@MrrLjQKBBb-~^J#`@Q&Tq|KYn)EyT%4Xw_W*+J%yoR zUMuA|ES@`cD63g0gj}!9aL}CVvrg7{SL=flwL6r5?yDDbott_Hhbc`^EZh3<8I~+uW08T>9meQCY~=%Kt`v zvZ=*a%{Z9)i`^yJdMvpvG&TgCx;ux7;rX1PXP=7LnOZJHitOU(Htbt8LE!q{%Z&;= zhYfgc2{SS{bzFRL=58)Klh?~9&vvB-oBX=(w@$Lym(i-i?bg<>yJB?eo(ARV9^vRz zm~p2>E_p7efYY%Vzh5>_IhwtgrNMxs?$3{VFJDW)-gY2r_11N(&Yn9d5xwE{CKG<534TkoP>IhIW+wBu>vSbX8T&GNmM{SwxmEuOi~Xz7$| zY>E~Zix?P^eKbX#V&?QO(#U##K({qknx}R}lP-t;UtSA-b7W{MiU>#Gk z&!i=%Ro1@#)jZvlL4xN-s?70^NAI27)V^Td>z_3f_wK1t`LM3{_~P3q&n6gHI0WRH zZN3@fbu<6Ru|)IluQ#OV#(BlqW3Wy7ABJ>*u$nP7-td=yu_c@573dua3UjAdIW|4p^z$C9);u=wsl30>zm0Xkxq!^4049#^74RnpnLJTadOiZl|jkOJo mtPBj6U6MM9q9HdwB{QuOw}$Kei%NkS7(8A5T-G@yGywqO(4zPN literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_alarm.xml b/app/src/main/res/layout/activity_alarm.xml new file mode 100644 index 0000000..61a4490 --- /dev/null +++ b/app/src/main/res/layout/activity_alarm.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 4fc2444..907d234 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,18 +1,37 @@ - - - + + + android:layout_height="match_parent" + android:layout_gravity="start" + android:fitsSystemWindows="true" + app:headerLayout="@layout/nav_header_main" + app:menu="@menu/activity_main_drawer" /> + + + - \ No newline at end of file + diff --git a/app/src/main/res/layout/activity_write.xml b/app/src/main/res/layout/activity_write.xml new file mode 100644 index 0000000..aa96661 --- /dev/null +++ b/app/src/main/res/layout/activity_write.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file 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..bbced25 --- /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..6f2e890 --- /dev/null +++ b/app/src/main/res/layout/content_main.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + \ 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 index a2b48c5..eeeaa2b 100644 --- a/app/src/main/res/layout/fragment_community.xml +++ b/app/src/main/res/layout/fragment_community.xml @@ -1,11 +1,26 @@ - + android:layout_height="wrap_content" + android:orientation="vertical"> + android:id="@+id/title_community" + android:text="community" + android:textSize="17sp" + android:layout_gravity="center" + android:textColor="#000000" + android:layout_marginBottom="10sp"> + + + \ 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/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..f3d9b08 --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,22 @@ + + + + + \ 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..e9fcb16 --- /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/todolist.xml b/app/src/main/res/layout/todolist.xml new file mode 100644 index 0000000..f725b41 --- /dev/null +++ b/app/src/main/res/layout/todolist.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + \ 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..289a59c --- /dev/null +++ b/app/src/main/res/values/array.xml @@ -0,0 +1,11 @@ + + + + + @drawable/item_selector + @drawable/selector_video + @drawable/selector_audio + @drawable/selector_photo + @drawable/selector_doc + + \ 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..2e618da --- /dev/null +++ b/app/src/main/res/values/dimens.xml @@ -0,0 +1,17 @@ + + + 16dp + 16dp + 8dp + 176dp + 16dp + + + + 260dp + 30dp + 20dp + + 80dp + + \ 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 + + +