Compare commits
14 Commits
feature/im
...
main
Author | SHA1 | Date | |
---|---|---|---|
4dab0f33f0 | |||
d055c5fa14 | |||
e712a84564 | |||
81dfdc1fe2 | |||
ad0ad3685b | |||
f192876b4c | |||
764beff222 | |||
21df151e65 | |||
b3bb61e43b | |||
8da7b26d72 | |||
aece6909ad | |||
bba2751704 | |||
7794d664ba | |||
bef4d02dae |
21
LICENSE
Normal file
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2024 グループワークチーム「シフトメイト」メンバー
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
36
README.md
|
@ -1,8 +1,38 @@
|
|||
# WIP
|
||||
|
||||
## メモ
|
||||
~~## メモ
|
||||
- リリース前(=提出前)には`DEBUG_ONLY`で検索してチェック(念のため)
|
||||
|
||||
## リリース前チェック
|
||||
- DBの破壊的マイグレーションを許可するオプションを無効に
|
||||
-
|
||||
- DBの破壊的マイグレーションを許可するオプションを無効に~~
|
||||
|
||||
#### 補足
|
||||
- カレンダーはCompactCalendarViewをそのまま使用する予定でしたが,AndroidX環境で使用するとクラス重複でビルドできないため,AndroidXに対応させるPRを取り込んだ物を専用Mavenリポジトリとして公開して使用しています
|
||||
- https://github.com/r-ca/CompactCalendarView
|
||||
|
||||
## 補足
|
||||
- 直前に大規模リファクタリングを始めていたため,未使用コード(ファイル)がいくつか残っています
|
||||
- `:feature:setting`, `:feature:parent` は廃止されており, 現在は使用されていません
|
||||
- `:feature:child` は子供管理画面のアクティビティのみ使用されています
|
||||
|
||||
- 親, 子供のタスク一覧画面はどちらも`:feature:common`の`CommonHomeFragment`を用いており, ナビゲーショングラフを切り替えることで表示モードを切り替えています
|
||||
|
||||
## 既知の問題
|
||||
- 初回起動時, ウォレットの表示に失敗する場合がある
|
||||
- 特定の操作を行った場合にナビゲーションが正常に動作しなくなる場合がある
|
||||
- 特定の状況で子供モード時に追加ウィンドウが開けてしまう場合がある(APIの権限チェックではじかれるため, 実際に追加することは不可能)
|
||||
- カレンダーの表示を切り替える際, RecyclerViewのアニメーションが一定範囲にしか反映されない
|
||||
- お手伝い履歴がローカルキャッシュされておらず,毎回サーバーから全データを取得している
|
||||
- ウォレット画面でPull-to-Refreshが動作しない
|
||||
- ウォレット画面にて非UIスレッドでUI更新を行ってしまっている?
|
||||
- オフライン時,ウォレットなど一部の画面でクラッシュする場合がある
|
||||
- 資格情報が間違ったままログインできてしまう
|
||||
- キャッシュとサーバーのマスターデータに差異があった場合, 再表示しないと表示に適応されない場合がある(コールバックの処理が適切に実装されていない画面がある)
|
||||
|
||||
## TODO
|
||||
- 全体的なUX改善
|
||||
- インメモリデータベースの活用(Related: 全体的なUX改善)
|
||||
- ViewModelの本格導入
|
||||
- タスクのアサイン機能への対応
|
||||
- 親モードで子供画面を表示したとき, 親モードへの移動にロックをかけられるようにする
|
||||
- 非DynamicColor機種で使用されるテーマの適用が中途半端なので完全に適用するように
|
BIN
app/src/main/ic_launcher-playstore.png
Normal file
After Width: | Height: | Size: 9.3 KiB |
|
@ -1,30 +1,15 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:aapt="http://schemas.android.com/aapt"
|
||||
android:width="108dp"
|
||||
android:height="108dp"
|
||||
android:viewportWidth="108"
|
||||
android:viewportHeight="108">
|
||||
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="85.84757"
|
||||
android:endY="92.4963"
|
||||
android:startX="42.9492"
|
||||
android:startY="49.59793"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#44000000"
|
||||
android:offset="0.0" />
|
||||
<item
|
||||
android:color="#00000000"
|
||||
android:offset="1.0" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24"
|
||||
android:tint="#333333">
|
||||
<group android:scaleX="0.435"
|
||||
android:scaleY="0.435"
|
||||
android:translateX="6.78"
|
||||
android:translateY="6.78">
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:fillType="nonZero"
|
||||
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
|
||||
android:strokeWidth="1"
|
||||
android:strokeColor="#00000000" />
|
||||
</vector>
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M22,8c0,-0.55 -0.45,-1 -1,-1h-7c-0.55,0 -1,0.45 -1,1s0.45,1 1,1h7C21.55,9 22,8.55 22,8zM13,16c0,0.55 0.45,1 1,1h7c0.55,0 1,-0.45 1,-1c0,-0.55 -0.45,-1 -1,-1h-7C13.45,15 13,15.45 13,16zM10.47,4.63c0.39,0.39 0.39,1.02 0,1.41l-4.23,4.25c-0.39,0.39 -1.02,0.39 -1.42,0L2.7,8.16c-0.39,-0.39 -0.39,-1.02 0,-1.41c0.39,-0.39 1.02,-0.39 1.41,0l1.42,1.42l3.54,-3.54C9.45,4.25 10.09,4.25 10.47,4.63zM10.48,12.64c0.39,0.39 0.39,1.02 0,1.41l-4.23,4.25c-0.39,0.39 -1.02,0.39 -1.42,0L2.7,16.16c-0.39,-0.39 -0.39,-1.02 0,-1.41s1.02,-0.39 1.41,0l1.42,1.42l3.54,-3.54C9.45,12.25 10.09,12.25 10.48,12.64L10.48,12.64z"/>
|
||||
</group>
|
||||
</vector>
|
||||
|
|
5
app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
Normal file
|
@ -0,0 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@color/ic_launcher_background"/>
|
||||
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
|
||||
</adaptive-icon>
|
5
app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
Normal file
|
@ -0,0 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@color/ic_launcher_background"/>
|
||||
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
|
||||
</adaptive-icon>
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 936 B |
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 982 B After Width: | Height: | Size: 716 B |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 6.8 KiB |
4
app/src/main/res/values/ic_launcher_background.xml
Normal file
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="ic_launcher_background">#F1DEDE</color>
|
||||
</resources>
|
|
@ -24,6 +24,8 @@ import android.view.animation.AnimationUtils;
|
|||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.ImageButton;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.ScrollView;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
|
@ -46,6 +48,7 @@ import one.nem.kidshift.data.TaskData;
|
|||
import one.nem.kidshift.data.UserSettings;
|
||||
import one.nem.kidshift.feature.common.adapter.ChildListItemAdapter;
|
||||
import one.nem.kidshift.feature.common.adapter.TaskListItemAdapter;
|
||||
import one.nem.kidshift.model.HistoryModel;
|
||||
import one.nem.kidshift.model.callback.TaskItemModelCallback;
|
||||
import one.nem.kidshift.model.tasks.TaskItemModel;
|
||||
import one.nem.kidshift.utils.FabManager;
|
||||
|
@ -377,7 +380,7 @@ public class CommonHomeFragment extends Fragment {
|
|||
private CompletableFuture<Void> updateCalender() {
|
||||
return rewardData.getRewardHistoryList().thenAccept(historyModels -> {
|
||||
historyModels.forEach(historyModel -> {
|
||||
compactCalendarView.addEvent(new Event(Color.RED, historyModel.getRegisteredAt().getTime(), historyModel.getTaskName())); // debug
|
||||
compactCalendarView.addEvent(new Event(Color.RED, historyModel.getRegisteredAt().getTime(), historyModel)); // debug
|
||||
});
|
||||
});
|
||||
}
|
||||
|
@ -387,10 +390,25 @@ public class CommonHomeFragment extends Fragment {
|
|||
@Override
|
||||
public void onDayClick(Date date) { // Test
|
||||
List<Event> events = compactCalendarView.getEvents(date);
|
||||
|
||||
ScrollView scrollView = new ScrollView(requireContext());
|
||||
LinearLayout linearLayout = new LinearLayout(requireContext());
|
||||
linearLayout.setOrientation(LinearLayout.VERTICAL);
|
||||
linearLayout.setPadding(96, 24, 96, 24);
|
||||
scrollView.addView(linearLayout);
|
||||
|
||||
events.forEach(event -> {
|
||||
TextView textView = new TextView(requireContext());
|
||||
textView.setText(((HistoryModel) event.getData()).getTaskName() + " @ " + ((HistoryModel) event.getData()).getChildId());
|
||||
textView.setPadding(0, 0, 0, 24);
|
||||
linearLayout.addView(textView);
|
||||
});
|
||||
|
||||
new MaterialAlertDialogBuilder(requireContext())
|
||||
.setTitle(date.toString())
|
||||
.setMessage(events.toString())
|
||||
.setPositiveButton("OK", (dialog, which) -> dialog.dismiss())
|
||||
.setTitle("タスク一覧 (DEBUG)")
|
||||
.setMessage(events.size() + "件のタスクが登録されています")
|
||||
.setView(scrollView)
|
||||
.setNeutralButton("閉じる", (dialog, which) -> dialog.dismiss())
|
||||
.show();
|
||||
}
|
||||
|
||||
|
|
|
@ -181,9 +181,9 @@ public class HistoryItemListAdapter extends RecyclerView.Adapter<HistoryItemList
|
|||
}
|
||||
});
|
||||
if (holder instanceof MonthHeaderViewHolder) {
|
||||
// ((MonthHeaderViewHolder) holder).monthHeaderTextView.setText(historyData.getRegisteredAt().getMonth() + "月");
|
||||
// DEBUG: 月をまたぐデータがないので
|
||||
((MonthHeaderViewHolder) holder).monthHeaderTitle.setText(historyData.getRegisteredAt().getDate() + "日");
|
||||
((MonthHeaderViewHolder) holder).monthHeaderTitle.setText(historyData.getRegisteredAt().getMonth() + 1 + "月");
|
||||
// // DEBUG: 月をまたぐデータがないので
|
||||
// ((MonthHeaderViewHolder) holder).monthHeaderTitle.setText(historyData.getRegisteredAt().getDate() + "日");
|
||||
((MonthHeaderViewHolder) holder).monthTotalTextView.setText(getMonthTotal(historyData) + "円");
|
||||
((MonthHeaderViewHolder) holder).checkAllButton.setOnClickListener(v -> {
|
||||
Toast.makeText(v.getContext(), "実装中", Toast.LENGTH_SHORT).show();
|
||||
|
@ -198,9 +198,9 @@ public class HistoryItemListAdapter extends RecyclerView.Adapter<HistoryItemList
|
|||
} else {
|
||||
HistoryModel previousHistoryModel = historyDataList.getList().get(historyDataList.getList().indexOf(historyModel) - 1);
|
||||
// getMonth()はDeprecated TODO: やめる
|
||||
// return historyModel.getRegisteredAt().getMonth() != previousHistoryModel.getRegisteredAt().getMonth();
|
||||
return historyModel.getRegisteredAt().getMonth() != previousHistoryModel.getRegisteredAt().getMonth();
|
||||
// DEBUG: 月をまたぐデータがないので
|
||||
return historyModel.getRegisteredAt().getDate() != previousHistoryModel.getRegisteredAt().getDate();
|
||||
// return historyModel.getRegisteredAt().getDate() != previousHistoryModel.getRegisteredAt().getDate();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -15,6 +15,7 @@ import one.nem.kidshift.data.UserSettings;
|
|||
import one.nem.kidshift.model.HistoryModel;
|
||||
import one.nem.kidshift.utils.FabManager;
|
||||
import one.nem.kidshift.utils.KSLogger;
|
||||
import one.nem.kidshift.utils.RecyclerViewAnimUtils;
|
||||
import one.nem.kidshift.utils.ToolBarManager;
|
||||
import one.nem.kidshift.utils.factory.KSLoggerFactory;
|
||||
import one.nem.kidshift.utils.models.FabEventCallback;
|
||||
|
@ -39,6 +40,8 @@ public class WalletContentFragment extends Fragment {
|
|||
|
||||
@Inject
|
||||
UserSettings userSettings;
|
||||
@Inject
|
||||
RecyclerViewAnimUtils recyclerViewAnimUtils;
|
||||
|
||||
private KSLogger logger;
|
||||
private String childId;
|
||||
|
@ -98,10 +101,13 @@ public class WalletContentFragment extends Fragment {
|
|||
});
|
||||
|
||||
RecyclerView historyItemRecyclerView = view.findViewById(R.id.historyItemRecyclerView);
|
||||
recyclerViewAnimUtils.setSlideUpAnimation(historyItemRecyclerView);
|
||||
historyItemListAdapter = new HistoryItemListAdapter();
|
||||
historyItemRecyclerView.setAdapter(historyItemListAdapter);
|
||||
historyItemRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
|
||||
|
||||
historyItemListAdapter.setHideCheckBox(userSettings.getAppCommonSetting().isChildMode());
|
||||
|
||||
historyItemListAdapter.setCallback(() -> {
|
||||
if (historyItemListAdapter.hasChecked()) {
|
||||
fabManager.show();
|
||||
|
@ -152,7 +158,7 @@ public class WalletContentFragment extends Fragment {
|
|||
// totalRewardTextView.setText(String.valueOf(historyList.stream().mapToInt(HistoryModel::getReward).sum()) + "円");
|
||||
requireActivity().runOnUiThread(() -> {
|
||||
historyItemListAdapter.notifyDataSetChanged();
|
||||
totalRewardTextView.setText(String.valueOf(historyList.stream().filter(HistoryModel::isPaid).mapToInt(HistoryModel::getReward).sum()) + "円");
|
||||
totalRewardTextView.setText(String.valueOf(historyList.stream().filter(item -> !item.isPaid()).mapToInt(HistoryModel::getReward).sum()) + "円");
|
||||
});
|
||||
}).thenRun(() -> {
|
||||
requireActivity().runOnUiThread(() -> {
|
||||
|
|