diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3caa385..1f943f0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ - + + tools:targetApi="31" + android:usesCleartextTraffic="true" + android:networkSecurityConfig="@xml/network_security_config"> diff --git a/app/src/main/java/com/example/citrusclient/viewmodels/TodoViewModel.java b/app/src/main/java/com/example/citrusclient/viewmodels/TodoViewModel.java deleted file mode 100644 index 41deb9e..0000000 --- a/app/src/main/java/com/example/citrusclient/viewmodels/TodoViewModel.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.example.citrusclient.viewmodels; - -import androidx.lifecycle.ViewModel; - -public class TodoViewModel extends ViewModel { -} diff --git a/app/src/main/java/com/example/citrusclient/viewmodels/TodosViewModel.java b/app/src/main/java/com/example/citrusclient/viewmodels/TodosViewModel.java new file mode 100644 index 0000000..722398e --- /dev/null +++ b/app/src/main/java/com/example/citrusclient/viewmodels/TodosViewModel.java @@ -0,0 +1,229 @@ +package com.example.citrusclient.viewmodels; + +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +import com.example.citrusclient.models.Todo; +import com.example.citrusclient.models.Book; +import com.example.citrusclient.rest.TodosRest; + + +import java.util.ArrayList; +import java.util.HashMap; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; +import retrofit2.Retrofit; +import retrofit2.converter.jackson.JacksonConverterFactory; + +public class TodosViewModel extends ViewModel { + private final Retrofit retrofit; + private final TodosRest todosRest; + + //LiveData + private final MutableLiveData>>>> allTodosLiveData; + private final MutableLiveData>> TodosByMonthLiveData; + private final MutableLiveData> TodosByDayLiveData; + private final MutableLiveData TodoByIdLiveData; + private final MutableLiveData errorLiveData; + + //Constructor + public TodosViewModel() + { + this.retrofit = new Retrofit.Builder() + .baseUrl("http://nitta-lab-www.is.konan-u.ac.jp/citrus/") + .addConverterFactory(JacksonConverterFactory.create()) + .build(); + this.todosRest = retrofit.create(TodosRest.class); + this.allTodosLiveData = new MutableLiveData<>(); + this.TodosByMonthLiveData = new MutableLiveData<>(); + this.TodosByDayLiveData = new MutableLiveData<>(); + this.TodoByIdLiveData = new MutableLiveData<>(); + this.errorLiveData = new MutableLiveData<>(); + } + + //getter + public MutableLiveData>>>> getTodosLiveData() + { + return allTodosLiveData; + } + public MutableLiveData getErrorLiveData() {return errorLiveData;} + + + public void getAllTodos(String accountId,Integer bookId, String token) + { + Call>>>> call = todosRest.getAllTodos(accountId, bookId, token); + call.enqueue(new Callback>>>>() { + @Override + public void onResponse(Call>>>> call, Response>>>> response) { + if (response.isSuccessful()) { + System.out.println("Success: getAllTodos"); + allTodosLiveData.setValue(response.body()); + } else { + System.out.println("Error: getAllTodos" + response.code()); + errorLiveData.setValue(parseStatusCode(response.code())); + } + } + @Override + public void onFailure(Call>>>> call, Throwable t) { + System.out.println("CommunicationError: getAllTodos" + t); + errorLiveData.setValue(parseStatusCode(-1)); + } + + }); + } + + public void getTodosByMonth(String accountId,Integer bookId, Integer year, Integer month, + String token) + { + Call>> call = todosRest.getTodosByMonth(accountId, bookId, year, month, token); + call.enqueue(new Callback>>() { + @Override + public void onResponse(Call>> call, Response>> response) { + if (response.isSuccessful()) { + System.out.println("Success: getTodosByMonth"); + TodosByMonthLiveData.setValue(response.body()); + } else { + System.out.println("Error: getTodosByMonth" + response.code()); + } + } + @Override + public void onFailure(Call>> call, Throwable t) { + System.out.println("CommunicationError: getTodosByMonth" + t); + errorLiveData.setValue(parseStatusCode(-1)); + } + + }); + } + + public void getTodosByDay(String accountId,Integer bookId, Integer year, Integer month, + Integer day, String token) + { + Call> call = todosRest.getTodosByDay(accountId, bookId, year, month, day, token); + call.enqueue(new Callback>() { + @Override + public void onResponse(Call> call, Response> response) { + if (response.isSuccessful()) { + System.out.println("Success: getTodosByDay"); + TodosByDayLiveData.setValue(response.body()); + } else { + System.out.println("Error: getTodosByDay" + response.code()); + } + } + @Override + public void onFailure(Call> call, Throwable t) { + System.out.println("CommunicationError: getTodosByDay" + t); + errorLiveData.setValue(parseStatusCode(-1)); + } + + }); + } + + public void getTodoById(String accountId,Integer bookId, Integer year, Integer month, + Integer day, Integer todoId, String token) + { + Call call = todosRest.getTodoById(accountId, bookId, year, month, day, todoId, token); + call.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful()) { + System.out.println("Success: getTodoById"); + TodoByIdLiveData.setValue(response.body()); + } else { + System.out.println("Error: getTodoById" + response.code()); + } + } + @Override + public void onFailure(Call call, Throwable t) { + System.out.println("CommunicationError: getTodoById" + t); + errorLiveData.setValue(parseStatusCode(-1)); + } + + }); + } + + public void createTodo(String accountId,Integer bookId, Integer year, Integer month, + Integer day, String title, String token) + { + Call call = todosRest.createTodo(accountId, bookId, year, month, day, title, token); + call.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful()) { + System.out.println("Success: createTodo"); + + } else { + System.out.println("Error: createTodo" + response.code()); + } + } + @Override + public void onFailure(Call call, Throwable t) { + System.out.println("CommunicationError: createTodo" + t); + errorLiveData.setValue(parseStatusCode(-1)); + } + + }); + } + + public void setCheck(String accountId, Integer BookId, Integer year, Integer month, + Integer day, Integer todoId, boolean check, String token) + { + Call call = todosRest.setCheck(accountId, BookId, year, month, day, todoId, check, token); + call.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful()) { + System.out.println("Success: setCheck"); + + } else { + System.out.println("Error: setCheck" + response.code()); + } + } + @Override + public void onFailure(Call call, Throwable t) { + System.out.println("CommunicationError: setCheck" + t); + errorLiveData.setValue(parseStatusCode(-1)); + } + }); + } + + public void deleteTodo(String accountId, Integer BookId, Integer year, Integer month, + Integer day, Integer todoId, String token) + { + Call call = todosRest.deleteTodoById(accountId, BookId, year, month, day, todoId, token); + call.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful()) { + System.out.println("Success: deleteTodo"); + + } else { + System.out.println("Error: deleteTodo" + response.code()); + } + } + @Override + public void onFailure(Call call, Throwable t) { + System.out.println("CommunicationError: deleteTodo" + t); + errorLiveData.setValue(parseStatusCode(-1)); + } + }); + } + + + + private String parseStatusCode(Integer stats) { + switch (stats) { + case 404: + return "NotFound"; + case 401: + return "InvalidToken"; + case 400: + return "ResponseError"; + case 500: + return "ServerError"; + default: + return "UnknownError"; + } + } +} diff --git a/app/src/main/java/com/example/citrusclient/views/MyBookshelfFragment.java b/app/src/main/java/com/example/citrusclient/views/MyBookshelfFragment.java index 51865a1..3019a14 100644 --- a/app/src/main/java/com/example/citrusclient/views/MyBookshelfFragment.java +++ b/app/src/main/java/com/example/citrusclient/views/MyBookshelfFragment.java @@ -7,6 +7,8 @@ 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; @@ -20,11 +22,13 @@ import com.example.citrusclient.Citrus; import com.example.citrusclient.R; +import com.example.citrusclient.models.Book; import com.example.citrusclient.viewmodels.BooksViewModel; import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.google.android.material.snackbar.Snackbar; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; /** @@ -66,7 +70,9 @@ } - private List bookList; + private List bookList; + BooksViewModel booksViewModel; + @Override public void onCreate(Bundle savedInstanceState) { @@ -75,13 +81,19 @@ mParam1 = getArguments().getString(ARG_PARAM1); mParam2 = getArguments().getString(ARG_PARAM2); } + + booksViewModel = new ViewModelProvider(this).get(BooksViewModel.class); + } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_my_bookshelf_fragment, container, false); + View rootView = inflater.inflate(R.layout.fragment_my_bookshelf_fragment, container, false); + + return rootView; + } @@ -90,14 +102,13 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - bookList = createBooks(); Citrus citrus = (Citrus)(getActivity().getApplication()); String token = citrus.getToken(); String accountId = citrus.getAccountId(); - BooksViewModel booksViewModel = new BooksViewModel(); - + bookList = new ArrayList<>(); + bookList.add(new Book("a", 1, "a", true, "0")); RecyclerView recyclerView = view.findViewById(R.id.my_books_list); recyclerView.setHasFixedSize(true); @@ -109,37 +120,29 @@ FloatingActionButton addButton = view.findViewById(R.id.book_add_button); addButton.setOnClickListener(v -> { -// RowBook b = new RowBook(); -// b.hogeTitle = "hoge"; -// bookList.add(b); -// bookAdapter.notifyItemInserted(bookList.size()-1); + ((MainActivity) getActivity()).showFragment(new CreateBookFragment()); }); - } + booksViewModel.getBookLiveData().observe(getViewLifecycleOwner(), new Observer>() { + @Override + public void onChanged(HashMap integerBookHashMap) { + bookList = new ArrayList<>(integerBookHashMap.values()); + bookAdapter.notifyDataSetChanged(); + } + }); - private List createBooks(){ - List books = new ArrayList<>(); - for(int i = 0; i < 5; i++){ - RowBook book = new RowBook(); - book.hogeTitle = "hoge"; - book.color = Color.RED; - books.add(book); - } - return books; - } + booksViewModel.loadBooks("bird", "xyz"); - class RowBook{ - String hogeTitle; - int color; + } } class MyBookshelfAdapter extends RecyclerView.Adapter{ - private List bookList; + private List bookList; - MyBookshelfAdapter(List book){ + MyBookshelfAdapter(List book){ this.bookList = book; } @@ -152,9 +155,9 @@ @Override public void onBindViewHolder(@NonNull MyBookViewHolder holder, int position) { - MyBookshelfFragment.RowBook bookData = this.bookList.get(position); - holder.bookButton.setText(bookData.hogeTitle); - holder.bookButton.setBackgroundColor(bookData.color); + Book bookData = this.bookList.get(position); + holder.bookButton.setText(bookData.getTitle()); + holder.bookButton.setBackgroundColor(Color.RED); } @Override diff --git a/app/src/main/res/layout/a_book.xml b/app/src/main/res/layout/a_book.xml index 5bd8707..0f87cbd 100644 --- a/app/src/main/res/layout/a_book.xml +++ b/app/src/main/res/layout/a_book.xml @@ -8,12 +8,12 @@