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