diff --git a/app/src/main/java/com/example/citrusclient/Citrus.java b/app/src/main/java/com/example/citrusclient/Citrus.java index 07637ce..52505ac 100644 --- a/app/src/main/java/com/example/citrusclient/Citrus.java +++ b/app/src/main/java/com/example/citrusclient/Citrus.java @@ -26,7 +26,6 @@ public Integer getCurDay(){return curDay;} public String getCurLookingAccountId(){return curLookingAccountId;} public Integer getCurLookingBookId(){return curLookingBookId;} - //setter public void setToken(String token){ this.token = token; diff --git a/app/src/main/java/com/example/citrusclient/rest/AccountsRest.java b/app/src/main/java/com/example/citrusclient/rest/AccountsRest.java index 0941f37..592ecd2 100644 --- a/app/src/main/java/com/example/citrusclient/rest/AccountsRest.java +++ b/app/src/main/java/com/example/citrusclient/rest/AccountsRest.java @@ -1,10 +1,15 @@ package com.example.citrusclient.rest; +import dalvik.annotation.optimization.FastNative; import retrofit2.Call; +import retrofit2.http.DELETE; import retrofit2.http.Field; import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; import retrofit2.http.POST; +import retrofit2.http.PUT; import retrofit2.http.Path; +import retrofit2.http.Query; public interface AccountsRest { @@ -27,4 +32,53 @@ @Path("account_id") String account_id, @Field("password") String password ); + + //仮 + //パスワード変更 + @FormUrlEncoded + @PUT("accounts/{account_id}/password") + Call changePW( + @Path("account_id") String account_id, + @Field("new_password") String new_password, + @Field("old_password") String old_password, + @Field("token") String token + ); + + //仮 + //アカウント削除 + @FormUrlEncoded + @DELETE("accounts/{account_id}") + Call deleteId( + @Path("account_id") String account_id, + @Query("token") String token, + @Query("password") String password + ); + //仮 + //アカウントの色を返す + @FormUrlEncoded + @GET("accounts/{account_id}/accountColor") + Call getAccountColor( + @Path("account_id") String account_id + ); + + //仮 + //アカウントカラー変更 + @FormUrlEncoded + @PUT("accounts/{account_id}/accountColor") + Call changeColor( + @Path("account_id") String account_id, + @Field("accountColor") String accountColor, + @Field("token") String token + ); + + //仮 + //アカウント変更 + @FormUrlEncoded + @PUT("accounts/{account_id}") + Call changeAccount( + @Path("account_id") String account_id, + @Field("new_account_id") String new_account_id, + @Field("old_password") String old_password, + @Field("token") String token + ); } diff --git a/app/src/main/java/com/example/citrusclient/viewmodels/BooksViewModel.java b/app/src/main/java/com/example/citrusclient/viewmodels/BooksViewModel.java index cbf3f2a..e96c043 100644 --- a/app/src/main/java/com/example/citrusclient/viewmodels/BooksViewModel.java +++ b/app/src/main/java/com/example/citrusclient/viewmodels/BooksViewModel.java @@ -20,6 +20,7 @@ private final Retrofit retrofit; private final BooksRest booksRest; private final MutableLiveData> booksLiveData; + private final MutableLiveData book; private final MutableLiveData titleLiveData; private final MutableLiveData colorLiveData; private final MutableLiveData publicityLiveData; @@ -36,12 +37,15 @@ this.colorLiveData = new MutableLiveData<>(); this.publicityLiveData = new MutableLiveData<>(); this.favoritedLiveData = new MutableLiveData<>(); + this.book = new MutableLiveData<>(); } public MutableLiveData> getBookLiveData() { return this.booksLiveData;}//本の一覧を返す public MutableLiveData getTitleLiveData() {return this.titleLiveData;}//本のタイトルを返す public MutableLiveData getPublicityLiveData() {return this.publicityLiveData;}//本の公開状態を返す + public MutableLiveData getBook() {return this.book;}; + public void createBook(String accountId, String title, String color, Boolean publicity, String token ){ Call> call = booksRest.createBook(accountId , title, color, publicity, token); @@ -84,6 +88,23 @@ }); } + public void loadBook(String accountId, String token, int bookId) { + Call call = booksRest.getBook(accountId, bookId, token); + call.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if(response.isSuccessful()) { + book.setValue(response.body()); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + System.out.println("network error"); + } + }); + } + public void deleteBook(String accountId, Integer bookId, String token){ Call> call = booksRest.deleteBook(accountId, bookId, token); diff --git a/app/src/main/java/com/example/citrusclient/viewmodels/FavoritesViewModel.java b/app/src/main/java/com/example/citrusclient/viewmodels/FavoritesViewModel.java index 48322d5..e183844 100644 --- a/app/src/main/java/com/example/citrusclient/viewmodels/FavoritesViewModel.java +++ b/app/src/main/java/com/example/citrusclient/viewmodels/FavoritesViewModel.java @@ -88,4 +88,38 @@ } }); } + + public void setFavorite(String accountId,Integer bookId,String otherAccountId,String token){ + Call call = favoritesRest.putFavorite(accountId, bookId, otherAccountId, token); + call.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if(response.isSuccessful()){ + System.out.println("success : putFavorite"); + }else System.out.println(response.code()); + } + + @Override + public void onFailure(Call call, Throwable t) { + System.out.println("NetworkError : putFavorite" + t); + } + }); + } + + public void deletefavorite(String accountId,Integer bookId,String otherAccountId,String token){ + Call call = favoritesRest.removeFavorite(accountId, bookId, otherAccountId, token); + call.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if(response.isSuccessful()){ + System.out.println("success : removeFavorite"); + }else System.out.println(response.code()); + } + + @Override + public void onFailure(Call call, Throwable t) { + System.out.println("NetworkError : removeFavorite" + t); + } + }); + } } diff --git a/app/src/main/java/com/example/citrusclient/viewmodels/SettingsViewModel.java b/app/src/main/java/com/example/citrusclient/viewmodels/SettingsViewModel.java new file mode 100644 index 0000000..d58ef10 --- /dev/null +++ b/app/src/main/java/com/example/citrusclient/viewmodels/SettingsViewModel.java @@ -0,0 +1,142 @@ +package com.example.citrusclient.viewmodels; + +import com.example.citrusclient.Citrus; +import com.example.citrusclient.rest.AccountsRest; + +import java.net.HttpCookie; + +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 SettingsViewModel extends ViewModel { + private final Retrofit retrofit; + private final AccountsRest accountsRest; + private final MutableLiveData accountColorLiveData; + + + public SettingsViewModel(){ + retrofit = new Retrofit.Builder() + .baseUrl("http://nitta-lab-www.is.konan-u.ac.jp/citrus/") + .addConverterFactory(JacksonConverterFactory.create()) + .build(); + this.accountsRest = retrofit.create(AccountsRest.class); + this.accountColorLiveData = new MutableLiveData<>(); + } + public MutableLiveData getAccountColorLiveData(){return accountColorLiveData;} + + public void loadAccountColor(String accountId){ + Call call= accountsRest.getAccountColor(accountId); + call.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + String strAccountColor = response.body(); + if (response.isSuccessful()){ + System.out.println("success"); + accountColorLiveData.setValue(strAccountColor); + }else{ + System.out.println("fail"); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + System.out.println("NetworkError"+t); + + } + }); + } + + //なんちゃって通信ver1 + //PW変更時のサーバ通信プログラム + public void changePW(String accountId, String old_password, String new_password,String token){ + Call call = accountsRest.changePW(accountId, old_password, new_password, token); + call.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful()) { + System.out.println("success"); + //成功処理 + } else { + System.out.println("fail"); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + System.out.println("NetWorkError"+t); + } + }); + } + //通信ver2 + //アカウント削除 + public void deleteId(String accountId, String token, String password){ + Call call =accountsRest.deleteId(accountId,token,password); + call.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if(response.isSuccessful()){ + System.out.println("success"); + //成功処理 + }else{ + System.out.println("fail"); + //もしコンソール表記をするならこの下に処理を記載 + } + } + + @Override + public void onFailure(Call call, Throwable t) { + System.out.println("NetWorkError"+t); + //もしコンソール表記をするならこの下に処理を記載 + } + }); + } + + //通信Ver3 + //色変更 + public void changeColor(String accountId, String accountColor, String token){ + Call call =accountsRest.changeColor(accountId, accountColor, token); + call.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if(response.isSuccessful()){ + System.out.println("success"); + + }else{ + System.out.println("fail"); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + System.out.println("NetWorkError"+t); + } + }); + } + + //通信Ver4 + //アカウント名変更 + public void changeAccount(String accountId, String accountColor, String token){ + Call call =accountsRest.changeColor(accountId, accountColor, token); + call.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if(response.isSuccessful()){ + System.out.println("success"); + }else{ + System.out.println("fail"); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + System.out.println("NetWorkError"+t); + } + }); + } + +} 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 3dba52e..8e0360a 100644 --- a/app/src/main/java/com/example/citrusclient/views/CalendarFragment.java +++ b/app/src/main/java/com/example/citrusclient/views/CalendarFragment.java @@ -1,5 +1,6 @@ package com.example.citrusclient.views; +import android.app.Activity; import android.graphics.Color; import android.os.Bundle; @@ -60,9 +61,17 @@ private TableLayout tableLayout; private TableRow[] tableRows = new TableRow[6]; + private TextView curMonth; public CalendarFragment() { - // Required empty public constructor + Calendar calendar = Calendar.getInstance(); + year = calendar.get(Calendar.YEAR); //現在の年 + month = calendar.get(Calendar.MONTH) + 1; //現在の月 + } + + public CalendarFragment(int year, int month) { + this.year = year; + this.month = month; } /** @@ -236,9 +245,9 @@ booksViewModel.loadBooks(accountId, token); tableLayout = view.findViewById(R.id.calendarlayout); - Calendar calendar = Calendar.getInstance(); - year = calendar.get(Calendar.YEAR); //現在の年 - month = calendar.get(Calendar.MONTH) + 1; //現在の月 +// Calendar calendar = Calendar.getInstance(); +// year = calendar.get(Calendar.YEAR); //現在の年 +// month = calendar.get(Calendar.MONTH) + 1; //現在の月 scheduleViewModel.updateSchedulesByMonth(accountId, year, month, token); @@ -309,7 +318,6 @@ //カレンダーの初期表示 TableLayout tableLayout = view.findViewById(R.id.calendarlayout); TextView[][] days = calendar(firstDayOfWeek, prevMonthDay, lastDay); - String[][] daysString = calendarString(firstDayOfWeek, prevMonthDay, lastDay); for(int i = 0; i < 6; i++) { TableRow tableRow = (TableRow) tableLayout.getChildAt(i); for(int j = 0; j < 7; j++) { @@ -327,7 +335,26 @@ public void onClick(View view) { citrus.setCurMonth(month); citrus.setCurYear(year); + //指定した年月の一日の曜日を取得 + LocalDate firstDay = LocalDate.of(year, month, 1); + DayOfWeek dayOfWeek = firstDay.getDayOfWeek(); + int firstDayOfWeek = dayOfWeek.getValue(); + //前の月の最後の日付を取得 + LocalDate lastDate = LocalDate.of(year, month, 1); + LocalDate lastDayPrevMonth = lastDate.minusDays(1); + int prevMonthDay = lastDayPrevMonth.getDayOfMonth(); + //現在の月の最後の日付を取得 + YearMonth yearMonth = YearMonth.of(year, month); + LocalDate CurLastDay = yearMonth.atEndOfMonth(); + int lastDay = CurLastDay.getDayOfMonth(); + + String[][] daysString = calendarString(firstDayOfWeek, prevMonthDay, lastDay); citrus.setCurDay(Integer.parseInt(daysString[ii][jj])); + if(ii == 0 && Integer.parseInt(daysString[ii][jj]) > 8) { + citrus.setCurMonth(month - 1); + } else if (ii >= 4 && Integer.parseInt(daysString[ii][jj]) < 25) { + citrus.setCurMonth(month + 1); + } ((MainActivity) getActivity()).showFragment(new HomeFragment()); } }); diff --git a/app/src/main/java/com/example/citrusclient/views/CreateTodoFragment.java b/app/src/main/java/com/example/citrusclient/views/CreateTodoFragment.java index 250cbe2..2a2ea34 100644 --- a/app/src/main/java/com/example/citrusclient/views/CreateTodoFragment.java +++ b/app/src/main/java/com/example/citrusclient/views/CreateTodoFragment.java @@ -246,12 +246,16 @@ } if(isEdit){ //編集時 - todosViewModel.setTodo(accountId,editBook.getBookId() ,editTodo.getYear(),editTodo.getMonth(), - editTodo.getDay(), editTodo.getTodoId(), title,spinner.getSelectedItemPosition(), year, month, day, token); + //編集前のTodoは削除 + todosViewModel.deleteTodo(accountId,editBook.getBookId(),editTodo.getYear(), + editTodo.getMonth(),editTodo.getDay(), editTodo.getTodoId(), token); + //編集後の年月日にTodoを追加 + todosViewModel.createTodo(accountId,spinner.getSelectedItemPosition(),year,month,day,title,token); + ((MainActivity)getActivity()).backFragment(); }else{ //追加時 - todosViewModel.createTodo(accountId,spinner.getSelectedItemPosition(),year,month,day,title,token); + todosViewModel.createTodo(accountId,spinner.getSelectedItemPosition(),year,month,day,title ,token); ((MainActivity)getActivity()).backFragment(); } diff --git a/app/src/main/java/com/example/citrusclient/views/HomeFragment.java b/app/src/main/java/com/example/citrusclient/views/HomeFragment.java index f7526c1..1e709ad 100644 --- a/app/src/main/java/com/example/citrusclient/views/HomeFragment.java +++ b/app/src/main/java/com/example/citrusclient/views/HomeFragment.java @@ -139,11 +139,10 @@ 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(); - + System.out.println(token); curDate = LocalDate.of(year, month, day); todoList = new ArrayList<>(); @@ -157,16 +156,20 @@ todoRecyclerView.setHasFixedSize(true); RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(view.getContext()); todoRecyclerView.setLayoutManager(layoutManager); - MyTodoshelfAdapter todoAdapter = new MyTodoshelfAdapter(todoList, integerBookHashMap, todosViewModel, citrus, getActivity()); + MyTodoshelfAdapter todoAdapter = new MyTodoshelfAdapter(todoList, integerBookHashMap, todosViewModel, getActivity()); todoRecyclerView.setAdapter(todoAdapter); RecyclerView scheduleRecyclerView = view.findViewById(R.id.my_schedule_list); scheduleRecyclerView.setHasFixedSize(true); RecyclerView.LayoutManager scheduleLayoutManager = new LinearLayoutManager(view.getContext()); scheduleRecyclerView.setLayoutManager(scheduleLayoutManager); - MyScheduleshelfAdapter scheduleAdapter = new MyScheduleshelfAdapter(scheduleList, integerBookHashMap); + MyScheduleshelfAdapter scheduleAdapter = new MyScheduleshelfAdapter(scheduleList, integerBookHashMap, curDate, getActivity()); scheduleRecyclerView.setAdapter(scheduleAdapter); + Button dateButton = view.findViewById(R.id.date_button); + dateButton.setOnClickListener(v -> { + ((MainActivity) getActivity()).showFragment(new CalendarFragment(year, month)); + }); FloatingActionButton todoAddButton = view.findViewById(R.id.todo_add_button); todoAddButton.setOnClickListener(v -> { @@ -175,7 +178,7 @@ FloatingActionButton scheduleAddButton = view.findViewById(R.id.schedule_add_button); scheduleAddButton.setOnClickListener(v -> { - ((MainActivity) getActivity()).showFragment(new CreateScheduleFragment()); + ((MainActivity) getActivity()).showFragment(new CreateScheduleFragment(year, month ,day)); }); ImageButton prevBotton = view.findViewById(R.id.prev_day_botton); @@ -197,6 +200,7 @@ day = curDate.getDayOfMonth(); curDateButton.setText(year + "年" + month + "月" + day + "日"); updateTodoSchedule(integerBookHashMap); + }); @@ -218,13 +222,12 @@ for(Todo todo : idTodoHashMap.values()){ if(!todo.containsTodo(todoList)){ todoList.add(todo); - todoAdapter.setTodos(todoList, integerBookHashMap); } } + todoAdapter.setTodos(todoList, integerBookHashMap); } else { todoAdapter.setTodos(todoList, integerBookHashMap); } - todoAdapter.notifyDataSetChanged(); } }); @@ -238,7 +241,6 @@ scheduleList = new ArrayList<>(); scheduleAdapter.setSchedules(scheduleList, integerBookHashMap); } - scheduleAdapter.notifyDataSetChanged(); } }); @@ -286,17 +288,10 @@ private List todoList; private HashMap idBookHashMap; private TodosViewModel todosViewModel; - private Citrus citrus; - private String accountId; - private String token; private Context context; - - MyTodoshelfAdapter(List todos, HashMap idBookHashMap, TodosViewModel todosViewModel, Citrus citrus, Context context) { - this.citrus = citrus; - this.token = citrus.getToken(); - this.accountId = citrus.getAccountId(); + MyTodoshelfAdapter(List todos, HashMap idBookHashMap, TodosViewModel todosViewModel, Context context) { this.todoList = todos; this.todosViewModel = todosViewModel; if (idBookHashMap != null) { @@ -316,7 +311,6 @@ } sortTodosById(); - notifyDataSetChanged(); } @@ -329,6 +323,11 @@ @Override public void onBindViewHolder(@NonNull MyTodoViewHolder holder, int position) { + Activity activity = (Activity) context; + Citrus citrus = (Citrus)(activity.getApplication()); + String token = citrus.getToken(); + String accountId = citrus.getAccountId(); + Todo todoData = this.todoList.get(position); holder.todoButton.setText(todoData.getTitle()); holder.todoCheckBox.setChecked(todoData.getCheck()); @@ -342,9 +341,7 @@ } holder.todoButton.setOnClickListener(v -> { - Activity activity = (Activity) context; ((MainActivity) activity).showFragment(new CreateTodoFragment(todoData, book)); - notifyDataSetChanged(); }); holder.todoCheckBox.setOnCheckedChangeListener((buttonView, isChecked) -> { @@ -376,7 +373,6 @@ return Integer.compare(todo1.getTodoId(), todo2.getTodoId()); // 同じbookIdの場合、todoIdで比較 } }); - notifyDataSetChanged(); // データ変更をアダプタに通知 } @@ -395,14 +391,19 @@ private List scheduleList; private HashMap idBookHashMap; + private Context context; + private LocalDate curDate; - MyScheduleshelfAdapter(List schedules, HashMap idBookHashMap) { + MyScheduleshelfAdapter(List schedules, HashMap idBookHashMap, LocalDate curDate, Context context) { this.scheduleList = schedules; if (idBookHashMap != null) { this.idBookHashMap = new HashMap<>(idBookHashMap); } else { this.idBookHashMap = new HashMap<>(); // 空のHashMapを作成 - } } + } + this.curDate = curDate; + this.context = context; + } public void setSchedules(List schedules, HashMap idBookHashMap) { scheduleList = schedules; @@ -424,12 +425,14 @@ @Override public void onBindViewHolder(@NonNull MyScheduleViewHolder holder, int position) { + Activity activity = (Activity) context; + int red = 169; int green = 169; int blue = 169; Schedule scheduleData = this.scheduleList.get(position); holder.scheduleButton.setText(scheduleData.getTitle()); - holder.scheduleButton.setText(scheduleData.getTitle() + "\n" + extractionTime(scheduleData.getStartTime()) + " ~ " + extractionTime(scheduleData.getEndTime())); + holder.scheduleButton.setText(scheduleData.getTitle() + "\n" + extractionTime(scheduleData.getStartTime(), curDate) + " ~ " + extractionTime(scheduleData.getEndTime(), curDate)); Book book = idBookHashMap.get(scheduleData.getBookId()); if(book != null) { red = Integer.parseInt(book.getColor().substring(1, 3), 16); @@ -439,8 +442,13 @@ holder.scheduleButton.setBackgroundColor(Color.rgb(red, green, blue)); holder.scheduleButton.setTextColor(Color.rgb(255 - red, 255 - green, 255 - blue)); + holder.scheduleButton.setOnClickListener(v -> { + ((MainActivity) activity).showFragment(new CreateScheduleFragment(scheduleData, book)); + }); } + + private void sortScheduleByTime() { Collections.sort(scheduleList, new Comparator() { @Override @@ -460,7 +468,6 @@ // StringをLocalDateTimeに変換 LocalDateTime dateTime = LocalDateTime.parse(scheduleTime, formatter); - System.out.println(dateTime); // 年、月、日、時、分を抽出 long year = dateTime.getYear(); @@ -468,11 +475,9 @@ long day = dateTime.getDayOfMonth(); long hour = dateTime.getHour(); long minute = dateTime.getMinute(); - System.out.println(year); // 必要に応じて整数を組み合わせる(例: YYYYMMDDHHMM) long result = year *100000000 +month * 1000000 + day * 10000 + hour * 100 + minute; - System.out.println(result); return result; } catch (DateTimeParseException e) { @@ -481,10 +486,28 @@ } } - private static String extractionTime(String scheduleTime) { - return scheduleTime.substring(scheduleTime.length() - 5); + private static String extractionTime(String scheduleTime, LocalDate curDate) { + int year = curDate.getYear(); + int month = curDate.getMonthValue(); + int day = curDate.getDayOfMonth(); + long yearMonthDay = year * 10000 + month * 100 + day; + long scheduleYMD = convertTimeInteger(scheduleTime) / 10000; +// long scheduleYearMonth = extractUpperDigits(convertTimeInteger(scheduleTime), 8); + if(yearMonthDay > scheduleYMD) { + return "00:00"; + } else if(yearMonthDay < scheduleYMD) { + return "23:59"; + } else { + return scheduleTime.substring(scheduleTime.length() - 5); + } } +// public static long extractUpperDigits(long number, int digitCount) { +// // 10の累乗を計算 +// long divisor = (long) Math.pow(10, String.valueOf(number).length() - digitCount); +// return number / divisor; // 上位の桁を抽出 +// } + @Override public int getItemCount() { return scheduleList.size(); 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 371c2d0..9e9b32e 100644 --- a/app/src/main/java/com/example/citrusclient/views/MainActivity.java +++ b/app/src/main/java/com/example/citrusclient/views/MainActivity.java @@ -81,7 +81,8 @@ showFragment(new HomeFragment()); }else if(itemId == R.id.calendar){ //カレンダ showFragment(new CalendarFragment()); - }else if(itemId == R.id.face){//マイページ + }else if(itemId == R.id.face){//マイページ//設定画面 + showFragment(new SettingsFragment()); } return true; } diff --git a/app/src/main/java/com/example/citrusclient/views/MyAdapter.java b/app/src/main/java/com/example/citrusclient/views/MyAdapter.java new file mode 100644 index 0000000..2811bd6 --- /dev/null +++ b/app/src/main/java/com/example/citrusclient/views/MyAdapter.java @@ -0,0 +1,194 @@ +//package com.example.citrusclient.views; +// +//import android.view.LayoutInflater; +//import android.view.View; +//import android.view.ViewGroup; +//import android.widget.TextView; +// +//import androidx.recyclerview.widget.RecyclerView; +// +//import com.example.citrusclient.R; +//import com.example.citrusclient.models.Book; +// +//import java.util.ArrayList; +//import java.util.List; +// +//public class MyAdapter extends RecyclerView.Adapter { +// private List originalList; // 元のデータリスト +// private List filteredList; +// +// public MyAdapter(List originalList) { +// this.originalList = originalList; +// this.filteredList = new ArrayList<>(originalList); +// } +// +// @Override +// public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { +// View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.a_public_book, parent, false); +// return new ViewHolder(view); +// } +// +// @Override +// public void onBindViewHolder(ViewHolder holder, int position) { +// Book currentBook = filteredList.get(position); +// holder.bind(currentBook); +// } +// +// @Override +// public int getItemCount() { +// return filteredList.size(); +// } +// +// public void filter(String query) { +// filteredList.clear(); +// if (query.isEmpty()) { +// filteredList.addAll(originalList); +// } else { +// String[] queryWords = query.toLowerCase().trim().split("\\s+"); +// for (Book item : originalList) { +// boolean matchesAll = true; +// for (String word : queryWords) { +// if (!item.getAccountId().toLowerCase().contains(word)) { +// matchesAll = false; +// break; +// } +// } +// if (matchesAll) { +// filteredList.add(item); +// } +// } +// } +// notifyDataSetChanged(); +// } +// +// public void setBooks(ArrayList publicList) { +// } +// +// static class ViewHolder extends RecyclerView.ViewHolder { +// TextView titleTextView; +// TextView authorTextView; +// +// ViewHolder(View itemView) { +// super(itemView); +// titleTextView = itemView.findViewById(R.id.public_button); +// authorTextView = itemView.findViewById(R.id.public_id); +// } +// +// void bind(Book book) { +// titleTextView.setText(book.getTitle()); +// authorTextView.setText(book.getAccountId()); +// } +// } +//} + +package com.example.citrusclient.views; + +import android.graphics.Color; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.example.citrusclient.R; +import com.example.citrusclient.models.Book; + +import java.util.ArrayList; +import java.util.List; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +public class MyAdapter extends RecyclerView.Adapter { + private List originalList; // 元のデータリスト + private List filteredList; // フィルタリングされたリスト + private Object context; + +// private List publicList; +// private List accountIdList; +// private Context context; + + public MyAdapter(List originalList) { + this.originalList = originalList; + this.filteredList = new ArrayList<>(originalList); + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.a_public_book, parent, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + Book currentBook = filteredList.get(position); + holder.bind(currentBook); // bindメソッドで設定 + + // 背景色の設定 + int red, green, blue; + if (currentBook.getColor() == null || currentBook.getColor().length() < 7) { + red = 255; green = 255; blue = 255; + } else { + red = Integer.parseInt(currentBook.getColor().substring(1, 3), 16); + green = Integer.parseInt(currentBook.getColor().substring(3, 5), 16); + blue = Integer.parseInt(currentBook.getColor().substring(5, 7), 16); + } + holder.titleTextView.setBackgroundColor(Color.rgb(red, green, blue)); + holder.titleTextView.setTextColor(Color.rgb(255 - red, 255 - green, 255 - blue)); +// holder.titleTextView.setOnClickListener(v -> { +// Activity activity = (Activity) context; +// Citrus citrus = (Citrus) activity.getApplication(); +// citrus.setCurLookingAccountId(currentBook.getAccountId()); +// citrus.setCurLookingBookId(currentBook.getBookId()); +// ((MainActivity) activity).showFragment(new HomeFragment()); +// }); + } + + @Override + public int getItemCount() { + return filteredList.size(); + } + + // 新しいデータを設定するメソッド + public void setBooks(List books) { + originalList.clear(); + originalList.addAll(books); + filteredList.clear(); // フィルタリングされたリストもクリア + filteredList.addAll(originalList); // 元のリストの内容を追加 + notifyDataSetChanged(); // アダプターを更新 + } + + // フィルタリングメソッド + public void filter(String query) { + filteredList.clear(); + if (query.isEmpty()) { + filteredList.addAll(originalList); + } else { + String lowerCaseQuery = query.toLowerCase().trim(); + for (Book item : originalList) { + if (item.getAccountId().toLowerCase().contains(lowerCaseQuery) || + item.getTitle().toLowerCase().contains(lowerCaseQuery)) { + filteredList.add(item); + } + } + } + notifyDataSetChanged(); + } + + static class ViewHolder extends RecyclerView.ViewHolder { + TextView titleTextView; + TextView authorTextView; + + ViewHolder(View itemView) { + super(itemView); + titleTextView = itemView.findViewById(R.id.public_button); + authorTextView = itemView.findViewById(R.id.public_id); + + } + + void bind(Book book) { + titleTextView.setText(book.getTitle()); + authorTextView.setText(book.getAccountId()); + } + } +} diff --git a/app/src/main/java/com/example/citrusclient/views/SearchFragment.java b/app/src/main/java/com/example/citrusclient/views/SearchFragment.java index 41509ac..dddb7e8 100644 --- a/app/src/main/java/com/example/citrusclient/views/SearchFragment.java +++ b/app/src/main/java/com/example/citrusclient/views/SearchFragment.java @@ -1,11 +1,13 @@ package com.example.citrusclient.views; +import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.graphics.Color; import android.os.Bundle; import androidx.annotation.NonNull; +import androidx.core.view.MenuItemCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; import androidx.lifecycle.Observer; @@ -13,11 +15,16 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import android.text.Editable; +import android.util.Log; import android.view.LayoutInflater; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.Button; +import android.widget.EditText; import android.widget.LinearLayout; +import android.widget.SearchView; import android.widget.TextView; import com.example.citrusclient.Citrus; @@ -49,6 +56,18 @@ // Required empty public constructor } + private static final String TAG = SearchFragment.class.getSimpleName(); + private final SearchFragment self = this; + + private SearchView searchView; + private String searchWord; + + private Integer sortBy = 0; + + EditText editText; + + private MyAdapter adapter; + /** * Use this factory method to create a new instance of * this fragment using the provided parameters. @@ -89,37 +108,79 @@ return inflater.inflate(R.layout.fragment_search, container, false); } + @SuppressLint("WrongViewCast") public void onViewCreated(@NonNull View view, @NonNull Bundle saveInstanceState){ super.onViewCreated(view, saveInstanceState); -// LinearLayout layout = new LinearLayout(requireContext()); -// Citrus citrus = (Citrus)(getActivity().getApplication()); - publicList = new ArrayList<>(); - name = new ArrayList<>(); - + adapter = new MyAdapter(new ArrayList<>()); RecyclerView recyclerView = view.findViewById(R.id.public_list); - recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(new LinearLayoutManager(view.getContext())); - RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(view.getContext()); - recyclerView.setLayoutManager(layoutManager); - PublicAdapter publicAdapter = new PublicAdapter(name, publicList, getActivity()); - recyclerView.setAdapter(publicAdapter); + recyclerView.setAdapter(adapter); +// RecyclerView recyclerView1 = view.findViewById(R.id.sort_by); +// recyclerView1.setLayoutManager(new LinearLayoutManager(view.getContext())); +// recyclerView1.setAdapter(adapter); + publicBooksViewModel.getAllBooksLiveData().observe(getViewLifecycleOwner(), new Observer>() { @Override public void onChanged(ArrayList books) { - if(books != null){ - for(int i = 0; i < books.size(); i++){ - name.add(books.get(i).getAccountId()); - } + if (books != null) { publicList = new ArrayList<>(books); - }else{ - publicList = new ArrayList<>(); + adapter.setBooks(publicList); // アダプターに新しいリストを渡す } - publicAdapter.setBooks(publicList); - System.out.println(name); } }); + publicBooksViewModel.loadAllBooks(); + + SearchView searchView = view.findViewById(R.id.search_word); + searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { + @Override + public boolean onQueryTextSubmit(String query) { + loadSearchResults(query); + Log.d(TAG, "Search query: " + query); + return true; + } + + @Override +// public boolean onQueryTextChange(String newText) { +// //adapter.filter(newText); // フィルタリングを実行 +// loadSearchResults(newText); +// System.out.println("ahe"); +// return true; +//} + public boolean onQueryTextChange(String newText) { + adapter.filter(newText); // フィルタリングを実行 + return true; + } + + }); + } + + private void loadSearchResults(String query) { + // 空白で分割 + String[] parts = query.split(" "); + String title = parts.length > 0 ? parts[0] : ""; // 最初の部分をtitleに + String accountId = parts.length > 1 ? parts[1] : ""; // 2番目の部分をaccountIdに + Integer sortBy = 1; + //if(sortBy != null) sortBy = sort;//ソートはまだ + Log.d(TAG, "Search query: " + title + accountId); + + if(title != null) { + if (accountId != null) { + publicBooksViewModel.loadSearchBooks(title, accountId, sortBy);//title,accountidでの検索 + if(accountId == null)accountId = "null"; + if(accountId == "")accountId = "space"; + System.out.println("title: "+title+" accountId: "+accountId+" sortBy: "+sortBy); + }/* else { + publicBooksViewModel.loadSearchTitleBooks(title, sortBy);//titleのみの検索 + } + if (accountId != null) { + publicBooksViewModel.loadSearchAccountIdBooks(accountId, sortBy);//accountidでの検索 + } */else { + publicBooksViewModel.loadAllBooks(); + } + // titleとaccountIdを使って検索 + } } } @@ -154,14 +215,9 @@ holder.idText.setWidth(100); Book publicData = this.publicList.get(position); holder.publicButton.setText(publicData.getTitle()); - int red; - int green; - int blue; - if (publicData.getColor() == null) { - red = 255; - green = 255; - blue = 255; - } else if (publicData.getColor().length() < 7) { + + int red, green, blue; + if (publicData.getColor() == null || publicData.getColor().length() < 7) { red = 255; green = 255; blue = 255; @@ -201,10 +257,4 @@ idText = itemView.findViewById(R.id.public_id); } } -} - - -/*recyclerviewの中にrecyclerviewを入れよう(縦スクに横スクをいれる感じ) -linearlayoutを縦にいれる - - */ \ No newline at end of file +} \ No newline at end of file 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 4b492b3..cff9713 100644 --- a/app/src/main/java/com/example/citrusclient/views/SignUpActivity.java +++ b/app/src/main/java/com/example/citrusclient/views/SignUpActivity.java @@ -66,7 +66,6 @@ this.accountsRest = retrofit.create(AccountsRest.class); - findViewById(R.id.button_signup).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { @@ -104,6 +103,7 @@ citrus.setToken(token); citrus.setAccountId(id); + //画面遷移 handler.post(new Runnable() { @Override diff --git a/app/src/main/res/layout/fragment_search.xml b/app/src/main/res/layout/fragment_search.xml index 2b8dec3..69464fe 100644 --- a/app/src/main/res/layout/fragment_search.xml +++ b/app/src/main/res/layout/fragment_search.xml @@ -7,6 +7,7 @@ tools:context=".views.SearchFragment"> + + android:id="@+id/search_word" + android:layout_width="300dp" + android:layout_height="80dp" + android:layout_marginTop="60dp" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + android:layout_marginTop="140dp"> + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index 49f1eb1..d5faa25 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -1,6 +1,7 @@ + android:layout_width="match_parent" + android:layout_height="match_parent"> + + android:id="@+id/IdChange" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="ユーザネーム変更" + android:textColor="@color/black" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.449" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.43" /> + - + android:id="@+id/NowPassword1" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="現在のパスワード" + android:textColor="@color/black" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.151" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.494" /> + + android:id="@+id/EnterNowPassword" + android:layout_width="130dp" + android:layout_height="38dp" + android:ems="10" + android:inputType="text" + android:hint="nowpassword" + android:textColor="#80000000" + android:textSize="15sp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.697" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.487" /> + + android:id="@+id/NewUsername" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="新しいアカウント名" + android:textColor="@color/black" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.159" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.543" /> + + android:id="@+id/EnterNewUsename" + android:layout_width="130dp" + android:layout_height="41dp" + android:ems="10" + android:inputType="text" + android:hint="newusername" + android:textColor="#80000000" + android:textSize="15sp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.697" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.544" /> + + android:id="@+id/PasswordChange" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="パスワード変更" + android:textColor="@color/black" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.455" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.677" /> + + android:id="@+id/NowPassword2" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="現在のパスワード" + android:textColor="@color/black" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.144" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.735" /> + + android:id="@+id/NewPassword" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="新しいパスワード" + android:textColor="@color/black" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.151" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.79" /> + + android:id="@+id/EnterNowPassword2" + android:layout_width="130dp" + android:layout_height="wrap_content" + android:ems="10" + android:inputType="text" + android:hint="nowpassword" + android:textColor="#80000000" + android:textSize="15sp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.697" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.743" /> + + android:id="@+id/EnterNewPassword" + android:layout_width="130dp" + android:layout_height="wrap_content" + android:ems="10" + android:inputType="text" + android:hint="newpassword" + android:textColor="#80000000" + android:textSize="15sp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.697" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.802" /> + + android:id="@+id/FavoritePosts" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="いいねした投稿" + android:textColor="@color/black" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.471" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.943" /> +