diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml index b268ef3..d2af605 100644 --- a/.idea/deploymentTargetSelector.xml +++ b/.idea/deploymentTargetSelector.xml @@ -4,6 +4,14 @@ diff --git a/app/build.gradle b/app/build.gradle index 1836d13..005e609 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -26,6 +26,9 @@ sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + buildFeatures { + viewBinding true + } } dependencies { @@ -34,6 +37,8 @@ implementation libs.material implementation libs.activity implementation libs.constraintlayout + implementation libs.legacy.support.v4 + implementation libs.recyclerview testImplementation libs.junit androidTestImplementation libs.ext.junit androidTestImplementation libs.espresso.core diff --git a/app/src/main/java/com/example/citrusclient/Citrus.java b/app/src/main/java/com/example/citrusclient/Citrus.java index 06c1099..88c8126 100644 --- a/app/src/main/java/com/example/citrusclient/Citrus.java +++ b/app/src/main/java/com/example/citrusclient/Citrus.java @@ -2,10 +2,6 @@ import android.app.Application; -import com.example.citrusclient.models.Book; - -import java.util.ArrayList; - public class Citrus extends Application { //データ保存 @@ -15,7 +11,6 @@ private Integer curYear; private Integer curMonth; private Integer curDay; - private ArrayList books; //getter public String getToken(){ return token; @@ -27,7 +22,6 @@ public Integer getCurYear() {return curYear;} public Integer getCurMouth(){return curMonth;} public Integer getCurDay(){return curDay;} - public ArrayList getBook(){return books;} //setter public void setToken(String token){ @@ -40,5 +34,4 @@ public void setCurYear(Integer curYear){this.curYear = curYear;} public void setCurMonth(Integer curMonth){this.curMonth = curMonth;} public void setCurDay(Integer curDay){this.curDay = curDay;} - public void setBook(ArrayList books){this.books = books;} } diff --git a/app/src/main/java/com/example/citrusclient/rest/PublicBooksRest.java b/app/src/main/java/com/example/citrusclient/rest/PublicBooksRest.java new file mode 100644 index 0000000..7d600f9 --- /dev/null +++ b/app/src/main/java/com/example/citrusclient/rest/PublicBooksRest.java @@ -0,0 +1,22 @@ +package com.example.citrusclient.rest; + +import com.example.citrusclient.models.Book; + +import java.util.ArrayList; + +import retrofit2.Call; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public interface PublicBooksRest { + @GET("public_books") + Call> getAllPublicBooks(); + + @GET("public_books/search") + + Call> searchBooksByTitleAndAccount( + @Query("search_title") String search_title, + @Query("search_account_id") String search_id, + @Query("sort_by") int sort + ); +} diff --git a/app/src/main/java/com/example/citrusclient/viewmodels/PublicBooksViewModel.java b/app/src/main/java/com/example/citrusclient/viewmodels/PublicBooksViewModel.java new file mode 100644 index 0000000..4577601 --- /dev/null +++ b/app/src/main/java/com/example/citrusclient/viewmodels/PublicBooksViewModel.java @@ -0,0 +1,77 @@ +package com.example.citrusclient.viewmodels; + +import com.example.citrusclient.models.Book; +import com.example.citrusclient.rest.PublicBooksRest; + +import java.util.ArrayList; + +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; +import retrofit2.Retrofit; +import retrofit2.converter.jackson.JacksonConverterFactory; + +public class PublicBooksViewModel extends ViewModel { + private final Retrofit retrofit; + private final PublicBooksRest publicBooksRest; + + private final MutableLiveData> allBooksLiveData; + private final MutableLiveData> searchBooksLiveData; + + public PublicBooksViewModel(){ + retrofit = new Retrofit.Builder() + .baseUrl("http://nitta-lab-www.is.konan-u.ac.jp/citrus/") + .addConverterFactory(JacksonConverterFactory.create()) + .build(); + this.publicBooksRest = retrofit.create(PublicBooksRest.class); + this.allBooksLiveData = new MutableLiveData<>(); + this.searchBooksLiveData = new MutableLiveData<>(); + } + + public MutableLiveData> getAllBooksLiveData(){ + return this.allBooksLiveData; + } + public MutableLiveData> getSearchBooksLiveData(){ + return this.searchBooksLiveData; + } + + public void loadAllBooks(){ + Call> call = publicBooksRest.getAllPublicBooks(); + + call.enqueue(new Callback>(){ + @Override + public void onResponse(Call> call, Response>response){ + if(response.isSuccessful()){ + ArrayList book = response.body(); + allBooksLiveData.setValue(book); + System.out.println(response.code()); + }else System.out.println(response.code()); + } + + @Override + public void onFailure(Call> call, Throwable t){ + System.out.println("NetWorkError" + t); + } + }); + } + public void loadSearchBooks(String title,String accountId,int sortBy){ + Call> call = publicBooksRest.searchBooksByTitleAndAccount(title,accountId,sortBy); + call.enqueue(new Callback>(){ + @Override + public void onResponse(Call> call, Response>response){ + if(response.isSuccessful()){ + ArrayList book = response.body(); + allBooksLiveData.setValue(book); + System.out.println(response.code()); + }else System.out.println(response.code()); + } + + @Override + public void onFailure(Call> call, Throwable t){ + System.out.println("NetWorkError" + t); + } + }); + } +} 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..fe52065 --- /dev/null +++ b/app/src/main/java/com/example/citrusclient/views/BookColorDialogFragment.java @@ -0,0 +1,118 @@ +package com.example.citrusclient.views; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.DialogInterface; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.os.Bundle; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.DialogFragment; +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.Citrus; +import com.example.citrusclient.R; + +public class BookColorDialogFragment extends DialogFragment { + private Citrus citrus; + + CreateBookFragment target; + + BookColorDialogFragment(CreateBookFragment fr){ + target=fr; + } + @NonNull + @Override + public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { + // ダイアログを生成 + Dialog dialog = new Dialog(requireContext()); + dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + dialog.setContentView(R.layout.fragment_book_color_dialog); + + RadioGroup rg = dialog.findViewById(R.id.radioGroupColors); + + // ラジオグループのチェック状態変更リスナーを設定 + rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(RadioGroup group, int checkedId) { + // チェックされたラジオボタンのIDを取得 + RadioButton radioButton = group.findViewById(checkedId); + if (radioButton != null) { + int selectedId = radioButton.getId(); + // ここで選択されたラジオボタンのID(selectedId)を使用して処理を行う + if (selectedId == R.id.radioButtonShadow) { + target.returnValue("#D5D5D5"); + } else if (selectedId == R.id.radioButtonSprout) { + target.returnValue("#BEECAE"); + } else if (selectedId == R.id.radioButtonAqua) { + target.returnValue("#BEF7FF"); + } else if (selectedId == R.id.radioButtonLavender) { + target.returnValue("#B994FF"); + } else if (selectedId == R.id.radioButtonJasmine) { + target.returnValue("#FFFFFF"); + } else if (selectedId == R.id.radioButtonCitrus) { + target.returnValue("#F6C755"); + } else if (selectedId == R.id.radioButtonSakura) { + target.returnValue("#FFCBFA"); + } + + } + dismiss(); + } + }); + + + return dialog; +// RadioGroup rg = (RadioGroup) view.findViewById(R.id.radioGroupColors); +// +// // ラジオグループのチェック状態変更イベントを登録 +// rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { +// +// // チェック状態変更時に呼び出されるメソッド +// public void onCheckedChanged(RadioGroup group, int checkedId) { +// // チェック状態時の処理を記述 +// // チェックされたラジオボタンオブジェクトを取得 +// RadioButton radioButton = (RadioButton) view.findViewById(checkedId); +// } +// }); +// +// Dialog dialog = new Dialog(requireContext()); +// dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); +// +// dialog.setContentView(R.layout.fragment_book_color_dialog); +// +// +// return dialog; + } + + +// 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/CalendarFragment.java b/app/src/main/java/com/example/citrusclient/views/CalendarFragment.java index 4fd89f9..cc44f19 100644 --- a/app/src/main/java/com/example/citrusclient/views/CalendarFragment.java +++ b/app/src/main/java/com/example/citrusclient/views/CalendarFragment.java @@ -12,6 +12,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.Button; +import android.widget.LinearLayout; import android.widget.TableLayout; import android.widget.TableRow; import android.widget.TextView; @@ -20,7 +21,9 @@ import com.example.citrusclient.models.Schedule; import com.example.citrusclient.viewmodels.ScheduleViewModel; +import java.io.ObjectInputStream; import java.util.ArrayList; +import java.util.Calendar; import java.util.List; /** @@ -86,22 +89,71 @@ private List scheduleList; ScheduleViewModel scheduleViewModel; + int month; + @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + tableLayout = view.findViewById(R.id.calendarlayout); + Calendar calendar = Calendar.getInstance(); + month = calendar.get(Calendar.MONTH) + 1; + int date = calendar.get(Calendar.DATE); + int lastdate = calendar.getActualMaximum(Calendar.DATE); + int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); + + Button nextMonth = view.findViewById(R.id.nextMonth); + Button prevMonth = view.findViewById(R.id.prevMonth); + TextView curMonth = view.findViewById(R.id.month); + curMonth.setText("" + month + "月"); + nextMonth.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + month++; + if(month > 12){ + month = 1; + } + curMonth.setText("" + month + "月"); + } + }); + + prevMonth.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + month--; + if(month < 1) { + month = 12; + } + curMonth.setText("" + month + "月"); + } + }); + + for(int i = 0; i < 6; i++) { tableRows[i] = (TableRow) tableLayout.getChildAt(i); for(int j = 0; j < 7; j++) { - RecyclerView recyclerView = new RecyclerView(requireContext());//RecyclerView.LayoutParams.MATCH_PARENT + LinearLayout layout = new LinearLayout(requireContext()); + layout.setOrientation(LinearLayout.VERTICAL); + + TextView textView = new TextView(requireContext()); + textView.setText("" + i); + + RecyclerView recyclerView = new RecyclerView(requireContext()); recyclerView.setLayoutManager(new LinearLayoutManager(view.getContext())); - recyclerView.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.MATCH_PARENT)); + recyclerView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)); List schedules = new ArrayList<>(); schedules.add(new Schedule("abc", "3232", "yyyy", 0, 1)); + schedules.add(new Schedule("123", "3232", "yyyy", 0, 2)); recyclerView.setAdapter(new MyScheduleAdapter(schedules)); - TableRow.LayoutParams p = (TableRow.LayoutParams) recyclerView.getLayoutParams(); + LinearLayout.LayoutParams p = (LinearLayout.LayoutParams) recyclerView.getLayoutParams(); p.weight = 1; - tableRows[i].addView(recyclerView); + + layout.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.MATCH_PARENT)); + TableRow.LayoutParams p2 = (TableRow.LayoutParams) layout.getLayoutParams(); + p2.weight = 1; + layout.addView(textView); + layout.addView(recyclerView); + tableRows[i].addView(layout); } } } @@ -119,13 +171,13 @@ } @NonNull @Override - public MyScheduleAdapter.MyScheduleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + public MyScheduleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.a_calendar_schedule, parent, false); return new MyScheduleViewHolder(view); } @Override - public void onBindViewHolder(@NonNull MyScheduleAdapter.MyScheduleViewHolder holder, int position) { + public void onBindViewHolder(@NonNull MyScheduleViewHolder holder, int position) { Schedule scheduleData = this.scheduleList.get(position); holder.scheduleText.setText(scheduleData.getTitle()); } 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..353d6b8 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,9 @@ package com.example.citrusclient.views; import android.content.Intent; +import android.content.DialogInterface; +//import android.support.v4.app.DialogFragment; +import android.content.res.ColorStateList; import android.os.Bundle; import androidx.annotation.NonNull; @@ -24,6 +27,8 @@ import android.os.Bundle; import android.widget.Button; import android.widget.EditText; +import android.widget.RadioButton; +import android.widget.RadioGroup; import android.widget.TextView; import org.w3c.dom.Text; @@ -87,6 +92,8 @@ return inflater.inflate(R.layout.fragment_create_book, container, false); } + + private String color; @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); //親クラスである Fragment の onViewCreated() メソッドを呼び出す @@ -98,12 +105,16 @@ //((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("本の名前を入力してください"); @@ -125,24 +136,23 @@ } } else { System.out.println(bookname); -// String textbook = textbookname.getText().toString().trim(); - //本を保存するコードを書く? + // String textbook = textbookname.getText().toString().trim(); + String accountId = ((Citrus) getActivity().getApplication()).getAccountId(); + String token = ((Citrus) getActivity().getApplication()).getToken(); - - - - booksViewModel.createBook("bird",bookname,"#00FF00",true,"xyz"); //BooksViewModelを呼び出して本を作る + if(color == null){ + color = "#D5D5D5"; //色が選択されてなかったらグレー + } + booksViewModel.createBook(accountId, bookname, color, true, token); //BooksViewModelを呼び出して本を作る //画面が本棚に戻る - - - ((MainActivity) getActivity()).showFragment(new MyBookshelfFragment()); //本棚に戻る } } } }); + //キャンセルボタンの処理 view.findViewById(R.id.cancel_button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { @@ -150,5 +160,28 @@ } }); + //色選択をするとダイアログが出てくる + view.findViewById(R.id.color_button).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view2) { +// ((MainActivity) getActivity()).showFragment(new BookColorDialogFragment()); + //CreatebookFragmentにBookColordialogFragmentの情報を渡した状態のコンストラクタをつくる + BookColorDialogFragment bookColorDialogFragment = new BookColorDialogFragment(CreateBookFragment.this); + bookColorDialogFragment.show(getActivity().getSupportFragmentManager(), "simple"); + + } + }); + } + + public void returnValue(String colorIn){ + color = colorIn;//createBookの変数colorに入る + + View view = getView(); // FragmentのView + + if (view != null) { + Button colorButton = view.findViewById(R.id.color_button); + int parsedColor = Color.parseColor(color); + colorButton.setBackgroundTintList(ColorStateList.valueOf(parsedColor)); + } } } \ No newline at end of file diff --git a/app/src/main/java/com/example/citrusclient/views/MainActivity.java b/app/src/main/java/com/example/citrusclient/views/MainActivity.java index ea3db46..4f26114 100644 --- a/app/src/main/java/com/example/citrusclient/views/MainActivity.java +++ b/app/src/main/java/com/example/citrusclient/views/MainActivity.java @@ -26,7 +26,6 @@ public class MainActivity extends AppCompatActivity { - BooksViewModel booksViewModel; Citrus citrus; @Override @@ -43,15 +42,7 @@ citrus = (Citrus) getApplication(); - booksViewModel = new ViewModelProvider(this).get(BooksViewModel.class); - booksViewModel.getBookLiveData().observe(this, new Observer>() { - @Override - public void onChanged(HashMap integerBookHashMap) { - citrus.setBook(new ArrayList<>(integerBookHashMap.values())); - } - }); - - showFragment(new MyBookshelfFragment()); +// showFragment(new HomeFragment()); setNavViewEvent(); @@ -66,6 +57,8 @@ private void setNavViewEvent(){ BottomNavigationView navView = findViewById(R.id.bottomNavigationView); + navView.setSelectedItemId(R.id.home); + showFragment(new HomeFragment()); navView.setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) { 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 606bfbf..291daab 100644 --- a/app/src/main/java/com/example/citrusclient/views/MyBookshelfFragment.java +++ b/app/src/main/java/com/example/citrusclient/views/MyBookshelfFragment.java @@ -128,12 +128,16 @@ booksViewModel.getBookLiveData().observe(getViewLifecycleOwner(), new Observer>() { @Override public void onChanged(HashMap integerBookHashMap) { - bookList = new ArrayList<>(integerBookHashMap.values()); + if(integerBookHashMap != null){ + bookList = new ArrayList<>(integerBookHashMap.values()); + }else{ + bookList = new ArrayList<>(); + } bookAdapter.setBooks(bookList); } }); - booksViewModel.loadBooks("bird", "xyz"); + booksViewModel.loadBooks(accountId, token); } @@ -166,9 +170,24 @@ public void onBindViewHolder(@NonNull MyBookViewHolder holder, int position) { Book bookData = this.bookList.get(position); holder.bookButton.setText(bookData.getTitle()); - int red = Integer.parseInt(bookData.getColor().substring(1, 3), 16); - int green = Integer.parseInt(bookData.getColor().substring(3, 5), 16); - int blue = Integer.parseInt(bookData.getColor().substring(5, 7), 16); + int red; + int green; + int blue; + if (bookData.getColor() == null){ + red = 255; + green = 255; + blue = 255; + } + else if(bookData.getColor().length() < 7){ + red = 255; + green = 255; + blue = 255; + }else{ + red = Integer.parseInt(bookData.getColor().substring(1, 3), 16); + green = Integer.parseInt(bookData.getColor().substring(3, 5), 16); + blue = Integer.parseInt(bookData.getColor().substring(5, 7), 16); + } + holder.bookButton.setBackgroundColor(Color.rgb(red, green, blue)); holder.bookButton.setTextColor(Color.rgb(255 - red, 255 - green, 255 - blue)); holder.bookButton.setOnClickListener(v -> { diff --git a/app/src/main/res/layout/a_calendar_schedule.xml b/app/src/main/res/layout/a_calendar_schedule.xml index dd2b441..6b230e3 100644 --- a/app/src/main/res/layout/a_calendar_schedule.xml +++ b/app/src/main/res/layout/a_calendar_schedule.xml @@ -2,13 +2,14 @@ + android:layout_height="wrap_content"> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index df65e07..785db3b 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -28,9 +28,10 @@ android:background="#BAE4C3" android:minHeight="50dp" app:itemHorizontalTranslationEnabled="false" - app:itemIconSize="50dp" + app:itemIconSize="30dp" app:itemIconTint="@drawable/bottom_navigation_item_state" - app:itemPadding="100dp" + app:itemPaddingBottom="0dp" + app:itemPaddingTop="-50dp" app:itemTextAppearanceActiveBoldEnabled="true" app:itemTextColor="@drawable/bottom_navigation_item_state" app:menu="@menu/bottom_navigation_item" /> diff --git a/app/src/main/res/layout/fragment_book_color_dialog.xml b/app/src/main/res/layout/fragment_book_color_dialog.xml new file mode 100644 index 0000000..7f7c250 --- /dev/null +++ b/app/src/main/res/layout/fragment_book_color_dialog.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_calendar.xml b/app/src/main/res/layout/fragment_calendar.xml index d19d10e..4de690d 100644 --- a/app/src/main/res/layout/fragment_calendar.xml +++ b/app/src/main/res/layout/fragment_calendar.xml @@ -8,106 +8,104 @@ tools:context=".views.CalendarFragment"> +