diff --git a/app/src/main/java/com/example/citrusclient/Citrus.java b/app/src/main/java/com/example/citrusclient/Citrus.java index 75ac9dc..97469e1 100644 --- a/app/src/main/java/com/example/citrusclient/Citrus.java +++ b/app/src/main/java/com/example/citrusclient/Citrus.java @@ -8,6 +8,9 @@ private String token; private String accountId; private Integer curBookId; + private Integer curYear; + private Integer curMonth; + private Integer curDay; //getter public String getToken(){ @@ -17,6 +20,9 @@ return accountId; } public Integer getCurBookId(){return curBookId;} + public Integer getCurYear() {return curYear;} + public Integer getCurMouth(){return curMonth;} + public Integer getCurDay(){return curDay;} //setter public void setToken(String token){ @@ -26,4 +32,7 @@ this.accountId = accountId; } public void setCurBookId(Integer curBookId){this.curBookId = curBookId;} + public void setCurYear(Integer curYear){this.curYear = curYear;} + public void setCurMonth(Integer curMonth){this.curMonth = curMonth;} + public void setCurDay(Integer curDay){this.curDay = curDay;} } diff --git a/app/src/main/java/com/example/citrusclient/models/Todo.java b/app/src/main/java/com/example/citrusclient/models/Todo.java index 69b4eff..ef088fb 100644 --- a/app/src/main/java/com/example/citrusclient/models/Todo.java +++ b/app/src/main/java/com/example/citrusclient/models/Todo.java @@ -19,6 +19,10 @@ todoId = tid; } + public Todo(){} + + + //セッター public void setTitle(String t) {title = t;} public void setCheck(boolean c) {check = c;} diff --git a/app/src/main/java/com/example/citrusclient/rest/ScheduleRest.java b/app/src/main/java/com/example/citrusclient/rest/ScheduleRest.java index 341f85e..be891fe 100644 --- a/app/src/main/java/com/example/citrusclient/rest/ScheduleRest.java +++ b/app/src/main/java/com/example/citrusclient/rest/ScheduleRest.java @@ -16,7 +16,7 @@ public interface ScheduleRest { - String BASE_URL = "/accounts/{account_id}/schedule"; + String BASE_URL = "accounts/{account_id}/schedule"; @GET(BASE_URL) Call>>>> getAllTodos( @Path("account_id") String accountId, @Path("book_id") Integer bookId, @Query("token") String token ); - @GET("/accounts/{account_id}/books/{book_id}/todos/{year}/{month}") + @GET("accounts/{account_id}/books/{book_id}/todos/{year}/{month}") Call>> getTodosByMonth( @Path("account_id") String accountId, @Path("book_id") Integer bookId, @@ -35,7 +35,7 @@ @Query("token") String token ); - @GET("/accounts/{account_id}/books/{book_id}/todos/{year}/{month}/{day}") + @GET("accounts/{account_id}/books/{book_id}/todos/{year}/{month}/{day}") Call> getTodosByDay( @Path("account_id") String accountId, @Path("book_id") Integer bookId, @@ -45,7 +45,7 @@ @Query("token") String token ); - @GET("/accounts/{account_id}/books/{book_id}/todos/{year}/{month}/{day}/{todo_id}") + @GET("accounts/{account_id}/books/{book_id}/todos/{year}/{month}/{day}/{todo_id}") Call getTodoById( @Path("account_id") String accountId, @Path("book_id") Integer bookId, @@ -57,7 +57,7 @@ ); @FormUrlEncoded - @POST("/accounts/{account_id}/books/{book_id}/todos/{year}/{month}/{day}") + @POST("accounts/{account_id}/books/{book_id}/todos/{year}/{month}/{day}") Call createTodo( @Path("account_id") String accountId, @Path("book_id") Integer bookId, @@ -68,7 +68,7 @@ @Field("token") String token ); @FormUrlEncoded - @PUT("/accounts/{account_id}/books/{book_id}/todos/{year}/{month}/{day}/{todo_id}/check") + @PUT("accounts/{account_id}/books/{book_id}/todos/{year}/{month}/{day}/{todo_id}/check") Call setCheck( @Path("account_id") String accountId, @Path("book_id") Integer bookId, @@ -80,7 +80,7 @@ @Field("token") String token ); - @DELETE("/accounts/{account_id}/books/{book_id}/todos/{year}/{month}/{day}/{todo_id}") + @DELETE("accounts/{account_id}/books/{book_id}/todos/{year}/{month}/{day}/{todo_id}") Call deleteTodoById( @Path("account_id") String accountId, @Path("book_id") Integer bookId, diff --git a/app/src/main/java/com/example/citrusclient/viewmodels/ScheduleViewModel.java b/app/src/main/java/com/example/citrusclient/viewmodels/ScheduleViewModel.java index 435bafa..7c49525 100644 --- a/app/src/main/java/com/example/citrusclient/viewmodels/ScheduleViewModel.java +++ b/app/src/main/java/com/example/citrusclient/viewmodels/ScheduleViewModel.java @@ -78,6 +78,19 @@ return errorLiveData; } + /** + * スケジュールを作成する + * + * @param accountId アカウントid + * @param year 年 + * @param month 月 + * @param day 日 + * @param token トークン + * @param title タイトル + * @param startTime スケジュールの開始日時 + * @param endTime スケジュールの終了日時 + * @param bookId スケジュールを追加する本 + */ public void createSchedule(String accountId, int year, int month, int day, String token, String title, String startTime, String endTime, int bookId){ Call call = scheduleRest.createSchedule(accountId, year, month, day, title, startTime, endTime, bookId, token); @@ -100,6 +113,12 @@ } + /** + * アカウントを指定してallSchedulesLiveDataを更新する + * + * @param accountId アカウントid + * @param token トークン + */ public void updateAllSchedules(String accountId, String token){ Call>>>> call = scheduleRest.getAllSchedules(accountId, token); @@ -119,6 +138,14 @@ }); } + + /** + * アカウントと年を指定してschedulesByYearを更新する + * + * @param accountId アカウントid + * @param year 年 + * @param token トークン + */ public void updateSchedulesByYear(String accountId, int year, String token){ Call>>> call = scheduleRest.getSchedulesByYear(accountId, year, token); call.enqueue(new Callback>>>() { @@ -138,6 +165,15 @@ } + + /** + * アカウントと年と月を指定してschedulesByMonthを更新する + * + * @param accountId アカウントid + * @param year 年 + * @param month 月 + * @param token トークン + */ public void updateSchedulesByMonth(String accountId, int year, int month, String token){ Call>> call = scheduleRest.getSchedulesByMonth(accountId, year, month, token); call.enqueue(new Callback>>() { @@ -156,6 +192,16 @@ }); } + + /** + * アカウントと年と月と日を指定してスケジュールを更新する + * + * @param accountId アカウントid + * @param year 年 + * @param month 月 + * @param day 日 + * @param token トークン + */ public void updateSchedulesByDay(String accountId, int year, int month, int day, String token){ Call> call = scheduleRest.getSchedulesByDay(accountId, year, month, day, token); call.enqueue(new Callback>() { @@ -172,6 +218,17 @@ }); } + + /** + * アカウントと年と月と日とスケジュールのidを指定してスケジュールを更新する + * + * @param accountId アカウントid + * @param year 年 + * @param month 月 + * @param day 日 + * @param id id + * @param token トークン + */ public void updateScheduleById(String accountId, int year, int month, int day, int id, String token){ Call call = scheduleRest.getScheduleById(accountId, year, month, day, id, token); call.enqueue(new Callback() { @@ -188,6 +245,16 @@ }); } + /** + * アカウントid, 年, 月, 日, スケジュールidを指定してスケジュールを削除する + * + * @param accountId アカウントid + * @param year 年 + * @param month 月 + * @param day 日 + * @param id スケジュールid + * @param token トークン + */ public void deleteScheduleById(String accountId, int year, int month, int day, int id, String token){ Call call = scheduleRest.deleteScheduleById(accountId, year, month, day, id, token); call.enqueue(new Callback() { @@ -207,6 +274,17 @@ } + /** + * アカウントid, 年, 月, 日, スケジュールidを指定してスケジュールの開始日時を更新する + * + * @param accountId アカウントid + * @param year 年 + * @param month 月 + * @param day 日 + * @param id スケジュールid + * @param token トークン + * @param startTime 開始日時 + */ public void setStartTime(String accountId, int year, int month, int day, int id, String token, String startTime){ Call call = scheduleRest.putStartTime(accountId, year, month, day, id, token, startTime); call.enqueue(new Callback() { @@ -226,6 +304,18 @@ }); } + /** + * + * アカウントid, 年, 月, 日, スケジュールidを指定してスケジュールの終了日時を更新する + * + * @param accountId アカウントid + * @param year 年 + * @param month 月 + * @param day 日 + * @param id スケジュールid + * @param token トークン + * @param endTime 終了日時 + */ public void setEndTime(String accountId, int year, int month, int day, int id, String token, String endTime){ Call call = scheduleRest.putEndTime(accountId, year, month, day, id, token, endTime); call.enqueue(new Callback() { @@ -245,6 +335,17 @@ }); } + /** + * アカウントid, 年, 月, 日, スケジュールidを指定してスケジュールのタイトルを更新する + * + * @param accountId アカウントid + * @param year 年 + * @param month 月 + * @param day 日 + * @param id スケジュールid + * @param token トークン + * @param title タイトル + */ public void setTitle(String accountId, int year, int month, int day, int id, String token, String title){ Call call = scheduleRest.putTitle(accountId, year, month, day, id, token, title); call.enqueue(new Callback() { @@ -264,6 +365,17 @@ }); } + /** + * アカウントid, 年, 月, 日, スケジュールidを指定してスケジュールの所属する本を更新する + * + * @param accountId アカウントid + * @param year 年 + * @param month 月 + * @param day 日 + * @param id スケジュールid + * @param token トークン + * @param bookId 本のid + */ public void setBookId(String accountId, int year, int month, int day, int id, String token, int bookId){ Call call = scheduleRest.putBookId(accountId, year, month, day, id, token, bookId); call.enqueue(new Callback() { diff --git a/app/src/main/java/com/example/citrusclient/views/BookColorDialogFragment.java b/app/src/main/java/com/example/citrusclient/views/BookColorDialogFragment.java new file mode 100644 index 0000000..e04a4c8 --- /dev/null +++ b/app/src/main/java/com/example/citrusclient/views/BookColorDialogFragment.java @@ -0,0 +1,141 @@ +package com.example.citrusclient.views; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.DialogInterface; +import android.os.Bundle; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; + +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.RadioButton; +import android.widget.RadioGroup; +import android.widget.Toast; + +import com.example.citrusclient.R; + +/** + * A simple {@link Fragment} subclass. + * Use the {@link BookColorDialogFragment#newInstance} factory method to + * create an instance of this fragment. + */ +public class BookColorDialogFragment extends Fragment { + private RadioGroup radioGroupColors; + + // TODO: Rename parameter arguments, choose names that match + // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER + private static final String ARG_PARAM1 = "param1"; + private static final String ARG_PARAM2 = "param2"; + + // TODO: Rename and change types of parameters + private String mParam1; + private String mParam2; + + public BookColorDialogFragment() { + // Required empty public constructor + } + + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment BookColorDialogFragment. + */ + // TODO: Rename and change types and number of parameters + public static BookColorDialogFragment newInstance(String param1, String param2) { + BookColorDialogFragment fragment = new BookColorDialogFragment(); + Bundle args = new Bundle(); + args.putString(ARG_PARAM1, param1); + args.putString(ARG_PARAM2, param2); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getArguments() != null) { + mParam1 = getArguments().getString(ARG_PARAM1); + mParam2 = getArguments().getString(ARG_PARAM2); + } + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_book_color_dialog, container, false); + } + + int selected = 0; +// @Override + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); //親クラスである Fragment の onViewCreated() メソッドを呼び出す + view.findViewById(R.id.buttonCancel).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + ((MainActivity) getActivity()).showFragment(new CreateBookFragment()); + } + }); + + radioGroupColors = view.findViewById(R.id.radioGroupColors); + radioGroupColors.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(RadioGroup group, int checkedId) { + // ラジオボタンが選択された時の処理 + RadioButton checkedRadioButton = group.findViewById(checkedId); + if (checkedRadioButton != null && checkedRadioButton.isChecked()) { + String selectedColor = checkedRadioButton.getText().toString(); + radioGroupColors.findViewById(R.id.radioButtonSprout).setOnClickListener(new View.OnClickListener() { // + @Override + public void onClick(View view) { + ((MainActivity) getActivity()).showFragment(new CreateBookFragment()); + } + }); + // 選択された色に応じた処理をここに記述する + // 例えば、選択された色をログに出力する + Log.d("ColorSelection", "Selected color: " + selectedColor); + } + } + }); + + view.findViewById(R.id.buttonOk).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + ((MainActivity) getActivity()).showFragment(new CreateBookFragment()); + } + }); + + + } + + public Dialog onCreatedDialog(Bundle savedInstanceState){ + final String[] items = {"citrus","sakura","gray"}; + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + return builder.setTitle("色の種類") + .setSingleChoiceItems(items, selected, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int which) { + selected = which; + } + } + ) + .setPositiveButton("OK", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + Toast.makeText(getActivity(),String.format("[%s]が選択されました",items[selected]), + Toast.LENGTH_SHORT).show(); + } + } + ) + .create(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/citrusclient/views/CreateBookFragment.java b/app/src/main/java/com/example/citrusclient/views/CreateBookFragment.java index 666efc0..e8c6ade 100644 --- a/app/src/main/java/com/example/citrusclient/views/CreateBookFragment.java +++ b/app/src/main/java/com/example/citrusclient/views/CreateBookFragment.java @@ -1,6 +1,10 @@ package com.example.citrusclient.views; +import android.app.Dialog; +import android.app.AlertDialog; import android.content.Intent; +import android.content.DialogInterface; +//import android.support.v4.app.DialogFragment; import android.os.Bundle; import androidx.annotation.NonNull; @@ -90,7 +94,7 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); //親クラスである Fragment の onViewCreated() メソッドを呼び出す - Citrus citrus = (Citrus)(getActivity().getApplication()); + Citrus citrus = (Citrus) (getActivity().getApplication()); String token = citrus.getToken(); String accountId = citrus.getAccountId(); //ここから書く @@ -98,12 +102,15 @@ //((MainActivity) getContext()).setCreateBookFragment(this);//フラグメントとアクティビティ間での情報のやり取りがあるとき //((MainActivity) getActivity()).showFragment(new MyBookshelfFragment()); + //保存ボタンの処理 view.findViewById(R.id.save_button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view2) { EditText editname = (EditText) view.findViewById(R.id.book_name); //本の名前を入力する Editable bookeditable = editname.getText(); TextView textbookname = (TextView) view.findViewById(R.id.set_book_name); //本の名前が無かったら入力してと表示する + + if (bookeditable == null) { //本の名前がなかったら System.out.println("本の名前を入力してください"); @@ -128,21 +135,17 @@ // String textbook = textbookname.getText().toString().trim(); //本を保存するコードを書く? - - - - booksViewModel.createBook("bird",bookname,"#00FF00",true,"xyz"); //BooksViewModelを呼び出して本を作る + booksViewModel.createBook("bird", bookname, "#00FF00", true, "xyz"); //BooksViewModelを呼び出して本を作る //画面が本棚に戻る - - ((MainActivity) getActivity()).showFragment(new MyBookshelfFragment()); //本棚に戻る } } } }); + //キャンセルボタンの処理 view.findViewById(R.id.cancel_button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { @@ -150,5 +153,12 @@ } }); + //色選択をするとダイアログが出てくる + view.findViewById(R.id.color_button).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + ((MainActivity) getActivity()).showFragment(new BookColorDialogFragment()); + } + }); } } \ No newline at end of file diff --git a/app/src/main/java/com/example/citrusclient/views/HomeFragment.java b/app/src/main/java/com/example/citrusclient/views/HomeFragment.java new file mode 100644 index 0000000..d2f14ab --- /dev/null +++ b/app/src/main/java/com/example/citrusclient/views/HomeFragment.java @@ -0,0 +1,168 @@ +package com.example.citrusclient.views; + +import android.graphics.Color; +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.CheckBox; + +import com.example.citrusclient.Citrus; +import com.example.citrusclient.R; +import com.example.citrusclient.models.Book; +import com.example.citrusclient.models.Todo; +import com.example.citrusclient.viewmodels.TodosViewModel; +import com.google.android.material.floatingactionbutton.FloatingActionButton; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * A simple {@link Fragment} subclass. + * Use the {@link HomeFragment#newInstance} factory method to + * create an instance of this fragment. + */ +public class HomeFragment extends Fragment { + + // TODO: Rename parameter arguments, choose names that match + // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER + private static final String ARG_PARAM1 = "param1"; + private static final String ARG_PARAM2 = "param2"; + + // TODO: Rename and change types of parameters + private String mParam1; + private String mParam2; + + public HomeFragment() { + // Required empty public constructor + } + + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment HomeFragment. + */ + // TODO: Rename and change types and number of parameters + public static HomeFragment newInstance(String param1, String param2) { + HomeFragment fragment = new HomeFragment(); + Bundle args = new Bundle(); + args.putString(ARG_PARAM1, param1); + args.putString(ARG_PARAM2, param2); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getArguments() != null) { + mParam1 = getArguments().getString(ARG_PARAM1); + mParam2 = getArguments().getString(ARG_PARAM2); + } + + todosViewModel = new ViewModelProvider(this).get(TodosViewModel.class); + + } + + + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + + return inflater.inflate(R.layout.fragment_home, container, false); + } + + private List todoList; + TodosViewModel todosViewModel; + + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + + Citrus citrus = (Citrus)(getActivity().getApplication()); + String token = citrus.getToken(); + String accountId = citrus.getAccountId(); + + todoList = new ArrayList<>(); + todoList.add(new Todo("a", true, 2024, 06, 27, 1)); + + RecyclerView recyclerView = view.findViewById(R.id.my_todos_list); + recyclerView.setHasFixedSize(true); + RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(view.getContext()); + recyclerView.setLayoutManager(layoutManager); + MyTodoshelfAdapter todoAdapter = new MyTodoshelfAdapter(todoList); + recyclerView.setAdapter(todoAdapter); + + todosViewModel.getTodosByDayLiveData().observe(getViewLifecycleOwner(), new Observer>() { + @Override + public void onChanged(HashMap idTodoHashMap) { + if(idTodoHashMap != null) { + todoList = new ArrayList<>(idTodoHashMap.values()); + todoAdapter.setTodos(todoList); + } + } + }); + + todosViewModel.loadTodosByDay("bird", 1, 2024, 6, 2, "xyz"); + } + +} +class MyTodoshelfAdapter extends RecyclerView.Adapter { + + private List todoList; + + MyTodoshelfAdapter(List todo) { + this.todoList = todo; + } + + public void setTodos(List todos) { + todoList = todos; + notifyDataSetChanged(); + } + + @NonNull + @Override + public MyTodoViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.a_todo, parent, false); + return new MyTodoViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull MyTodoViewHolder holder, int position) { + Todo todoData = this.todoList.get(position); + holder.todoButton.setText(todoData.getTitle()); + holder.todoCheckBox.setChecked(todoData.getCheck()); + } + + @Override + public int getItemCount() { + return todoList.size(); + } + + static class MyTodoViewHolder extends RecyclerView.ViewHolder { + Button todoButton; + CheckBox todoCheckBox; + public MyTodoViewHolder(@NonNull View itemView) { + super(itemView); + todoButton = itemView.findViewById(R.id.todo_button); + todoCheckBox = itemView.findViewById(R.id.todo_checkBox); + } + } +} diff --git a/app/src/main/java/com/example/citrusclient/views/SignUpActivity.java b/app/src/main/java/com/example/citrusclient/views/SignUpActivity.java index e092f40..f62348f 100644 --- a/app/src/main/java/com/example/citrusclient/views/SignUpActivity.java +++ b/app/src/main/java/com/example/citrusclient/views/SignUpActivity.java @@ -2,6 +2,7 @@ import android.content.Intent; import android.os.Bundle; +import android.os.Handler; import android.view.View; import android.widget.EditText; import android.widget.TextView; @@ -23,6 +24,7 @@ import org.w3c.dom.Text; + public class SignUpActivity extends AppCompatActivity { private Retrofit retrofit; @@ -72,6 +74,7 @@ String id = editid.getText().toString().trim(); EditText editpw = (EditText) findViewById(R.id.put_pw); String pw = editpw.getText().toString().trim(); + final Handler handler = new Handler(); //入力欄が空欄の時 if(id.isEmpty() && pw.isEmpty() && id.trim().isEmpty() && pw.trim().isEmpty()){ @@ -92,8 +95,14 @@ citrus.setAccountId(id); //画面遷移 - Intent intent = new Intent(SignUpActivity.this,MainActivity.class); - startActivity(intent); + handler.post(new Runnable() { + @Override + public void run() { + Intent intent = new Intent(SignUpActivity.this,MainActivity.class); + startActivity(intent); + } + }); + }else{ //通信可能(ただしエラーが発生した場合) diff --git a/app/src/main/res/layout/a_todo.xml b/app/src/main/res/layout/a_todo.xml new file mode 100644 index 0000000..386d570 --- /dev/null +++ b/app/src/main/res/layout/a_todo.xml @@ -0,0 +1,36 @@ + + + + + +