mirror of
https://github.com/lacerta-doc/Lacerta.git
synced 2026-11-07 19:47:36 +00:00
Compare commits
235
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f392991988 | ||
|
|
556c7d0841 | ||
|
|
d43bcf09b2 | ||
|
|
6120427400 | ||
|
|
2b087a4c45 | ||
|
|
457e58264b | ||
|
|
4d5d02c794 | ||
|
|
b8f3b016b7 | ||
|
|
b6307f67ce | ||
|
|
1e8dec3021 | ||
|
|
86d290b217 | ||
|
|
02d26f864d | ||
|
|
5aa6c975da | ||
|
|
7075fc710d | ||
|
|
ba0cb871a4 | ||
|
|
95a2a44cb1 | ||
|
|
fd65b17921 | ||
|
|
a3f469b466 | ||
|
|
e86129295a | ||
|
|
f4c46fbd5d | ||
|
|
439b76f8bf | ||
|
|
ffd455c6d8 | ||
|
|
29c3fddd14 | ||
|
|
516a55e4e0 | ||
|
|
68e4d0639a | ||
|
|
db26e639e6 | ||
|
|
32cd27997c | ||
|
|
6fb8091754 | ||
|
|
0d7d47ea10 | ||
|
|
3d544fa423 | ||
|
|
487451712e | ||
|
|
e78718ab79 | ||
|
|
35c58e14ad | ||
|
|
4efad853f7 | ||
|
|
6c22050906 | ||
|
|
17dc90162b | ||
|
|
72933fd45b | ||
|
|
c8c0e37052 | ||
|
|
7b6d8e3a18 | ||
|
|
6167c412c7 | ||
|
|
226f09f8bb | ||
|
|
0c4ba99a07 | ||
|
|
097adebd9b | ||
|
|
03a75a5b29 | ||
|
|
0c6e2b1a98 | ||
|
|
a7b92120ba | ||
|
|
3f78dccf3b | ||
|
|
c6ddd6fd03 | ||
|
|
eab00983a8 | ||
|
|
038c526652 | ||
|
|
704c128801 | ||
|
|
209eab0755 | ||
|
|
65d48d03fd | ||
|
|
dcd5f1b650 | ||
|
|
a74eb821f8 | ||
|
|
738d8a055c | ||
|
|
2e5559df88 | ||
|
|
dc1cc429e9 | ||
|
|
339566b243 | ||
|
|
0e1d4703e5 | ||
|
|
bcaa0e5c5c | ||
|
|
cbc1d139af | ||
|
|
ef48223d46 | ||
|
|
81ba96a3d0 | ||
|
|
80104a2285 | ||
|
|
b9973b845f | ||
|
|
a325ace6f3 | ||
|
|
7a2beececc | ||
|
|
4b5ce622fd | ||
|
|
5d8b9f338d | ||
|
|
9d2e5dd217 | ||
|
|
9ad6a6291d | ||
|
|
4235030986 | ||
|
|
c60fedeb87 | ||
|
|
2f18134581 | ||
|
|
4101f75685 | ||
|
|
184771c92d | ||
|
|
3e12f1222b | ||
|
|
29f2749cb7 | ||
|
|
244b2fb123 | ||
|
|
725d541316 | ||
|
|
fc712a131a | ||
|
|
cc7b0dc5d1 | ||
|
|
169a6c6e0a | ||
|
|
42eb3d4c80 | ||
|
|
1c87b73a5b | ||
|
|
46f119b531 | ||
|
|
def799bbe6 | ||
|
|
defc051436 | ||
|
|
de9b68de87 | ||
|
|
802e4cc75a | ||
|
|
abc91b79ee | ||
|
|
b601b28f81 | ||
|
|
853ac1eca3 | ||
|
|
834bc35318 | ||
|
|
1e3a3262a4 | ||
|
|
475c511d32 | ||
|
|
474d6417c9 | ||
|
|
c7e141b892 | ||
|
|
3d2cc5ac05 | ||
|
|
73c310ee01 | ||
|
|
5c3d811979 | ||
|
|
f5bc740f58 | ||
|
|
8a57331d32 | ||
|
|
abdca108d4 | ||
|
|
8b66646e7d | ||
|
|
c9160a2df0 | ||
|
|
c5b0a33720 | ||
|
|
13f31017f7 | ||
|
|
e6778e6214 | ||
|
|
71f9be77cd | ||
|
|
e0d63122bd | ||
|
|
1c3fdf921d | ||
|
|
d07e63f534 | ||
|
|
5160411c76 | ||
|
|
20d30e338e | ||
|
|
3be6185c21 | ||
|
|
c82952f397 | ||
|
|
8c9dc14f16 | ||
|
|
d22644e37a | ||
|
|
c80576d046 | ||
|
|
b7cb4369d1 | ||
|
|
2cfab24c76 | ||
|
|
55b34d964c | ||
|
|
744a2bef65 | ||
|
|
74becab37b | ||
|
|
58d6ae17c6 | ||
|
|
dea5f240f0 | ||
|
|
119771a7f9 | ||
|
|
b6a30d5cbf | ||
|
|
2ec4b96c14 | ||
|
|
151911d0b2 | ||
|
|
d832438f8f | ||
|
|
0487553f3b | ||
|
|
678c9730ef | ||
|
|
e1b43a5f22 | ||
|
|
d384347e0a | ||
|
|
8faaf1e84a | ||
|
|
a81d79a972 | ||
|
|
1e2f48e0ae | ||
|
|
be7bd6b6fc | ||
|
|
16eb6d083e | ||
|
|
4de33b9550 | ||
|
|
b4d94954b9 | ||
|
|
526ab97706 | ||
|
|
6f0af7c4eb | ||
|
|
c6d85471c6 | ||
|
|
c5d7224b40 | ||
|
|
cc62529224 | ||
|
|
2d686ce776 | ||
|
|
a61c044391 | ||
|
|
bc19dd22d8 | ||
|
|
61ed1bbf79 | ||
|
|
fd785d9334 | ||
|
|
e6ce3571bf | ||
|
|
462ea77e91 | ||
|
|
faf0971ffe | ||
|
|
3eac0cf49c | ||
|
|
680b101476 | ||
|
|
8200a03168 | ||
|
|
290795d3aa | ||
|
|
1e1f014e59 | ||
|
|
20f6333dcc | ||
|
|
d30e68b23f | ||
|
|
24e54ec0f0 | ||
|
|
d01f5b9c79 | ||
|
|
8502bcdcab | ||
|
|
7c91987c76 | ||
|
|
74aef19312 | ||
|
|
2168f67fea | ||
|
|
380e8117b8 | ||
|
|
a6aeb5480a | ||
|
|
78505c62e6 | ||
|
|
467d5ae9ee | ||
|
|
0f4b66eb37 | ||
|
|
cec7f3bb15 | ||
|
|
1137604515 | ||
|
|
091467d113 | ||
|
|
aefe5d1001 | ||
|
|
d780e57e39 | ||
|
|
35b998eebe | ||
|
|
b99efb3336 | ||
|
|
9ebf656274 | ||
|
|
84a8d0d44d | ||
|
|
5b1461ff26 | ||
|
|
57ca804b2b | ||
|
|
b81f8d5c87 | ||
|
|
e44313d418 | ||
|
|
334d1ccba2 | ||
|
|
5bf55ada0e | ||
|
|
75c0700144 | ||
|
|
dbb737d896 | ||
|
|
3045c75c45 | ||
|
|
aac94922df | ||
|
|
78ff41b3e3 | ||
|
|
e026da96fa | ||
|
|
9245981233 | ||
|
|
bc74ee605e | ||
|
|
475e378b7c | ||
|
|
6c8233536c | ||
|
|
3878c139af | ||
|
|
56a3acf36d | ||
|
|
0cab05c581 | ||
|
|
9db85bb9b3 | ||
|
|
17cb2829ce | ||
|
|
397c923cc1 | ||
|
|
94cec3432e | ||
|
|
e78ee829ce | ||
|
|
4ae2a9fe3a | ||
|
|
d6a0dbeaa2 | ||
|
|
98c3820679 | ||
|
|
de85626d66 | ||
|
|
7e20d8e443 | ||
|
|
eba02abfd4 | ||
|
|
aa7f285773 | ||
|
|
e5e1b3a2bb | ||
|
|
cd5a588545 | ||
|
|
bd5a041424 | ||
|
|
9d793c3c0a | ||
|
|
0d4f0686b7 | ||
|
|
5e6fa45fed | ||
|
|
885cd77d5b | ||
|
|
cbd7c103c5 | ||
|
|
ddd303fa88 | ||
|
|
14fbb56dcd | ||
|
|
bf01610eb5 | ||
|
|
b63e2dd862 | ||
|
|
8f0f95d8af | ||
|
|
d75ecff0e7 | ||
|
|
bc20c92d44 | ||
|
|
a5efab5838 | ||
|
|
f186064f6e | ||
|
|
59a35cbb4a | ||
|
|
a78e60416d | ||
|
|
ac5a950ce3 |
No files matched your search
Generated
+1
-1
@@ -22,10 +22,10 @@
|
|||||||
<option value="$PROJECT_DIR$/feature/library" />
|
<option value="$PROJECT_DIR$/feature/library" />
|
||||||
<option value="$PROJECT_DIR$/feature/scan" />
|
<option value="$PROJECT_DIR$/feature/scan" />
|
||||||
<option value="$PROJECT_DIR$/feature/search" />
|
<option value="$PROJECT_DIR$/feature/search" />
|
||||||
|
<option value="$PROJECT_DIR$/feature/setting" />
|
||||||
<option value="$PROJECT_DIR$/model" />
|
<option value="$PROJECT_DIR$/model" />
|
||||||
<option value="$PROJECT_DIR$/processor" />
|
<option value="$PROJECT_DIR$/processor" />
|
||||||
<option value="$PROJECT_DIR$/shared" />
|
<option value="$PROJECT_DIR$/shared" />
|
||||||
<option value="$PROJECT_DIR$/shared/icon" />
|
|
||||||
<option value="$PROJECT_DIR$/shared/ui" />
|
<option value="$PROJECT_DIR$/shared/ui" />
|
||||||
<option value="$PROJECT_DIR$/source" />
|
<option value="$PROJECT_DIR$/source" />
|
||||||
<option value="$PROJECT_DIR$/utils" />
|
<option value="$PROJECT_DIR$/utils" />
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
# 概要
|
||||||
|
<!-- PRの概要 -->
|
||||||
|
|
||||||
|
# 関連Issue
|
||||||
|
- #000 <!-- 関連するIssueを指定(なければ省略可) -->
|
||||||
|
|
||||||
|
# 詳細
|
||||||
|
<!-- 詳細 -->
|
||||||
|
|
||||||
|
# 影響箇所
|
||||||
|
<!-- 予想される影響箇所 -->
|
||||||
|
|
||||||
|
# チェック
|
||||||
|
<!-- 参考用, 全てにチェックがついている必要があるわけではありません -->
|
||||||
|
- [ ] 機能として完成している
|
||||||
|
- [ ] WIP(Work in progress: 作業中)
|
||||||
|
- [ ] 正常にビルド/起動ができる
|
||||||
|
- [ ] 既存の機能を壊していない
|
||||||
+10
-26
@@ -59,32 +59,6 @@ dependencies {
|
|||||||
androidTestImplementation libs.androidx.test.ext.junit
|
androidTestImplementation libs.androidx.test.ext.junit
|
||||||
androidTestImplementation libs.androidx.test.espresso.core
|
androidTestImplementation libs.androidx.test.espresso.core
|
||||||
|
|
||||||
// 内部モジュール
|
|
||||||
// Feature
|
|
||||||
implementation project(':feature:home')
|
|
||||||
implementation project(':feature:search')
|
|
||||||
implementation project(':feature:library')
|
|
||||||
implementation project(':feature:scan')
|
|
||||||
implementation project(':feature:debug') // デバッグメニュー
|
|
||||||
|
|
||||||
// // Component
|
|
||||||
// implementation project(':component:common')
|
|
||||||
// implementation project(':component:scanner')
|
|
||||||
// implementation project(':component:viewer')
|
|
||||||
|
|
||||||
// // Data
|
|
||||||
// implementation project(':data:repository')
|
|
||||||
//
|
|
||||||
// // Source
|
|
||||||
// implementation project(':data:source:database')
|
|
||||||
// implementation project(':data:source:preference')
|
|
||||||
//
|
|
||||||
implementation project(':data')
|
|
||||||
|
|
||||||
implementation project(':shared:ui')
|
|
||||||
|
|
||||||
implementation project(':shared:icon')
|
|
||||||
|
|
||||||
// Hilt (DI)
|
// Hilt (DI)
|
||||||
implementation libs.com.google.dagger.hilt.android
|
implementation libs.com.google.dagger.hilt.android
|
||||||
annotationProcessor libs.com.google.dagger.hilt.compiler
|
annotationProcessor libs.com.google.dagger.hilt.compiler
|
||||||
@@ -94,4 +68,14 @@ dependencies {
|
|||||||
implementation libs.navigation.ui
|
implementation libs.navigation.ui
|
||||||
implementation libs.navigation.dynamic.features.fragment
|
implementation libs.navigation.dynamic.features.fragment
|
||||||
|
|
||||||
|
// Feature
|
||||||
|
implementation project(':feature:home')
|
||||||
|
implementation project(':feature:search')
|
||||||
|
implementation project(':feature:library')
|
||||||
|
implementation project(':feature:scan')
|
||||||
|
implementation project(':feature:debug') // デバッグメニュー
|
||||||
|
implementation project(':feature:setting') // 設定画面
|
||||||
|
|
||||||
|
implementation project(':data')
|
||||||
|
implementation project(':shared:ui')
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package one.nem.lacerta;
|
package one.nem.lacerta;
|
||||||
|
|
||||||
import android.app.Application;
|
import android.app.Application;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
import com.google.android.material.color.DynamicColors;
|
import com.google.android.material.color.DynamicColors;
|
||||||
|
|
||||||
@@ -12,7 +13,13 @@ public class LacertaApplication extends Application {
|
|||||||
public void onCreate() {
|
public void onCreate() {
|
||||||
super.onCreate();
|
super.onCreate();
|
||||||
|
|
||||||
// DynamicColorを有効化
|
if (DynamicColors.isDynamicColorAvailable()) {
|
||||||
DynamicColors.applyToActivitiesIfAvailable(this);
|
Log.d("DynamicColors", "DynamicColors is available. Applying to activities...");
|
||||||
|
DynamicColors.applyToActivitiesIfAvailable(this);
|
||||||
|
} else {
|
||||||
|
Log.d("DynamicColors", "DynamicColors is not available.");
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,12 +1,15 @@
|
|||||||
package one.nem.lacerta;
|
package one.nem.lacerta;
|
||||||
|
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
import androidx.core.content.ContextCompat;
|
||||||
import androidx.fragment.app.FragmentManager;
|
import androidx.fragment.app.FragmentManager;
|
||||||
import androidx.navigation.NavController;
|
import androidx.navigation.NavController;
|
||||||
import androidx.navigation.fragment.NavHostFragment;
|
import androidx.navigation.fragment.NavHostFragment;
|
||||||
import androidx.navigation.ui.NavigationUI;
|
import androidx.navigation.ui.NavigationUI;
|
||||||
|
|
||||||
|
import android.graphics.Color;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.util.Log;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import com.google.android.material.bottomnavigation.BottomNavigationView;
|
import com.google.android.material.bottomnavigation.BottomNavigationView;
|
||||||
@@ -25,16 +28,26 @@ public class MainActivity extends AppCompatActivity {
|
|||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
setContentView(R.layout.activity_main);
|
setContentView(R.layout.activity_main);
|
||||||
|
|
||||||
// Debug
|
// Init navigation
|
||||||
FragmentManager supportFragmentManager = getSupportFragmentManager();
|
try {
|
||||||
|
FragmentManager supportFragmentManager = getSupportFragmentManager();
|
||||||
|
NavHostFragment navHostFragment = (NavHostFragment) supportFragmentManager.findFragmentById(R.id.nav_host_fragment);
|
||||||
|
assert navHostFragment != null;
|
||||||
|
NavController navController = navHostFragment.getNavController();
|
||||||
|
BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_nav);
|
||||||
|
NavigationUI.setupWithNavController(bottomNavigationView, navController);
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
Log.e("Init", "Failed to init navigation");
|
||||||
|
Log.e("Init", "Searchable Error code: " + "894b5941-3bc0-46fe-b752-0dbc88be29a8");
|
||||||
|
Toast.makeText(this, "Failed to init navigation", Toast.LENGTH_LONG).show();
|
||||||
|
finish(); // Exit app
|
||||||
|
}
|
||||||
|
|
||||||
NavHostFragment navHostFragment = (NavHostFragment) supportFragmentManager.findFragmentById(R.id.nav_host_fragment);
|
// Set navigation bar color
|
||||||
NavController navController = navHostFragment.getNavController();
|
getWindow().setNavigationBarColor(ContextCompat.getColor(this, one.nem.lacerta.shared.ui.R.color.colorSecondaryContainer));
|
||||||
BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_nav);
|
|
||||||
|
|
||||||
NavigationUI.setupWithNavController(bottomNavigationView, navController);
|
// Set status bar color
|
||||||
|
getWindow().setStatusBarColor(ContextCompat.getColor(this, one.nem.lacerta.shared.ui.R.color.colorSurface));
|
||||||
Toast.makeText(this, "testMessage", Toast.LENGTH_SHORT).show();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -24,6 +24,11 @@
|
|||||||
android:id="@+id/bottom_nav"
|
android:id="@+id/bottom_nav"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:background="@color/colorSecondaryContainer"
|
||||||
|
app:itemIconTint="@color/colorOnSecondaryContainer"
|
||||||
|
app:itemTextColor="@color/colorOnSecondaryContainer"
|
||||||
|
app:itemActiveIndicatorStyle="@style/Lacerta.Custom.Indicator"
|
||||||
|
app:labelVisibilityMode="selected"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
|||||||
@@ -4,17 +4,26 @@
|
|||||||
<item
|
<item
|
||||||
android:id="@id/feature_home_navigation"
|
android:id="@id/feature_home_navigation"
|
||||||
android:icon="@drawable/home_24px"
|
android:icon="@drawable/home_24px"
|
||||||
android:title="Home"/>
|
android:title="@string/home_title"/>
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@id/feature_search_navigation"
|
||||||
|
android:icon="@drawable/search_24px"
|
||||||
|
android:title="@string/search_title"/>
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@id/feature_library_navigation"
|
android:id="@id/feature_library_navigation"
|
||||||
android:icon="@drawable/folder_24px"
|
android:icon="@drawable/folder_24px"
|
||||||
android:title="Library"/>
|
android:title="@string/library_title"/>
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@id/feature_debug_navigation"
|
android:id="@id/feature_debug_navigation"
|
||||||
android:icon="@drawable/developer_mode_24px"
|
android:icon="@drawable/developer_mode_24px"
|
||||||
android:title="Debug menu"/>
|
android:title="@string/debug_menu_title"/>
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@id/feature_setting_navigation"
|
||||||
|
android:icon="@drawable/settings_24px"
|
||||||
|
android:title="@string/setting_title"/>
|
||||||
|
|
||||||
</menu>
|
</menu>
|
||||||
@@ -10,5 +10,9 @@
|
|||||||
|
|
||||||
<include app:graph="@navigation/feature_home_navigation" />
|
<include app:graph="@navigation/feature_home_navigation" />
|
||||||
|
|
||||||
|
<include app:graph="@navigation/feature_search_navigation" />
|
||||||
|
|
||||||
|
<include app:graph="@navigation/feature_setting_navigation" />
|
||||||
|
|
||||||
|
|
||||||
</navigation>
|
</navigation>
|
||||||
@@ -32,4 +32,6 @@ dependencies {
|
|||||||
testImplementation libs.junit
|
testImplementation libs.junit
|
||||||
androidTestImplementation libs.androidx.test.ext.junit
|
androidTestImplementation libs.androidx.test.ext.junit
|
||||||
androidTestImplementation libs.androidx.test.espresso.core
|
androidTestImplementation libs.androidx.test.espresso.core
|
||||||
|
|
||||||
|
implementation project(':shared:ui')
|
||||||
}
|
}
|
||||||
@@ -30,6 +30,8 @@ dependencies {
|
|||||||
|
|
||||||
implementation libs.androidx.appcompat
|
implementation libs.androidx.appcompat
|
||||||
implementation libs.com.google.android.material
|
implementation libs.com.google.android.material
|
||||||
|
implementation libs.androidx.activity
|
||||||
|
implementation libs.androidx.constraintlayout
|
||||||
testImplementation libs.junit
|
testImplementation libs.junit
|
||||||
androidTestImplementation libs.androidx.test.ext.junit
|
androidTestImplementation libs.androidx.test.ext.junit
|
||||||
androidTestImplementation libs.androidx.test.espresso.core
|
androidTestImplementation libs.androidx.test.espresso.core
|
||||||
@@ -46,4 +48,8 @@ dependencies {
|
|||||||
implementation project(':processor')
|
implementation project(':processor')
|
||||||
|
|
||||||
implementation project(':utils')
|
implementation project(':utils')
|
||||||
|
|
||||||
|
implementation project(':vcs')
|
||||||
|
|
||||||
|
implementation project(':data')
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,10 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<application>
|
||||||
|
<activity
|
||||||
|
android:name=".ScannerManagerActivity"
|
||||||
|
android:exported="false" />
|
||||||
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
||||||
+101
-100
@@ -123,109 +123,110 @@ public class ScannerDataManagerStubFragment extends Fragment {
|
|||||||
public void onViewCreated(View view, Bundle savedInstanceState) {
|
public void onViewCreated(View view, Bundle savedInstanceState) {
|
||||||
super.onViewCreated(view, savedInstanceState);
|
super.onViewCreated(view, savedInstanceState);
|
||||||
|
|
||||||
view.findViewById(R.id.button_call_camera).setOnClickListener(v -> {
|
// view.findViewById(R.id.button_call_camera).setOnClickListener(v -> {
|
||||||
Log.d("ScannerDataManagerStubFragment", "button_call_camera clicked");
|
// Log.d("ScannerDataManagerStubFragment", "button_call_camera clicked");
|
||||||
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
|
// Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
|
||||||
if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) {
|
// if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) {
|
||||||
File photoFile = null;
|
// File photoFile = null;
|
||||||
try {
|
// try {
|
||||||
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(new Date());
|
// String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(new Date());
|
||||||
String imageFileName = "JPEG_" + timeStamp + "_";
|
// String imageFileName = "JPEG_" + timeStamp + "_";
|
||||||
File storageDir = getActivity().getExternalFilesDir(Environment.DIRECTORY_PICTURES);
|
// File storageDir = getActivity().getExternalFilesDir(Environment.DIRECTORY_PICTURES);
|
||||||
photoFile = File.createTempFile(imageFileName, ".jpg", storageDir);
|
// photoFile = File.createTempFile(imageFileName, ".jpg", storageDir);
|
||||||
} catch (IOException ex) {
|
// } catch (IOException ex) {
|
||||||
Log.e("ScannerDataManagerStubFragment", "Error occurred while creating the file", ex);
|
// Log.e("ScannerDataManagerStubFragment", "Error occurred while creating the file", ex);
|
||||||
}
|
// }
|
||||||
if (photoFile != null) {
|
// if (photoFile != null) {
|
||||||
photoURI = FileProvider.getUriForFile(getActivity(), "one.nem.lacerta.provider", photoFile);
|
// photoURI = FileProvider.getUriForFile(getActivity(), "one.nem.lacerta.provider", photoFile);
|
||||||
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
|
// takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
|
||||||
cameraLauncher.launch(takePictureIntent);
|
// cameraLauncher.launch(takePictureIntent);
|
||||||
}
|
// }
|
||||||
else {
|
// else {
|
||||||
Log.d("ScannerDataManagerStubFragment", "photoFile is null");
|
// Log.d("ScannerDataManagerStubFragment", "photoFile is null");
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
else {
|
// else {
|
||||||
Log.d("ScannerDataManagerStubFragment", "camera not available");
|
// Log.d("ScannerDataManagerStubFragment", "camera not available");
|
||||||
}
|
// }
|
||||||
updateResults();
|
// updateResults();
|
||||||
});
|
// });
|
||||||
|
//
|
||||||
view.findViewById(R.id.button_create_documnent).setOnClickListener(v -> {
|
// view.findViewById(R.id.button_create_documnent).setOnClickListener(v -> {
|
||||||
Log.d("ScannerDataManagerStubFragment", "button_create_documnent clicked");
|
// Log.d("ScannerDataManagerStubFragment", "button_create_documnent clicked");
|
||||||
Toast.makeText(getActivity(), "button_create_documnent clicked", Toast.LENGTH_LONG).show();
|
// Toast.makeText(getActivity(), "button_create_documnent clicked", Toast.LENGTH_LONG).show();
|
||||||
|
//
|
||||||
this.documentDetail = createSampleDocumentDetail();
|
// this.documentDetail = createSampleDocumentDetail();
|
||||||
|
//
|
||||||
});
|
// });
|
||||||
|
//
|
||||||
view.findViewById(R.id.button_init_document_processor).setOnClickListener(v -> {
|
// view.findViewById(R.id.button_init_document_processor).setOnClickListener(v -> {
|
||||||
Log.d("ScannerDataManagerStubFragment", "button_init_document_processor clicked");
|
// Log.d("ScannerDataManagerStubFragment", "button_init_document_processor clicked");
|
||||||
Toast.makeText(getActivity(), "button_init_document_processor clicked", Toast.LENGTH_LONG).show();
|
// Toast.makeText(getActivity(), "button_init_document_processor clicked", Toast.LENGTH_LONG).show();
|
||||||
// TODO-rca: ここでDocumentProcessorを初期化する
|
// // TODO-rca: ここでDocumentProcessorを初期化する
|
||||||
if (this.documentDetail == null) {
|
// if (this.documentDetail == null) {
|
||||||
Toast.makeText(getActivity(), "documentDetail is null", Toast.LENGTH_LONG).show();
|
// Toast.makeText(getActivity(), "documentDetail is null", Toast.LENGTH_LONG).show();
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
this.documentProcessor = documentProcessorFactory.create(this.documentDetail);
|
// this.documentProcessor = documentProcessorFactory.create(this.documentDetail);
|
||||||
Toast.makeText(getActivity(), "documentProcessor created", Toast.LENGTH_LONG).show();
|
// Toast.makeText(getActivity(), "documentProcessor created", Toast.LENGTH_LONG).show();
|
||||||
try {
|
// try {
|
||||||
this.documentProcessor.init();
|
// this.documentProcessor.init();
|
||||||
} catch (Exception e) {
|
// } catch (Exception e) {
|
||||||
Toast.makeText(getActivity(), "Error occurred while initializing documentProcessor", Toast.LENGTH_LONG).show();
|
// Toast.makeText(getActivity(), "Error occurred while initializing documentProcessor", Toast.LENGTH_LONG).show();
|
||||||
Log.e("ScannerDataManagerStubFragment", "Error occurred while initializing documentProcessor", e);
|
// Log.e("ScannerDataManagerStubFragment", "Error occurred while initializing documentProcessor", e);
|
||||||
}
|
// }
|
||||||
Toast.makeText(getActivity(), "documentProcessor initialized", Toast.LENGTH_LONG).show();
|
// Toast.makeText(getActivity(), "documentProcessor initialized", Toast.LENGTH_LONG).show();
|
||||||
});
|
// });
|
||||||
|
//
|
||||||
view.findViewById(R.id.button_add_page).setOnClickListener(v -> {
|
// view.findViewById(R.id.button_add_page).setOnClickListener(v -> {
|
||||||
Log.d("ScannerDataManagerStubFragment", "button_add_page clicked");
|
// Log.d("ScannerDataManagerStubFragment", "button_add_page clicked");
|
||||||
Toast.makeText(getActivity(), "button_add_page clicked", Toast.LENGTH_LONG).show();
|
// Toast.makeText(getActivity(), "button_add_page clicked", Toast.LENGTH_LONG).show();
|
||||||
if (this.documentProcessor == null) {
|
// if (this.documentProcessor == null) {
|
||||||
Toast.makeText(getActivity(), "documentProcessor is null", Toast.LENGTH_LONG).show();
|
// Toast.makeText(getActivity(), "documentProcessor is null", Toast.LENGTH_LONG).show();
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
Bitmap[] bitmaps = new Bitmap[results.size()];
|
// Bitmap[] bitmaps = new Bitmap[results.size()];
|
||||||
for (int i = 0; i < results.size(); i++) {
|
// for (int i = 0; i < results.size(); i++) {
|
||||||
bitmaps[i] = results.get(i).getBitmap();
|
// bitmaps[i] = results.get(i).getBitmap();
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
try {
|
// try {
|
||||||
this.documentProcessor.addNewPagesToLast(bitmaps);
|
// this.documentProcessor.addNewPagesToLast(bitmaps);
|
||||||
} catch (Exception e) {
|
// } catch (Exception e) {
|
||||||
Toast.makeText(getActivity(), "Error occurred while adding pages", Toast.LENGTH_LONG).show();
|
// Toast.makeText(getActivity(), "Error occurred while adding pages", Toast.LENGTH_LONG).show();
|
||||||
Log.e("ScannerDataManagerStubFragment", "Error occurred while adding pages", e);
|
// Log.e("ScannerDataManagerStubFragment", "Error occurred while adding pages", e);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
Toast.makeText(getActivity(), "pages added", Toast.LENGTH_LONG).show();
|
// Toast.makeText(getActivity(), "pages added", Toast.LENGTH_LONG).show();
|
||||||
|
//
|
||||||
try {
|
// try {
|
||||||
this.documentProcessor.close();
|
// this.documentProcessor.close();
|
||||||
} catch (Exception e) {
|
// } catch (Exception e) {
|
||||||
Toast.makeText(getActivity(), "Error occurred while closing documentProcessor", Toast.LENGTH_LONG).show();
|
// Toast.makeText(getActivity(), "Error occurred while closing documentProcessor", Toast.LENGTH_LONG).show();
|
||||||
Log.e("ScannerDataManagerStubFragment", "Error occurred while closing documentProcessor", e);
|
// Log.e("ScannerDataManagerStubFragment", "Error occurred while closing documentProcessor", e);
|
||||||
}
|
// }
|
||||||
});
|
// });
|
||||||
}
|
}
|
||||||
|
|
||||||
public DocumentDetail createSampleDocumentDetail() {
|
public DocumentDetail createSampleDocumentDetail() {
|
||||||
|
//
|
||||||
String id = UUID.randomUUID().toString();
|
// String id = UUID.randomUUID().toString();
|
||||||
|
//
|
||||||
Toast.makeText(getActivity(), "Generated id: " + id, Toast.LENGTH_LONG).show();
|
// Toast.makeText(getActivity(), "Generated id: " + id, Toast.LENGTH_LONG).show();
|
||||||
//logger.debug("CreateSample", "Generated id: " + id);
|
// //logger.debug("CreateSample", "Generated id: " + id);
|
||||||
|
//
|
||||||
DocumentMeta meta = new DocumentMeta(
|
// DocumentMeta meta = new DocumentMeta(
|
||||||
id,
|
// id,
|
||||||
"Sample" + DateTimeFormatter.ofPattern("yyyyMMddHHmmss").format(LocalDateTime.now()),
|
// "Sample" + DateTimeFormatter.ofPattern("yyyyMMddHHmmss").format(LocalDateTime.now()),
|
||||||
new Date(),
|
// new Date(),
|
||||||
new Date());
|
// new Date());
|
||||||
|
//
|
||||||
DocumentPath path = new DocumentPath(
|
// DocumentPath path = new DocumentPath(
|
||||||
deviceInfoUtils.getExternalStorageDirectoryString(),
|
// deviceInfoUtils.getExternalStorageDirectoryString(),
|
||||||
"Sample" + DateTimeFormatter.ofPattern("yyyyMMddHHmmss").format(LocalDateTime.now()));
|
// "Sample" + DateTimeFormatter.ofPattern("yyyyMMddHHmmss").format(LocalDateTime.now()));
|
||||||
|
//
|
||||||
return new DocumentDetail(meta, path, "SampleAuthor", "SampleDefaultBranch");
|
// return new DocumentDetail(meta, path, "SampleAuthor", "SampleDefaultBranch");
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+204
@@ -0,0 +1,204 @@
|
|||||||
|
package one.nem.lacerta.component.scanner;
|
||||||
|
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.BitmapFactory;
|
||||||
|
import android.graphics.drawable.BitmapDrawable;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import androidx.activity.EdgeToEdge;
|
||||||
|
import androidx.annotation.AnimatorRes;
|
||||||
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
import androidx.core.graphics.Insets;
|
||||||
|
import androidx.core.view.ViewCompat;
|
||||||
|
import androidx.core.view.WindowInsetsCompat;
|
||||||
|
|
||||||
|
import com.google.android.material.appbar.MaterialToolbar;
|
||||||
|
import com.websitebeaver.documentscanner.DocumentScanner;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import dagger.hilt.android.AndroidEntryPoint;
|
||||||
|
import one.nem.lacerta.model.document.DocumentDetail;
|
||||||
|
import one.nem.lacerta.model.document.DocumentMeta;
|
||||||
|
import one.nem.lacerta.processor.factory.DocumentProcessorFactory;
|
||||||
|
import one.nem.lacerta.utils.LacertaLogger;
|
||||||
|
import one.nem.lacerta.data.Document;
|
||||||
|
import one.nem.lacerta.vcs.factory.LacertaVcsFactory;
|
||||||
|
|
||||||
|
@AndroidEntryPoint
|
||||||
|
public class ScannerManagerActivity extends AppCompatActivity {
|
||||||
|
|
||||||
|
String TAG = "ScannerManagerActivity";
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
LacertaLogger logger;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
Document document;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
DocumentProcessorFactory documentProcessorFactory;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
LacertaVcsFactory lacertaVcsFactory;
|
||||||
|
|
||||||
|
// Variables
|
||||||
|
private ArrayList<Bitmap> croppedImages = new ArrayList<>();
|
||||||
|
|
||||||
|
View view;
|
||||||
|
|
||||||
|
DocumentScanner documentScanner = new DocumentScanner(
|
||||||
|
this,
|
||||||
|
(croppedImageResults) -> {
|
||||||
|
logger.debug(TAG, "croppedImage size: " + croppedImageResults.size());
|
||||||
|
ArrayList<Bitmap> croppedImages = new ArrayList<>();
|
||||||
|
for (String result : croppedImageResults) {
|
||||||
|
croppedImages.add(BitmapFactory.decodeFile(result));
|
||||||
|
}
|
||||||
|
processResult(croppedImages);
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
(errorMessage) -> {
|
||||||
|
// an error happened
|
||||||
|
logger.error(TAG, "Error: " + errorMessage);
|
||||||
|
logger.e_code("543a230e-cb9a-47a2-8131-3beecfe1c458");
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
() -> {
|
||||||
|
// user canceled document scan
|
||||||
|
logger.debug(TAG, "User canceled document scan");
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
EdgeToEdge.enable(this);
|
||||||
|
setContentView(R.layout.activity_scanner_manager);
|
||||||
|
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
|
||||||
|
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
|
||||||
|
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
|
||||||
|
return insets;
|
||||||
|
});
|
||||||
|
|
||||||
|
MaterialToolbar toolbar = findViewById(R.id.top_toolbar);
|
||||||
|
setSupportActionBar(toolbar);
|
||||||
|
Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true);
|
||||||
|
|
||||||
|
documentScanner.startScan();
|
||||||
|
// Init
|
||||||
|
|
||||||
|
this.view = findViewById(R.id.main); // TODO-rca:なんとかする
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onCreateOptionsMenu(android.view.Menu menu) {
|
||||||
|
getMenuInflater().inflate(R.menu.scanner_result_toolbar, menu);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onOptionsItemSelected(android.view.MenuItem item) {
|
||||||
|
if (item.getItemId() == R.id.action_save_new) {
|
||||||
|
// 新ドキュメントとして保存
|
||||||
|
Toast.makeText(this, "保存処理", Toast.LENGTH_SHORT).show();
|
||||||
|
saveNewDocument();
|
||||||
|
return true;
|
||||||
|
} else if (item.getItemId() == R.id.action_insert_exist) {
|
||||||
|
// 既存ドキュメントに挿入
|
||||||
|
Toast.makeText(this, "挿入処理", Toast.LENGTH_SHORT).show();
|
||||||
|
insertToExistDocument();
|
||||||
|
return true;
|
||||||
|
} else if (item.getItemId() == android.R.id.home) {
|
||||||
|
finish();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return super.onOptionsItemSelected(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void processResult(ArrayList<Bitmap> resultImages) {
|
||||||
|
logger.debug(TAG, "processResult");
|
||||||
|
|
||||||
|
if (resultImages.isEmpty()) {
|
||||||
|
logger.debug(TAG, "resultImages(arg) is empty");
|
||||||
|
if (this.croppedImages.isEmpty()) {
|
||||||
|
logger.debug(TAG, "this.resultImages is empty");
|
||||||
|
logger.e_code("7cb0584e-74ef-48ec-848a-c4d14e75e15a");
|
||||||
|
// TODO-rca: なんかする
|
||||||
|
} else {
|
||||||
|
logger.debug(TAG, "this.resultImages is not empty");
|
||||||
|
updateResultView(this.croppedImages);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
logger.debug(TAG, "resultImages(arg) is not empty");
|
||||||
|
updateResultView(resultImages);
|
||||||
|
this.croppedImages = resultImages;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void saveNewDocument() {
|
||||||
|
logger.debug(TAG, "saveNewDocument");
|
||||||
|
DocumentMeta documentMeta = new DocumentMeta("Untitled"); // TODO-rca: デフォルトタイトルを指定できるようにする
|
||||||
|
DocumentDetail documentDetail = document.createDocument(documentMeta);
|
||||||
|
Bitmap[] bitmaps = new Bitmap[this.croppedImages.size()];
|
||||||
|
this.croppedImages.toArray(bitmaps);
|
||||||
|
try {
|
||||||
|
documentProcessorFactory.create(documentDetail).addNewPagesToLast(bitmaps);
|
||||||
|
Toast.makeText(this, "Saved.", Toast.LENGTH_SHORT).show();
|
||||||
|
lacertaVcsFactory.create(documentDetail.getMeta().getId()).generateRevisionAtCurrent("Initial commit");
|
||||||
|
lacertaVcsFactory.create(documentDetail.getMeta().getId()).printLog(); // Debug
|
||||||
|
lacertaVcsFactory.create(documentDetail.getMeta().getId()).printRev(); // Debug
|
||||||
|
finish();
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error(TAG, "Error: " + e.getMessage());
|
||||||
|
logger.e_code("9dff2a28-20e8-4ccd-9d04-f0c7646faa6a");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void insertToExistDocument() {
|
||||||
|
logger.debug(TAG, "insertToExistDocument");
|
||||||
|
// TODO-rca: 実装
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateResultView(ArrayList<Bitmap> resultImages) {
|
||||||
|
logger.debug(TAG, "updateResultView");
|
||||||
|
|
||||||
|
LinearLayout resultView = findViewById(R.id.result_list_container);
|
||||||
|
ImageView selectedImage = findViewById(R.id.selected_image);
|
||||||
|
resultView.removeAllViews();
|
||||||
|
|
||||||
|
for (Bitmap resultImage : resultImages) {
|
||||||
|
View resultImageView = getLayoutInflater().inflate(R.layout.result_image_container_item, null);
|
||||||
|
ImageView imageView = resultImageView.findViewById(R.id.result_image);
|
||||||
|
imageView.setImageBitmap(resultImage);
|
||||||
|
imageView.setOnClickListener(v -> {
|
||||||
|
|
||||||
|
selectedImage.setImageBitmap(resultImage);
|
||||||
|
|
||||||
|
for (int i = 0; i < resultView.getChildCount(); i++) {
|
||||||
|
View child = resultView.getChildAt(i).findViewById(R.id.result_image);
|
||||||
|
child.setSelected(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
v.setSelected(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
resultView.addView(resultImageView);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+95
@@ -0,0 +1,95 @@
|
|||||||
|
package one.nem.lacerta.component.scanner;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
|
import com.websitebeaver.documentscanner.DocumentScanner;
|
||||||
|
import com.websitebeaver.documentscanner.DocumentScannerActivity;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import dagger.hilt.android.AndroidEntryPoint;
|
||||||
|
import one.nem.lacerta.utils.LacertaLogger;
|
||||||
|
import one.nem.lacerta.vcs.LacertaVcs;
|
||||||
|
import one.nem.lacerta.vcs.factory.LacertaVcsFactory;
|
||||||
|
|
||||||
|
|
||||||
|
@AndroidEntryPoint
|
||||||
|
public class ScannerManagerFragment extends Fragment {
|
||||||
|
|
||||||
|
String TAG = getClass().getSimpleName();
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
LacertaLogger logger;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
LacertaVcsFactory vcsFactory;
|
||||||
|
|
||||||
|
private static final boolean DEFAULT_SINGLE_PAGE = false;
|
||||||
|
private boolean singlePage;
|
||||||
|
|
||||||
|
public ScannerManagerFragment() {
|
||||||
|
// Required empty public constructor
|
||||||
|
}
|
||||||
|
|
||||||
|
// public static ScannerManagerFragment newInstance(boolean singlePage) {
|
||||||
|
// ScannerManagerFragment fragment = new ScannerManagerFragment();
|
||||||
|
// Bundle args = new Bundle();
|
||||||
|
// args.putBoolean("singlePage", singlePage);
|
||||||
|
// fragment.setArguments(args);
|
||||||
|
// return fragment;
|
||||||
|
// }
|
||||||
|
|
||||||
|
public static ScannerManagerFragment newInstance() {
|
||||||
|
ScannerManagerFragment fragment = new ScannerManagerFragment();
|
||||||
|
Bundle args = new Bundle();
|
||||||
|
args.putBoolean("singlePage", DEFAULT_SINGLE_PAGE);
|
||||||
|
fragment.setArguments(args);
|
||||||
|
return fragment;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
if (getArguments() != null) {
|
||||||
|
singlePage = getArguments().getBoolean("singlePage", DEFAULT_SINGLE_PAGE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||||
|
Bundle savedInstanceState) {
|
||||||
|
// Inflate the layout for this fragment
|
||||||
|
View view = inflater.inflate(R.layout.fragment_scanner_manager, container, false);
|
||||||
|
|
||||||
|
// ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(
|
||||||
|
// ViewGroup.LayoutParams.MATCH_PARENT,
|
||||||
|
// ViewGroup.LayoutParams.MATCH_PARENT
|
||||||
|
// );
|
||||||
|
// view.setLayoutParams(layoutParams);
|
||||||
|
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onViewCreated(View view, Bundle savedInstanceState) {
|
||||||
|
super.onViewCreated(view, savedInstanceState);
|
||||||
|
|
||||||
|
// Init
|
||||||
|
logger.debug(TAG, "called");
|
||||||
|
|
||||||
|
view.findViewById(R.id.button_intent_scanner_manager_activity).setOnClickListener(v -> {
|
||||||
|
// DocumentScannerActivityを起動する
|
||||||
|
Intent intent = new Intent(requireActivity().getApplicationContext(), ScannerManagerActivity.class);
|
||||||
|
startActivity(intent);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:state_selected="true">
|
||||||
|
<shape android:shape="rectangle">
|
||||||
|
<solid android:color="#00000000" />
|
||||||
|
<corners android:radius="8dp" />
|
||||||
|
<stroke android:color="#FF0000" android:width="2dp" />
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<shape android:shape="rectangle">
|
||||||
|
<solid android:color="#00000000" />
|
||||||
|
<corners android:radius="8dp" />
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
</selector>
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:id="@+id/main"
|
||||||
|
android:theme="@style/Theme.Lacerta"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
|
android:id="@+id/top_toolbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="@color/colorPrimaryContainer"
|
||||||
|
app:titleTextColor="@color/colorOnPrimaryContainer"
|
||||||
|
app:title="Preview"
|
||||||
|
android:minHeight="?attr/actionBarSize"
|
||||||
|
android:theme="?attr/actionBarTheme"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/selected_image"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_above="@+id/horizontal_scroll"
|
||||||
|
android:scaleType="centerInside"
|
||||||
|
app:layout_constraintBottom_toTopOf="@+id/horizontal_scroll"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/top_toolbar" />
|
||||||
|
|
||||||
|
<HorizontalScrollView
|
||||||
|
android:id="@+id/horizontal_scroll"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentBottom="true"
|
||||||
|
android:scrollbars="none"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/selected_image">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/result_list_container"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</HorizontalScrollView>
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
+6
-6
@@ -4,13 +4,13 @@
|
|||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
tools:context=".DebugMenuDocumentTesterListFragment" >
|
tools:context=".ScannerManagerFragment">
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
<Button
|
||||||
android:id="@+id/recycler_view_document_list"
|
android:id="@+id/button_intent_scanner_manager_activity"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="0dp"
|
||||||
android:layout_height="0dp"
|
android:layout_height="wrap_content"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
android:text="Button"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent" />
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/result_image"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:maxHeight="64dp"
|
||||||
|
android:adjustViewBounds="true"
|
||||||
|
android:background="@drawable/result_image_container_item_border"
|
||||||
|
android:padding="8dp"
|
||||||
|
android:scaleType="centerCrop" />
|
||||||
|
|
||||||
|
</FrameLayout>
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_save_new"
|
||||||
|
android:icon="@drawable/save_24px"
|
||||||
|
android:title="Save"
|
||||||
|
app:showAsAction="ifRoom"/>
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_insert_exist"
|
||||||
|
android:icon="@drawable/ic_baseline_add_24"
|
||||||
|
android:title="Save"
|
||||||
|
app:showAsAction="ifRoom"/>
|
||||||
|
</menu>
|
||||||
@@ -56,4 +56,6 @@ dependencies {
|
|||||||
|
|
||||||
// データソースモジュール
|
// データソースモジュール
|
||||||
implementation project(':source')
|
implementation project(':source')
|
||||||
|
|
||||||
|
implementation project(':vcs')
|
||||||
}
|
}
|
||||||
@@ -13,34 +13,13 @@ import one.nem.lacerta.model.document.tag.DocumentTag;
|
|||||||
*/
|
*/
|
||||||
public interface Document {
|
public interface Document {
|
||||||
|
|
||||||
ArrayList<DocumentMeta> getAllDocumentMetas(int limit);
|
DocumentDetail createDocument(DocumentMeta meta);
|
||||||
|
|
||||||
ArrayList<DocumentMeta> getAllDocumentMetas(int limit, int offset);
|
DocumentDetail createDocument();
|
||||||
|
|
||||||
/**
|
void deleteDocument(String documentId);
|
||||||
* 更新の新しいドキュメントから順に並べてlimit件取得する
|
|
||||||
* @param limit 取得する上限数
|
|
||||||
*/
|
|
||||||
ArrayList<DocumentMeta> getRecentDocumentMetas(int limit);
|
|
||||||
|
|
||||||
/**
|
void updateDocument(DocumentMeta meta, DocumentDetail detail);
|
||||||
* 更新の新しいドキュメントから順に並べてoffset位置からlimit件取得する
|
|
||||||
* @param limit 取得する上限数
|
|
||||||
* @param offset 取得するオフセット
|
|
||||||
*/
|
|
||||||
ArrayList<DocumentMeta> getRecentDocumentMetas(int limit, int offset);
|
|
||||||
|
|
||||||
/**
|
DocumentDetail getDocument(String documentId);
|
||||||
* ドキュメントIDからDocumentDetailを取得する
|
|
||||||
* @param id ドキュメントID
|
|
||||||
*/
|
|
||||||
DocumentDetail getDocumentDetail(String id);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* DocumentMetaからDocumentDetailを取得する
|
|
||||||
* @param meta DocumentMeta
|
|
||||||
*/
|
|
||||||
DocumentDetail getDocumentDetailByMeta(DocumentMeta meta); // 簡単に使えるように
|
|
||||||
|
|
||||||
DocumentDetail createDocumentByMeta(DocumentMeta meta);
|
|
||||||
}
|
}
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
package one.nem.lacerta.data;
|
|
||||||
|
|
||||||
import one.nem.lacerta.model.document.DocumentMeta;
|
|
||||||
import one.nem.lacerta.model.document.DocumentDetail;
|
|
||||||
import one.nem.lacerta.model.document.path.DocumentPath;
|
|
||||||
import one.nem.lacerta.model.document.tag.DocumentTag;
|
|
||||||
|
|
||||||
public interface DocumentDebug {
|
|
||||||
|
|
||||||
void insertDocument(DocumentMeta meta, DocumentDetail detail);
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,8 @@
|
|||||||
package one.nem.lacerta.data;
|
package one.nem.lacerta.data;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import one.nem.lacerta.model.ListItem;
|
||||||
import one.nem.lacerta.model.ListItemType;
|
import one.nem.lacerta.model.ListItemType;
|
||||||
|
|
||||||
import one.nem.lacerta.model.LibraryItemPage;
|
import one.nem.lacerta.model.LibraryItemPage;
|
||||||
@@ -8,8 +11,8 @@ import one.nem.lacerta.model.document.DocumentDetail;
|
|||||||
public interface LacertaLibrary {
|
public interface LacertaLibrary {
|
||||||
|
|
||||||
// Get History
|
// Get History
|
||||||
LibraryItemPage getRecentDocument(int limit);
|
ArrayList<ListItem> getRecentDocument(int limit);
|
||||||
LibraryItemPage getRecentDocument(int limit, int offset);
|
ArrayList<ListItem> getRecentDocument(int limit, int offset);
|
||||||
|
|
||||||
// Get Library page
|
// Get Library page
|
||||||
LibraryItemPage getLibraryPage(int limit);
|
LibraryItemPage getLibraryPage(int limit);
|
||||||
@@ -18,5 +21,5 @@ public interface LacertaLibrary {
|
|||||||
LibraryItemPage getLibraryPage(String pageId, int limit, int offset);
|
LibraryItemPage getLibraryPage(String pageId, int limit, int offset);
|
||||||
|
|
||||||
// GetDocument
|
// GetDocument
|
||||||
DocumentDetail getDocumentDetailById(String id);
|
DocumentDetail getDocumentDetailById(String id); // TODO-rca: Documentに統合する
|
||||||
}
|
}
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
package one.nem.lacerta.data.impl;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import javax.inject.Inject;
|
|
||||||
|
|
||||||
import one.nem.lacerta.data.DocumentDebug;
|
|
||||||
import one.nem.lacerta.model.document.DocumentDetail;
|
|
||||||
import one.nem.lacerta.model.document.DocumentMeta;
|
|
||||||
|
|
||||||
import one.nem.lacerta.source.database.entity.DocumentEntity;
|
|
||||||
import one.nem.lacerta.source.database.entity.LibraryEntity;
|
|
||||||
import one.nem.lacerta.source.database.entity.TagEntity;
|
|
||||||
|
|
||||||
import one.nem.lacerta.source.database.LacertaDatabase;
|
|
||||||
|
|
||||||
public class DocumentDebugImpl implements DocumentDebug{
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
LacertaDatabase database;
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
public DocumentDebugImpl() {
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void insertDocument(DocumentMeta meta, DocumentDetail detail) {
|
|
||||||
DocumentEntity documentEntity = new DocumentEntity();
|
|
||||||
LibraryEntity libraryEntity = new LibraryEntity();
|
|
||||||
|
|
||||||
documentEntity.id = meta.getId();
|
|
||||||
documentEntity.title = meta.getTitle();
|
|
||||||
documentEntity.createdAt = meta.getCreatedAt();
|
|
||||||
documentEntity.updatedAt = meta.getUpdatedAt();
|
|
||||||
documentEntity.author = detail.getAuthor();
|
|
||||||
documentEntity.defaultBranch = detail.getDefaultBranch();
|
|
||||||
// ArrayListからListに変換
|
|
||||||
documentEntity.tagIds = meta.getTagIds();
|
|
||||||
|
|
||||||
libraryEntity.id = meta.getId();
|
|
||||||
libraryEntity.path = "Placeholder";
|
|
||||||
libraryEntity.rootPath = "Placeholder";
|
|
||||||
|
|
||||||
database.documentDao().insert(documentEntity);
|
|
||||||
database.libraryDao().insert(libraryEntity);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,139 +1,107 @@
|
|||||||
package one.nem.lacerta.data.impl;
|
package one.nem.lacerta.data.impl;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.Date;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
// Hilt
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
// Lacerta/data
|
||||||
import one.nem.lacerta.data.Document;
|
import one.nem.lacerta.data.Document;
|
||||||
|
|
||||||
|
// Lacerta/model
|
||||||
|
import one.nem.lacerta.model.PublicPath;
|
||||||
import one.nem.lacerta.model.document.DocumentMeta;
|
import one.nem.lacerta.model.document.DocumentMeta;
|
||||||
import one.nem.lacerta.model.document.DocumentDetail;
|
import one.nem.lacerta.model.document.DocumentDetail;
|
||||||
|
|
||||||
import one.nem.lacerta.model.document.path.DocumentPath;
|
// Lacerta/source
|
||||||
import one.nem.lacerta.model.document.tag.DocumentTag;
|
|
||||||
import one.nem.lacerta.source.database.LacertaDatabase;
|
import one.nem.lacerta.source.database.LacertaDatabase;
|
||||||
|
|
||||||
import one.nem.lacerta.source.database.entity.DocumentEntity;
|
import one.nem.lacerta.source.database.entity.DocumentEntity;
|
||||||
import one.nem.lacerta.source.database.entity.LibraryEntity;
|
|
||||||
import one.nem.lacerta.source.database.entity.TagEntity;
|
|
||||||
|
|
||||||
import one.nem.lacerta.source.jgit.JGitRepository;
|
// Lacerta/utils
|
||||||
import one.nem.lacerta.utils.repository.DeviceInfoUtils;
|
import one.nem.lacerta.utils.LacertaLogger;
|
||||||
|
|
||||||
|
// Lacerta/vcs
|
||||||
|
import one.nem.lacerta.vcs.LacertaVcs;
|
||||||
|
import one.nem.lacerta.vcs.factory.LacertaVcsFactory;
|
||||||
|
|
||||||
|
|
||||||
public class DocumentImpl implements Document{
|
public class DocumentImpl implements Document {
|
||||||
|
|
||||||
private LacertaDatabase database;
|
String TAG = getClass().getSimpleName();
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public DocumentImpl(LacertaDatabase database) {
|
LacertaLogger logger;
|
||||||
this.database = database;
|
|
||||||
|
@Inject
|
||||||
|
LacertaDatabase database;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
LacertaVcsFactory vcsFactory;
|
||||||
|
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public DocumentImpl() {
|
||||||
|
// Init
|
||||||
|
// logger.debug(TAG, "called");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject
|
|
||||||
JGitRepository jGitRepository;
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
DeviceInfoUtils deviceInfoUtils;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ArrayList<DocumentMeta> getAllDocumentMetas(int limit) {
|
public DocumentDetail createDocument(DocumentMeta meta) {
|
||||||
ArrayList<DocumentMeta> documentMetas = new ArrayList<>();
|
DocumentDetail detail = new DocumentDetail();
|
||||||
List<DocumentEntity> documentEntities = database.documentDao().getAllWithLimit(limit);
|
detail.setMeta(meta);
|
||||||
|
detail.setPages(new ArrayList<>());
|
||||||
|
|
||||||
for (DocumentEntity documentEntity : documentEntities) {
|
// TODO-rca: UIスレッドから追い出す
|
||||||
// タグ取得
|
|
||||||
// TODO-rca: 切り出すべきかも?
|
|
||||||
List<TagEntity> tagEntities = database.tagDao().findByIds(documentEntity.tagIds);
|
|
||||||
ArrayList<DocumentTag> documentTags = new ArrayList<>();
|
|
||||||
for (TagEntity tagEntity : tagEntities) {
|
|
||||||
documentTags.add(new DocumentTag(tagEntity.id, tagEntity.tagName, tagEntity.color));
|
|
||||||
}
|
|
||||||
|
|
||||||
// 組み立て処理
|
// Create DocumentEntity
|
||||||
// 可読性が終わるのでコンストラクタはつかわないほうがいいかも?
|
DocumentEntity documentEntity = new DocumentEntity();
|
||||||
DocumentMeta documentMeta = new DocumentMeta();
|
documentEntity.id = meta.getId();
|
||||||
documentMeta.setId(documentEntity.id);
|
documentEntity.title = meta.getTitle();
|
||||||
documentMeta.setTitle(documentEntity.title);
|
documentEntity.author = meta.getAuthor();
|
||||||
documentMeta.setCreatedAt(documentEntity.createdAt);
|
documentEntity.defaultBranch = meta.getDefaultBranch();
|
||||||
documentMeta.setUpdatedAt(documentEntity.updatedAt);
|
documentEntity.updatedAt = meta.getUpdatedAt();
|
||||||
documentMeta.setTags(documentTags);
|
documentEntity.createdAt = meta.getCreatedAt();
|
||||||
|
documentEntity.publicPath = meta.getPath().getStringPath();
|
||||||
|
documentEntity.tagIds = meta.getTagIds();
|
||||||
|
|
||||||
documentMetas.add(documentMeta);
|
database.documentDao().insert(documentEntity);
|
||||||
}
|
|
||||||
|
|
||||||
return documentMetas;
|
// Vcs
|
||||||
|
LacertaVcs vcs = vcsFactory.create(meta.getId());
|
||||||
|
vcs.createDocument(meta.getId());
|
||||||
|
|
||||||
|
return detail;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ArrayList<DocumentMeta> getAllDocumentMetas(int limit, int offset) {
|
public DocumentDetail createDocument() {
|
||||||
return null; // TODO-rca: 実装する
|
DocumentMeta meta = new DocumentMeta();
|
||||||
|
meta.setId(UUID.randomUUID().toString());
|
||||||
|
meta.setTitle("New Document");
|
||||||
|
meta.setAuthor("author");
|
||||||
|
meta.setDefaultBranch("master");
|
||||||
|
meta.setUpdatedAt(new Date());
|
||||||
|
meta.setCreatedAt(new Date());
|
||||||
|
meta.setPath(new PublicPath().getRoot()); // TODO-rca: 2回インスタンスを生成していて無駄なのでなんとかする
|
||||||
|
meta.setTags(new ArrayList<>());
|
||||||
|
return createDocument(meta);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ArrayList<DocumentMeta> getRecentDocumentMetas(int limit) {
|
public void deleteDocument(String documentId) {
|
||||||
// ArrayList<DocumentMeta> documentMetas = new ArrayList<>();
|
|
||||||
// database.documentDao().
|
}
|
||||||
// TODO-rca: 履歴取得するDao実装する
|
|
||||||
|
@Override
|
||||||
|
public void updateDocument(DocumentMeta meta, DocumentDetail detail) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DocumentDetail getDocument(String documentId) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public ArrayList<DocumentMeta> getRecentDocumentMetas(int limit, int offset) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DocumentDetail getDocumentDetail(String id) {
|
|
||||||
DocumentDetail documentDetail = new DocumentDetail();
|
|
||||||
DocumentEntity documentEntity = database.documentDao().findById(id);
|
|
||||||
|
|
||||||
// タグ取得
|
|
||||||
// TODO-rca: 切り出すべきかも?
|
|
||||||
List<TagEntity> tagEntities = database.tagDao().findByIds(documentEntity.tagIds);
|
|
||||||
ArrayList<DocumentTag> documentTags = new ArrayList<>();
|
|
||||||
for (TagEntity tagEntity : tagEntities) {
|
|
||||||
documentTags.add(new DocumentTag(tagEntity.id, tagEntity.tagName, tagEntity.color));
|
|
||||||
}
|
|
||||||
|
|
||||||
// パス取得
|
|
||||||
// TODO-rca: 切り出すべきかも?
|
|
||||||
LibraryEntity libraryEntity = database.libraryDao().findById(id);
|
|
||||||
DocumentPath documentPath = new DocumentPath(libraryEntity.rootPath, libraryEntity.path);
|
|
||||||
|
|
||||||
// リポジトリ取得
|
|
||||||
documentDetail.setRepository(jGitRepository.getRepository(id)); // TODO-rca: エラーハンドリング
|
|
||||||
|
|
||||||
// 組み立て処理
|
|
||||||
// 可読性が終わるのでコンストラクタはつかわないほうがいいかも?
|
|
||||||
DocumentMeta documentMeta = new DocumentMeta();
|
|
||||||
documentMeta.setId(documentEntity.id);
|
|
||||||
documentMeta.setTitle(documentEntity.title);
|
|
||||||
documentMeta.setCreatedAt(documentEntity.createdAt);
|
|
||||||
documentMeta.setUpdatedAt(documentEntity.updatedAt);
|
|
||||||
documentMeta.setTags(documentTags);
|
|
||||||
|
|
||||||
documentDetail.setMeta(documentMeta);
|
|
||||||
documentDetail.setAuthor(documentEntity.author);
|
|
||||||
documentDetail.setDefaultBranch(documentEntity.defaultBranch);
|
|
||||||
|
|
||||||
return documentDetail;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DocumentDetail getDocumentDetailByMeta(DocumentMeta meta) {
|
|
||||||
return getDocumentDetail(meta.getId()); // TODO-rca: 効率悪いのでMetaはもらった物を使うようにする(処理を切り分ける?)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DocumentDetail createDocumentByMeta(DocumentMeta meta) {
|
|
||||||
DocumentDetail documentDetail = new DocumentDetail();
|
|
||||||
|
|
||||||
documentDetail.setMeta(meta);
|
|
||||||
documentDetail.setAuthor("author"); // TODO-rca: SharedPrefを扱う機能を作ってそこから取得するようにする or Gitの設定を参照するようにする
|
|
||||||
documentDetail.setDefaultBranch("master"); // TODO-rca: SharedPrefを扱う機能を作ってそこから取得するようにする?
|
|
||||||
|
|
||||||
return documentDetail;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -1,18 +1,48 @@
|
|||||||
package one.nem.lacerta.data.impl;
|
package one.nem.lacerta.data.impl;
|
||||||
|
|
||||||
|
import java.text.DateFormat;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import one.nem.lacerta.data.LacertaLibrary;
|
import one.nem.lacerta.data.LacertaLibrary;
|
||||||
import one.nem.lacerta.model.LibraryItemPage;
|
import one.nem.lacerta.model.LibraryItemPage;
|
||||||
|
import one.nem.lacerta.model.ListItem;
|
||||||
|
import one.nem.lacerta.model.ListItemType;
|
||||||
import one.nem.lacerta.model.document.DocumentDetail;
|
import one.nem.lacerta.model.document.DocumentDetail;
|
||||||
|
import one.nem.lacerta.source.database.LacertaDatabase;
|
||||||
|
import one.nem.lacerta.source.database.common.DateTypeConverter;
|
||||||
|
import one.nem.lacerta.source.database.entity.DocumentEntity;
|
||||||
|
import one.nem.lacerta.utils.LacertaLogger;
|
||||||
|
|
||||||
public class LacertaLibraryImpl implements LacertaLibrary {
|
public class LacertaLibraryImpl implements LacertaLibrary {
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
LacertaLogger logger;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
LacertaDatabase database;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public LibraryItemPage getRecentDocument(int limit) {
|
public ArrayList<ListItem> getRecentDocument(int limit) {
|
||||||
return null;
|
List<DocumentEntity> documentEntities = database.documentDao().getRecentDocument(limit);
|
||||||
|
|
||||||
|
ArrayList<ListItem> listItems = new ArrayList<>();
|
||||||
|
for (DocumentEntity documentEntity : documentEntities) {
|
||||||
|
ListItem listItem = new ListItem();
|
||||||
|
listItem.setItemType(ListItemType.ITEM_TYPE_DOCUMENT);
|
||||||
|
listItem.setTitle(documentEntity.title);
|
||||||
|
listItem.setDescription(DateFormat.getDateInstance().format(documentEntity.updatedAt));
|
||||||
|
listItem.setItemId(documentEntity.id);
|
||||||
|
listItems.add(listItem);
|
||||||
|
}
|
||||||
|
return listItems;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public LibraryItemPage getRecentDocument(int limit, int offset) {
|
public ArrayList<ListItem> getRecentDocument(int limit, int offset) {
|
||||||
return null;
|
return null; // TODO-rca: Implement
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -136,9 +136,9 @@ public class LacertaLibraryStubImpl implements LacertaLibrary {
|
|||||||
|
|
||||||
DocumentDetail documentDetail = new DocumentDetail();
|
DocumentDetail documentDetail = new DocumentDetail();
|
||||||
documentDetail.setMeta(documentMeta);
|
documentDetail.setMeta(documentMeta);
|
||||||
documentDetail.setPath(null); // TODO-rca: なんとかする
|
// documentDetail.setPath(null); // TODO-rca: なんとかする
|
||||||
documentDetail.setAuthor(faker.name().fullName());
|
// documentDetail.setAuthor(faker.name().fullName());
|
||||||
documentDetail.setRepository(null); // TODO-rca: なんとかする
|
// documentDetail.setRepository(null); // TODO-rca: なんとかする
|
||||||
return documentDetail;
|
return documentDetail;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -148,8 +148,8 @@ public class LacertaLibraryStubImpl implements LacertaLibrary {
|
|||||||
* @return ページオブジェクト
|
* @return ページオブジェクト
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public LibraryItemPage getRecentDocument(int limit) {
|
public ArrayList<ListItem> getRecentDocument(int limit) {
|
||||||
return getRecentDocumentPage(limit);
|
return getRecentDocumentPage(limit).getListItems();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -159,8 +159,8 @@ public class LacertaLibraryStubImpl implements LacertaLibrary {
|
|||||||
* @return ページオブジェクト
|
* @return ページオブジェクト
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public LibraryItemPage getRecentDocument(int limit, int offset) {
|
public ArrayList<ListItem> getRecentDocument(int limit, int offset) {
|
||||||
return getRecentDocumentPage(limit);
|
return getRecentDocumentPage(limit).getListItems();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
package one.nem.lacerta.data.module;
|
|
||||||
|
|
||||||
import dagger.Binds;
|
|
||||||
import dagger.Module;
|
|
||||||
import dagger.hilt.InstallIn;
|
|
||||||
import dagger.hilt.components.SingletonComponent;
|
|
||||||
import one.nem.lacerta.data.DocumentDebug;
|
|
||||||
import one.nem.lacerta.data.impl.DocumentDebugImpl;
|
|
||||||
|
|
||||||
@Module
|
|
||||||
@InstallIn(SingletonComponent.class) // TODO-rca: Singletonでいいのか検討する
|
|
||||||
abstract public class DocumentDebugModule {
|
|
||||||
|
|
||||||
@Binds
|
|
||||||
public abstract DocumentDebug bindDocumentDebug(DocumentDebugImpl documentDebugImpl);
|
|
||||||
}
|
|
||||||
@@ -1,10 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
<application>
|
|
||||||
<activity
|
|
||||||
android:name=".DebugMenuContainerActivity"
|
|
||||||
android:exported="false" />
|
|
||||||
</application>
|
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
||||||
-81
@@ -1,81 +0,0 @@
|
|||||||
package one.nem.lacerta.feature.debug;
|
|
||||||
|
|
||||||
import android.os.Bundle;
|
|
||||||
|
|
||||||
import androidx.fragment.app.Fragment;
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
|
||||||
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
|
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import javax.inject.Inject;
|
|
||||||
|
|
||||||
import dagger.hilt.android.AndroidEntryPoint;
|
|
||||||
import one.nem.lacerta.data.Document;
|
|
||||||
import one.nem.lacerta.feature.debug.common.adapter.DebugMenuDocumentListItemAdapter;
|
|
||||||
import one.nem.lacerta.feature.debug.common.model.DebugMenuDocumentListItem;
|
|
||||||
import one.nem.lacerta.model.document.DocumentMeta;
|
|
||||||
import one.nem.lacerta.utils.LacertaLogger;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A simple {@link Fragment} subclass.
|
|
||||||
* Use the {@link DebugMenuDocumentTesterListFragment#newInstance} factory method to
|
|
||||||
* create an instance of this fragment.
|
|
||||||
*/
|
|
||||||
|
|
||||||
@AndroidEntryPoint
|
|
||||||
public class DebugMenuDocumentTesterListFragment extends Fragment {
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
Document document;
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
LacertaLogger logger;
|
|
||||||
|
|
||||||
public DebugMenuDocumentTesterListFragment() {
|
|
||||||
// Required empty public constructor
|
|
||||||
}
|
|
||||||
|
|
||||||
public static DebugMenuDocumentTesterListFragment newInstance() {
|
|
||||||
DebugMenuDocumentTesterListFragment fragment = new DebugMenuDocumentTesterListFragment();
|
|
||||||
Bundle args = new Bundle();
|
|
||||||
fragment.setArguments(args);
|
|
||||||
return fragment;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
|
||||||
Bundle savedInstanceState) {
|
|
||||||
// Inflate the layout for this fragment
|
|
||||||
View view = inflater.inflate(R.layout.fragment_debug_menu_document_tester_list, container, false);
|
|
||||||
|
|
||||||
RecyclerView recyclerView = view.findViewById(R.id.recycler_view_document_list);
|
|
||||||
recyclerView.setLayoutManager(new androidx.recyclerview.widget.LinearLayoutManager(getContext()));
|
|
||||||
|
|
||||||
ArrayList<DocumentMeta> documentMetas = document.getAllDocumentMetas(100);
|
|
||||||
|
|
||||||
logger.debug("Debug/DocList", "Document count: " + documentMetas.size());
|
|
||||||
|
|
||||||
List<DebugMenuDocumentListItem> debugMenuDocumentListItems = new ArrayList<>();
|
|
||||||
|
|
||||||
for (DocumentMeta documentMeta : documentMetas) {
|
|
||||||
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
||||||
debugMenuDocumentListItems.add(new DebugMenuDocumentListItem(documentMeta.getTitle(), "Internal Id: " + documentMeta.getId(), simpleDateFormat.format(documentMeta.getUpdatedAt())));
|
|
||||||
}
|
|
||||||
|
|
||||||
DebugMenuDocumentListItemAdapter adapter = new DebugMenuDocumentListItemAdapter(debugMenuDocumentListItems);
|
|
||||||
recyclerView.setAdapter(adapter);
|
|
||||||
|
|
||||||
return view;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-72
@@ -1,72 +0,0 @@
|
|||||||
package one.nem.lacerta.feature.debug;
|
|
||||||
|
|
||||||
import android.os.Bundle;
|
|
||||||
|
|
||||||
import androidx.fragment.app.Fragment;
|
|
||||||
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
|
|
||||||
import com.google.android.material.textfield.TextInputEditText;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
import javax.inject.Inject;
|
|
||||||
|
|
||||||
import dagger.hilt.android.AndroidEntryPoint;
|
|
||||||
import dagger.multibindings.IntKey;
|
|
||||||
import one.nem.lacerta.data.DocumentDebug;
|
|
||||||
|
|
||||||
import one.nem.lacerta.model.document.DocumentMeta;
|
|
||||||
import one.nem.lacerta.model.document.DocumentDetail;
|
|
||||||
|
|
||||||
import one.nem.lacerta.model.document.path.DocumentPath;
|
|
||||||
import one.nem.lacerta.model.document.tag.DocumentTag;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A simple {@link Fragment} subclass.
|
|
||||||
* Use the {@link DebugMenuDocumentTesterManageFragment#newInstance} factory method to
|
|
||||||
* create an instance of this fragment.
|
|
||||||
*/
|
|
||||||
@AndroidEntryPoint
|
|
||||||
public class DebugMenuDocumentTesterManageFragment extends Fragment {
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
DocumentDebug documentDebug;
|
|
||||||
|
|
||||||
public DebugMenuDocumentTesterManageFragment() {
|
|
||||||
// Required empty public constructor
|
|
||||||
}
|
|
||||||
|
|
||||||
public static DebugMenuDocumentTesterManageFragment newInstance() {
|
|
||||||
DebugMenuDocumentTesterManageFragment fragment = new DebugMenuDocumentTesterManageFragment();
|
|
||||||
Bundle args = new Bundle();
|
|
||||||
fragment.setArguments(args);
|
|
||||||
return fragment;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
|
||||||
Bundle savedInstanceState) {
|
|
||||||
// Inflate the layout for this fragment
|
|
||||||
View view = inflater.inflate(R.layout.fragment_debug_menu_document_tester_manage, container, false);
|
|
||||||
|
|
||||||
TextInputEditText editTextDocumentTitle = view.findViewById(R.id.edit_text_document_title);
|
|
||||||
view.findViewById(R.id.button_insert_test_data).setOnClickListener( v -> {
|
|
||||||
|
|
||||||
DocumentMeta meta = new DocumentMeta(editTextDocumentTitle != null ? editTextDocumentTitle.getText().toString() : "empty title"); // TODO-rca: Nullable
|
|
||||||
DocumentPath path = new DocumentPath("root", "test_path");
|
|
||||||
DocumentDetail detail = new DocumentDetail(meta, path, "test_author", "test_default_branch");
|
|
||||||
|
|
||||||
documentDebug.insertDocument(meta, detail);
|
|
||||||
});
|
|
||||||
|
|
||||||
return view;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+2
-2
@@ -47,8 +47,8 @@ public class DebugMenuDocumentTesterTopFragment extends Fragment {
|
|||||||
|
|
||||||
List<DebugMenuListItem> debugMenuDocTesterListItems = new ArrayList<>();
|
List<DebugMenuListItem> debugMenuDocTesterListItems = new ArrayList<>();
|
||||||
|
|
||||||
debugMenuDocTesterListItems.add(new DebugMenuListItem("DocumentListFragment", "DocumentListFragment", R.id.action_debugMenuDocumentTesterTopFragment_to_debugMenuDocumentTesterListFragment, true));
|
// debugMenuDocTesterListItems.add(new DebugMenuListItem("DocumentListFragment", "DocumentListFragment", R.id.action_debugMenuDocumentTesterTopFragment_to_debugMenuDocumentTesterListFragment, true));
|
||||||
debugMenuDocTesterListItems.add(new DebugMenuListItem("DocumentManagerFragment", "DocumentManagerFragment", R.id.action_debugMenuDocumentTesterTopFragment_to_debugMenuDocumentTesterManageFragment, true));
|
// debugMenuDocTesterListItems.add(new DebugMenuListItem("DocumentManagerFragment", "DocumentManagerFragment", R.id.action_debugMenuDocumentTesterTopFragment_to_debugMenuDocumentTesterManageFragment, true));
|
||||||
|
|
||||||
|
|
||||||
DebugMenuListItemAdapter adapter = new DebugMenuListItemAdapter(debugMenuDocTesterListItems);
|
DebugMenuListItemAdapter adapter = new DebugMenuListItemAdapter(debugMenuDocTesterListItems);
|
||||||
|
|||||||
+3
-3
@@ -57,13 +57,13 @@ public class DebugMenuLibraryItemListPageFragment extends Fragment {
|
|||||||
// Inflate the layout for this fragment
|
// Inflate the layout for this fragment
|
||||||
View view = inflater.inflate(R.layout.fragment_debug_menu_library_item_list_page, container, false);
|
View view = inflater.inflate(R.layout.fragment_debug_menu_library_item_list_page, container, false);
|
||||||
|
|
||||||
LibraryItemPage libraryItemPage = lacertaLibrary.getRecentDocument(10);
|
ArrayList<ListItem> listItems = lacertaLibrary.getRecentDocument(10);
|
||||||
for (ListItem listItem : libraryItemPage.getListItems()) {
|
for (ListItem listItem : listItems) {
|
||||||
System.out.println(listItem.getTitle());
|
System.out.println(listItem.getTitle());
|
||||||
}
|
}
|
||||||
|
|
||||||
RecyclerView recyclerView = view.findViewById(R.id.item_recycler_view);
|
RecyclerView recyclerView = view.findViewById(R.id.item_recycler_view);
|
||||||
recyclerView.setAdapter(new ItemAdapter(libraryItemPage.getListItems()));
|
recyclerView.setAdapter(new ItemAdapter(listItems));
|
||||||
|
|
||||||
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
|
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
|
||||||
|
|
||||||
|
|||||||
@@ -49,7 +49,8 @@ public class DebugMenuTopFragment extends Fragment {
|
|||||||
List<DebugMenuListItem> debugMenuListItems = new ArrayList<>();
|
List<DebugMenuListItem> debugMenuListItems = new ArrayList<>();
|
||||||
|
|
||||||
debugMenuListItems.add(new DebugMenuListItem("Document Tester", "placeholder", R.id.action_debugMenuTopFragment_to_debugMenuDocumentTesterTopFragment, true));
|
debugMenuListItems.add(new DebugMenuListItem("Document Tester", "placeholder", R.id.action_debugMenuTopFragment_to_debugMenuDocumentTesterTopFragment, true));
|
||||||
debugMenuListItems.add(new DebugMenuListItem("Scanner", "placeholder", R.id.action_debugMenuTopFragment_to_scannerDataManagerStubFragment, true));
|
debugMenuListItems.add(new DebugMenuListItem("ScannerStub", "placeholder", R.id.action_debugMenuTopFragment_to_scannerDataManagerStubFragment, true));
|
||||||
|
debugMenuListItems.add(new DebugMenuListItem("Scanner", "placeholder", R.id.action_debugMenuTopFragment_to_scannerManagerFragment, true));
|
||||||
debugMenuListItems.add(new DebugMenuListItem("Document List", "placeholder", R.id.action_debugMenuTopFragment_to_debugMenuLibraryItemListPageFragment, true));
|
debugMenuListItems.add(new DebugMenuListItem("Document List", "placeholder", R.id.action_debugMenuTopFragment_to_debugMenuLibraryItemListPageFragment, true));
|
||||||
debugMenuListItems.add(new DebugMenuListItem("VCS", "placeholder", R.id.action_debugMenuTopFragment_to_debugMenuVcsGeneralFragment, true));
|
debugMenuListItems.add(new DebugMenuListItem("VCS", "placeholder", R.id.action_debugMenuTopFragment_to_debugMenuVcsGeneralFragment, true));
|
||||||
|
|
||||||
|
|||||||
@@ -1,60 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
tools:context=".DebugMenuDocumentTesterManageFragment" >
|
|
||||||
|
|
||||||
<ScrollView
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="0dp"
|
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
|
||||||
app:layout_constraintTop_toTopOf="parent">
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="vertical" >
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:layout_margin="16dp"
|
|
||||||
android:background="@drawable/rounded_secondary_container">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/textView2"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:padding="16dp"
|
|
||||||
android:textSize="16sp"
|
|
||||||
android:textColor="@color/colorOnSecondaryContainer"
|
|
||||||
android:text="Debug actions" />
|
|
||||||
|
|
||||||
|
|
||||||
<com.google.android.material.textfield.TextInputEditText
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:hint="Document title"
|
|
||||||
android:id="@+id/edit_text_document_title"
|
|
||||||
android:layout_margin="16dp"
|
|
||||||
android:inputType="text"
|
|
||||||
android:textSize="16sp"
|
|
||||||
style="@style/ThemeOverlay.Material3.TextInputEditText.OutlinedBox" />
|
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
|
||||||
android:id="@+id/button_insert_test_data"
|
|
||||||
style="@style/Widget.Material3.Button.OutlinedButton"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_margin="16dp"
|
|
||||||
android:text="Insert test data"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
</LinearLayout>
|
|
||||||
</ScrollView>
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
||||||
@@ -11,6 +11,7 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:textSize="16sp"
|
android:textSize="16sp"
|
||||||
android:layout_marginEnd="8dp"
|
android:layout_marginEnd="8dp"
|
||||||
|
android:text="Placeholder Title"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent" />
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
@@ -19,8 +20,11 @@
|
|||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:textSize="14sp"
|
android:textSize="14sp"
|
||||||
|
android:text="Placeholder Description"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/debug_menu_item_title" />
|
app:layout_constraintTop_toBottomOf="@+id/debug_menu_item_title" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
@@ -22,29 +22,16 @@
|
|||||||
<action
|
<action
|
||||||
android:id="@+id/action_debugMenuTopFragment_to_debugMenuVcsGeneralFragment"
|
android:id="@+id/action_debugMenuTopFragment_to_debugMenuVcsGeneralFragment"
|
||||||
app:destination="@id/debugMenuVcsGeneralFragment" />
|
app:destination="@id/debugMenuVcsGeneralFragment" />
|
||||||
|
<action
|
||||||
|
android:id="@+id/action_debugMenuTopFragment_to_scannerManagerFragment"
|
||||||
|
app:destination="@id/scannerManagerFragment" />
|
||||||
</fragment>
|
</fragment>
|
||||||
<fragment
|
<fragment
|
||||||
android:id="@+id/debugMenuDocumentTesterTopFragment"
|
android:id="@+id/debugMenuDocumentTesterTopFragment"
|
||||||
android:name="one.nem.lacerta.feature.debug.DebugMenuDocumentTesterTopFragment"
|
android:name="one.nem.lacerta.feature.debug.DebugMenuDocumentTesterTopFragment"
|
||||||
android:label="fragment_debug_menu_document_tester_top"
|
android:label="fragment_debug_menu_document_tester_top"
|
||||||
tools:layout="@layout/fragment_debug_menu_document_tester_top" >
|
tools:layout="@layout/fragment_debug_menu_document_tester_top" >
|
||||||
<action
|
|
||||||
android:id="@+id/action_debugMenuDocumentTesterTopFragment_to_debugMenuDocumentTesterListFragment"
|
|
||||||
app:destination="@id/debugMenuDocumentTesterListFragment" />
|
|
||||||
<action
|
|
||||||
android:id="@+id/action_debugMenuDocumentTesterTopFragment_to_debugMenuDocumentTesterManageFragment"
|
|
||||||
app:destination="@id/debugMenuDocumentTesterManageFragment" />
|
|
||||||
</fragment>
|
</fragment>
|
||||||
<fragment
|
|
||||||
android:id="@+id/debugMenuDocumentTesterListFragment"
|
|
||||||
android:name="one.nem.lacerta.feature.debug.DebugMenuDocumentTesterListFragment"
|
|
||||||
android:label="fragment_debug_menu_document_tester_list"
|
|
||||||
tools:layout="@layout/fragment_debug_menu_document_tester_list" />
|
|
||||||
<fragment
|
|
||||||
android:id="@+id/debugMenuDocumentTesterManageFragment"
|
|
||||||
android:name="one.nem.lacerta.feature.debug.DebugMenuDocumentTesterManageFragment"
|
|
||||||
android:label="fragment_debug_menu_document_tester_manage"
|
|
||||||
tools:layout="@layout/fragment_debug_menu_document_tester_manage" />
|
|
||||||
<fragment
|
<fragment
|
||||||
android:id="@+id/scannerDataManagerStubFragment"
|
android:id="@+id/scannerDataManagerStubFragment"
|
||||||
android:name="one.nem.lacerta.component.scanner.ScannerDataManagerStubFragment"
|
android:name="one.nem.lacerta.component.scanner.ScannerDataManagerStubFragment"
|
||||||
@@ -84,4 +71,8 @@
|
|||||||
android:name="one.nem.lacerta.feature.debug.DebugMenuVcsRevRecordFragment"
|
android:name="one.nem.lacerta.feature.debug.DebugMenuVcsRevRecordFragment"
|
||||||
android:label="fragment_debug_menu_vcs_rev_record"
|
android:label="fragment_debug_menu_vcs_rev_record"
|
||||||
tools:layout="@layout/fragment_debug_menu_vcs_rev_record" />
|
tools:layout="@layout/fragment_debug_menu_vcs_rev_record" />
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/scannerManagerFragment"
|
||||||
|
android:name="one.nem.lacerta.component.scanner.ScannerManagerFragment"
|
||||||
|
android:label="ScannerManagerFragment" />
|
||||||
</navigation>
|
</navigation>
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
plugins {
|
plugins {
|
||||||
|
id 'com.google.dagger.hilt.android'
|
||||||
id 'com.android.library'
|
id 'com.android.library'
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -29,6 +30,8 @@ dependencies {
|
|||||||
|
|
||||||
implementation libs.androidx.appcompat
|
implementation libs.androidx.appcompat
|
||||||
implementation libs.com.google.android.material
|
implementation libs.com.google.android.material
|
||||||
|
implementation project(path: ':feature:debug')
|
||||||
|
implementation project(path: ':utils')
|
||||||
testImplementation libs.junit
|
testImplementation libs.junit
|
||||||
androidTestImplementation libs.androidx.test.ext.junit
|
androidTestImplementation libs.androidx.test.ext.junit
|
||||||
androidTestImplementation libs.androidx.test.espresso.core
|
androidTestImplementation libs.androidx.test.espresso.core
|
||||||
@@ -38,6 +41,20 @@ dependencies {
|
|||||||
implementation libs.navigation.ui
|
implementation libs.navigation.ui
|
||||||
implementation libs.navigation.dynamic.features.fragment
|
implementation libs.navigation.dynamic.features.fragment
|
||||||
|
|
||||||
|
// DI
|
||||||
|
implementation libs.com.google.dagger.hilt.android
|
||||||
|
annotationProcessor libs.com.google.dagger.hilt.compiler
|
||||||
|
|
||||||
// shared
|
// shared
|
||||||
implementation project(':shared:ui')
|
implementation project(':shared:ui')
|
||||||
|
|
||||||
|
// DI
|
||||||
|
implementation project(':data')
|
||||||
|
|
||||||
|
//model
|
||||||
|
implementation project(':model')
|
||||||
|
|
||||||
|
implementation "androidx.recyclerview:recyclerview:1.3.2"
|
||||||
|
|
||||||
|
implementation project(':component:common')
|
||||||
}
|
}
|
||||||
+2
@@ -22,5 +22,7 @@ public class ExampleInstrumentedTest {
|
|||||||
// Context of the app under test.
|
// Context of the app under test.
|
||||||
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
|
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
|
||||||
assertEquals("one.nem.lacerta.feature.home.test", appContext.getPackageName());
|
assertEquals("one.nem.lacerta.feature.home.test", appContext.getPackageName());
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,64 +1,122 @@
|
|||||||
package one.nem.lacerta.feature.home;
|
package one.nem.lacerta.feature.home;
|
||||||
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.util.Log;
|
||||||
import androidx.fragment.app.Fragment;
|
|
||||||
|
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.Menu;
|
||||||
|
import android.view.MenuInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
|
|
||||||
|
import androidx.appcompat.app.ActionBarDrawerToggle;
|
||||||
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
import androidx.appcompat.widget.Toolbar;
|
||||||
|
import androidx.core.content.ContextCompat;
|
||||||
|
import androidx.drawerlayout.widget.DrawerLayout;
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
|
import com.google.android.material.appbar.AppBarLayout;
|
||||||
|
import com.google.android.material.appbar.CollapsingToolbarLayout;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import dagger.hilt.android.AndroidEntryPoint;
|
||||||
|
import one.nem.lacerta.data.Document;
|
||||||
|
import one.nem.lacerta.data.LacertaLibrary;
|
||||||
|
import one.nem.lacerta.model.ListItem;
|
||||||
|
import one.nem.lacerta.model.document.DocumentMeta;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A simple {@link Fragment} subclass.
|
* A simple {@link Fragment} subclass.
|
||||||
* Use the {@link HomeTopFragment#newInstance} factory method to
|
* Use the {@link HomeTopFragment#newInstance} factory method to
|
||||||
* create an instance of this fragment.
|
* create an instance of this fragment.
|
||||||
*/
|
*/
|
||||||
|
@AndroidEntryPoint
|
||||||
public class HomeTopFragment extends Fragment {
|
public class HomeTopFragment extends Fragment {
|
||||||
|
|
||||||
// TODO: Rename parameter arguments, choose names that match
|
@Inject
|
||||||
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
|
LacertaLibrary lacertaLibrary;
|
||||||
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 HomeTopFragment() {
|
public HomeTopFragment() {
|
||||||
// Required empty public constructor
|
// Required empty public constructor
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public static HomeTopFragment newInstance() {
|
||||||
* 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 HomeTopFragment.
|
|
||||||
*/
|
|
||||||
// TODO: Rename and change types and number of parameters
|
|
||||||
public static HomeTopFragment newInstance(String param1, String param2) {
|
|
||||||
HomeTopFragment fragment = new HomeTopFragment();
|
HomeTopFragment fragment = new HomeTopFragment();
|
||||||
Bundle args = new Bundle();
|
Bundle args = new Bundle();
|
||||||
args.putString(ARG_PARAM1, param1);
|
|
||||||
args.putString(ARG_PARAM2, param2);
|
|
||||||
fragment.setArguments(args);
|
fragment.setArguments(args);
|
||||||
return fragment;
|
return fragment;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
if (getArguments() != null) {
|
|
||||||
mParam1 = getArguments().getString(ARG_PARAM1);
|
|
||||||
mParam2 = getArguments().getString(ARG_PARAM2);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||||
Bundle savedInstanceState) {
|
|
||||||
// Inflate the layout for this fragment
|
// Inflate the layout for this fragment
|
||||||
return inflater.inflate(R.layout.fragment_home_top, container, false);
|
View view = inflater.inflate(R.layout.fragment_home_top, container, false);
|
||||||
|
|
||||||
|
ArrayList<ListItem> recentDocument = lacertaLibrary.getRecentDocument(10);
|
||||||
|
|
||||||
|
Log.d("docs", Integer.toString(recentDocument.size()));
|
||||||
|
|
||||||
|
RecyclerView recyclerView = view.findViewById(R.id.home_item_recycler_view);
|
||||||
|
|
||||||
|
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
|
||||||
|
|
||||||
|
ListItemAdapter listItemAdapter = new ListItemAdapter(recentDocument);
|
||||||
|
|
||||||
|
recyclerView.setAdapter(listItemAdapter);
|
||||||
|
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onViewCreated(View view, Bundle savedInstanceState) {
|
||||||
|
super.onViewCreated(view, savedInstanceState);
|
||||||
|
|
||||||
|
CollapsingToolbarLayout collapsingToolbarLayout = view.findViewById(R.id.collapsing_toolbar);
|
||||||
|
Toolbar toolbar = view.findViewById(R.id.toolbar);
|
||||||
|
|
||||||
|
// Set the Toolbar
|
||||||
|
((AppCompatActivity)getActivity()).setSupportActionBar(toolbar);
|
||||||
|
|
||||||
|
// Set the title of the CollapsingToolbarLayout
|
||||||
|
collapsingToolbarLayout.setTitle("Lacerta");
|
||||||
|
|
||||||
|
AppBarLayout appBarLayout = view.findViewById(R.id.app_bar_layout);
|
||||||
|
appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
|
||||||
|
@Override
|
||||||
|
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
|
||||||
|
if (Math.abs(verticalOffset) == appBarLayout.getTotalScrollRange()) {
|
||||||
|
// Collapsed
|
||||||
|
getActivity().getWindow().setStatusBarColor(ContextCompat.getColor(getActivity(), one.nem.lacerta.shared.ui.R.color.colorSecondaryContainer));
|
||||||
|
} else if (verticalOffset == 0) {
|
||||||
|
// Expanded
|
||||||
|
getActivity().getWindow().setStatusBarColor(ContextCompat.getColor(getActivity(), one.nem.lacerta.shared.ui.R.color.colorSurface));
|
||||||
|
} else {
|
||||||
|
// Somewhere in between
|
||||||
|
// Here you can add a color transition if you want
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
package one.nem.lacerta.feature.home;
|
||||||
|
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import one.nem.lacerta.model.ListItem;
|
||||||
|
|
||||||
|
public class ListItemAdapter extends RecyclerView.Adapter<ListItemAdapter.ListItemViewHolder>{
|
||||||
|
|
||||||
|
ArrayList<ListItem> listItems;
|
||||||
|
|
||||||
|
public ListItemAdapter(ArrayList<ListItem> listItems){
|
||||||
|
this.listItems = listItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public ListItemAdapter.ListItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||||
|
View view = LayoutInflater.from(parent.getContext()).inflate(one.nem.lacerta.shared.ui.R.layout.common_list_item, parent, false);
|
||||||
|
return new ListItemViewHolder(view);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(@NonNull ListItemAdapter.ListItemViewHolder holder, int position) {
|
||||||
|
ListItem listItem = listItems.get(position);
|
||||||
|
holder.icon.setImageResource(listItem.getItemType().getIconId());
|
||||||
|
holder.icon.setColorFilter(one.nem.lacerta.shared.ui.R.color.colorOnSurface);
|
||||||
|
holder.title.setText(listItem.getTitle());
|
||||||
|
holder.description.setText(listItem.getDescription());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemCount() {
|
||||||
|
return listItems.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class ListItemViewHolder extends RecyclerView.ViewHolder{
|
||||||
|
|
||||||
|
ImageView icon;
|
||||||
|
TextView title;
|
||||||
|
TextView description;
|
||||||
|
public ListItemViewHolder(@NonNull View itemView) {
|
||||||
|
super(itemView);
|
||||||
|
|
||||||
|
icon = itemView.findViewById(one.nem.lacerta.shared.ui.R.id.item_icon);
|
||||||
|
title = itemView.findViewById(one.nem.lacerta.shared.ui.R.id.item_title);
|
||||||
|
description = itemView.findViewById(one.nem.lacerta.shared.ui.R.id.item_description);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
package one.nem.lacerta.feature.home;
|
||||||
|
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import one.nem.lacerta.model.ListItem;
|
||||||
|
import one.nem.lacerta.model.document.DocumentMeta;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyAdapterViewHolder> {
|
||||||
|
|
||||||
|
ArrayList<ListItem> listItems;
|
||||||
|
|
||||||
|
public MyAdapter(ArrayList<ListItem> listItems) {
|
||||||
|
this.listItems = listItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public MyAdapterViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||||
|
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_home_document, parent, false);
|
||||||
|
return new MyAdapterViewHolder(view);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(@NonNull MyAdapterViewHolder holder, int position) {
|
||||||
|
|
||||||
|
|
||||||
|
holder.title.setText(listItems.get(position).getTitle());
|
||||||
|
holder.description.setText(listItems.get(position).getDescription());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemCount() {
|
||||||
|
return listItems.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
public class MyAdapterViewHolder extends RecyclerView.ViewHolder {
|
||||||
|
|
||||||
|
TextView title;
|
||||||
|
|
||||||
|
TextView description;
|
||||||
|
|
||||||
|
public MyAdapterViewHolder(@NonNull View itemView) {
|
||||||
|
super(itemView);
|
||||||
|
|
||||||
|
title = itemView.findViewById(R.id.debug_menu_item_title);
|
||||||
|
description = itemView.findViewById(R.id.debug_menu_item_description);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,14 +1,50 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
tools:context=".HomeTopFragment">
|
android:background="@color/colorSurface">
|
||||||
|
|
||||||
<!-- TODO: Update blank fragment layout -->
|
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||||
<TextView
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent">
|
||||||
android:text="@string/hello_blank_fragment" />
|
|
||||||
|
<com.google.android.material.appbar.AppBarLayout
|
||||||
|
android:id="@+id/app_bar_layout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
|
<com.google.android.material.appbar.CollapsingToolbarLayout
|
||||||
|
android:id="@+id/collapsing_toolbar"
|
||||||
|
app:contentScrim="@color/colorSecondaryContainer"
|
||||||
|
android:background="@color/colorSurface"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="160dp"
|
||||||
|
android:fitsSystemWindows="true"
|
||||||
|
android:minHeight="?attr/actionBarSize"
|
||||||
|
app:collapsedTitleGravity="start|center_vertical"
|
||||||
|
app:expandedTitleGravity="start|bottom"
|
||||||
|
app:expandedTitleMarginBottom="16dp"
|
||||||
|
app:expandedTitleMarginStart="16dp"
|
||||||
|
app:expandedTitleTextAppearance="@style/TextAppearance.MaterialComponents.Headline4"
|
||||||
|
app:layout_scrollFlags="scroll|exitUntilCollapsed">
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.Toolbar
|
||||||
|
android:id="@+id/toolbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
app:layout_collapseMode="pin"
|
||||||
|
app:title="HOGE" />
|
||||||
|
|
||||||
|
</com.google.android.material.appbar.CollapsingToolbarLayout>
|
||||||
|
|
||||||
|
</com.google.android.material.appbar.AppBarLayout>
|
||||||
|
|
||||||
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
|
android:id="@+id/home_item_recycler_view"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
|
||||||
|
|
||||||
|
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||||
|
|
||||||
</FrameLayout>
|
</FrameLayout>
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:padding="16dp">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/debug_menu_item_title"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textSize="16sp"
|
||||||
|
android:layout_marginEnd="8dp"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/debug_menu_item_description"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textSize="14sp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/debug_menu_item_title" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/debug_menu_item_updated_at_home"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textSize="14sp"
|
||||||
|
android:text="Updated at: aaaaaaaaaa"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/item_placeholder"
|
||||||
|
android:icon="@drawable/developer_mode_24px"
|
||||||
|
android:title="@string/placeholder" />
|
||||||
|
</menu>
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<item name="my_recycler_view" type="id" />
|
||||||
|
<item name="TITLE" type="id" />
|
||||||
|
<item name="textView" type="id" />
|
||||||
|
</resources>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources></resources>
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<!-- TODO: Remove or change this placeholder text -->
|
<!-- TODO: Remove or change this placeholder text -->
|
||||||
<string name="hello_blank_fragment">Hello blank fragment</string>
|
<string name="hello_blank_fragment">Hello blank fragment</string>
|
||||||
|
<string name="textview">TextView</string>
|
||||||
</resources>
|
</resources>
|
||||||
+8
-6
@@ -25,6 +25,8 @@ import one.nem.lacerta.data.Document;
|
|||||||
import one.nem.lacerta.model.document.DocumentMeta;
|
import one.nem.lacerta.model.document.DocumentMeta;
|
||||||
import one.nem.lacerta.model.document.tag.DocumentTag;
|
import one.nem.lacerta.model.document.tag.DocumentTag;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A simple {@link Fragment} subclass.
|
* A simple {@link Fragment} subclass.
|
||||||
* Use the {@link LibraryTopFragment#newInstance} factory method to
|
* Use the {@link LibraryTopFragment#newInstance} factory method to
|
||||||
@@ -33,8 +35,8 @@ import one.nem.lacerta.model.document.tag.DocumentTag;
|
|||||||
@AndroidEntryPoint
|
@AndroidEntryPoint
|
||||||
public class LibraryTopFragment extends Fragment {
|
public class LibraryTopFragment extends Fragment {
|
||||||
|
|
||||||
@Inject
|
// @Inject
|
||||||
Document document;
|
// Document document;
|
||||||
|
|
||||||
// TODO: Rename parameter arguments, choose names that match
|
// TODO: Rename parameter arguments, choose names that match
|
||||||
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
|
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
|
||||||
@@ -90,13 +92,13 @@ public class LibraryTopFragment extends Fragment {
|
|||||||
|
|
||||||
//データを取得
|
//データを取得
|
||||||
|
|
||||||
List<DocumentMeta> metas = document.getAllDocumentMetas(100);
|
// List<DocumentMeta> metas = document.getAllDocumentMetas(100);
|
||||||
|
|
||||||
Toast.makeText(getContext(), "Documents: " + Integer.toString(metas.size()), Toast.LENGTH_LONG).show();
|
// Toast.makeText(getContext(), "Documents: " + Integer.toString(metas.size()), Toast.LENGTH_LONG).show();
|
||||||
|
|
||||||
// Create and set the adapter
|
// Create and set the adapter
|
||||||
DocumentAdapter adapter = new DocumentAdapter(metas);
|
// DocumentAdapter adapter = new DocumentAdapter(metas);
|
||||||
documentRecyclerView.setAdapter(adapter);
|
// documentRecyclerView.setAdapter(adapter);
|
||||||
|
|
||||||
// Use a LinearLayoutManager to specify the layout
|
// Use a LinearLayoutManager to specify the layout
|
||||||
return view;
|
return view;
|
||||||
|
|||||||
@@ -27,9 +27,17 @@ android {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|
||||||
implementation 'androidx.appcompat:appcompat:1.6.1'
|
implementation libs.androidx.appcompat
|
||||||
implementation 'com.google.android.material:material:1.10.0'
|
implementation libs.com.google.android.material
|
||||||
testImplementation 'junit:junit:4.13.2'
|
testImplementation libs.junit
|
||||||
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
|
androidTestImplementation libs.androidx.test.ext.junit
|
||||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
|
androidTestImplementation libs.androidx.test.espresso.core
|
||||||
|
|
||||||
|
// Navigation
|
||||||
|
implementation libs.navigation.fragment
|
||||||
|
implementation libs.navigation.ui
|
||||||
|
implementation libs.navigation.dynamic.features.fragment
|
||||||
|
|
||||||
|
// shared
|
||||||
|
implementation project(':shared:ui')
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,142 @@
|
|||||||
|
package one.nem.lacerta.feature.search;
|
||||||
|
|
||||||
|
import android.app.LauncherActivity;
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.Menu;
|
||||||
|
import android.view.MenuInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.SearchView;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A simple {@link Fragment} subclass.
|
||||||
|
* Use the {@link SearchTopFragment#newInstance} factory method to
|
||||||
|
* create an instance of this fragment.
|
||||||
|
*/
|
||||||
|
public class SearchTopFragment extends Fragment {
|
||||||
|
private static final String TAG = SearchTopFragment.class.getSimpleName();
|
||||||
|
private final SearchTopFragment self = this;
|
||||||
|
|
||||||
|
private SearchView searchView;
|
||||||
|
private String searchWord;
|
||||||
|
|
||||||
|
// 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 SearchTopFragment() {
|
||||||
|
// 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 SearchTopFragment.
|
||||||
|
*/
|
||||||
|
// TODO: Rename and change types and number of parameters
|
||||||
|
public static SearchTopFragment newInstance(String param1, String param2) {
|
||||||
|
SearchTopFragment fragment = new SearchTopFragment();
|
||||||
|
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_search_top, container, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
||||||
|
super.onCreateOptionsMenu(menu, inflater);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
this.searchView.setIconifiedByDefault(true);
|
||||||
|
|
||||||
|
|
||||||
|
this.searchView.setSubmitButtonEnabled(false);
|
||||||
|
|
||||||
|
|
||||||
|
if (!this.searchWord.equals("")) {
|
||||||
|
|
||||||
|
this.searchView.setQuery(this.searchWord, false);
|
||||||
|
} else {
|
||||||
|
String queryHint = self.getResources().getString(R.string.hello_blank_fragment);
|
||||||
|
|
||||||
|
this.searchView.setQueryHint(queryHint);
|
||||||
|
}
|
||||||
|
this.searchView.setOnQueryTextListener(self.onQueryTextListener);
|
||||||
|
}
|
||||||
|
|
||||||
|
private final SearchView.OnQueryTextListener onQueryTextListener = new SearchView.OnQueryTextListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onQueryTextSubmit(String query) {
|
||||||
|
|
||||||
|
return self.setSearchWord(searchWord);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onQueryTextChange(String query) {
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
private boolean setSearchWord(String query) {
|
||||||
|
|
||||||
|
|
||||||
|
if (searchWord != null && !searchWord.equals("")) {
|
||||||
|
|
||||||
|
this.searchWord = searchWord;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.searchView.setIconified(false);
|
||||||
|
|
||||||
|
this.searchView.onActionViewCollapsed();
|
||||||
|
|
||||||
|
this.searchView.clearFocus();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
interface LacertaSearch {
|
||||||
|
ArrayList<LauncherActivity.ListItem> autoSearch(String query, int limit);
|
||||||
|
|
||||||
|
ArrayList<LauncherActivity.ListItem> autoSearch(String query, int limit, int offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
tools:context=".SearchTopFragment">
|
||||||
|
|
||||||
|
<!-- TODO: Update blank fragment layout -->
|
||||||
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
|
android:id="@+id/Search_tool_bar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="69dp"
|
||||||
|
android:background="#E4E8EA"
|
||||||
|
android:minHeight="?attr/actionBarSize"
|
||||||
|
android:theme="?attr/actionBarTheme"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:title="" />
|
||||||
|
|
||||||
|
<SearchView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent" />
|
||||||
|
|
||||||
|
|
||||||
|
</FrameLayout>
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/feature_search_navigation"
|
||||||
|
app:startDestination="@id/searchTopFragment">
|
||||||
|
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/searchTopFragment"
|
||||||
|
android:name="one.nem.lacerta.feature.search.SearchTopFragment"
|
||||||
|
android:label="fragment_search_top"
|
||||||
|
tools:layout="@layout/fragment_search_top" />
|
||||||
|
</navigation>
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
<resources>
|
||||||
|
<!-- TODO: Remove or change this placeholder text -->
|
||||||
|
<string name="hello_blank_fragment">Hello blank fragment</string>
|
||||||
|
</resources>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
/build
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
plugins {
|
||||||
|
alias(libs.plugins.com.android.library)
|
||||||
|
}
|
||||||
|
|
||||||
|
android {
|
||||||
|
namespace 'one.nem.lacerta.setting'
|
||||||
|
compileSdk 34
|
||||||
|
|
||||||
|
defaultConfig {
|
||||||
|
minSdk 26
|
||||||
|
|
||||||
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
consumerProguardFiles "consumer-rules.pro"
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
minifyEnabled false
|
||||||
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility JavaVersion.VERSION_1_8
|
||||||
|
targetCompatibility JavaVersion.VERSION_1_8
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
|
||||||
|
implementation libs.androidx.appcompat
|
||||||
|
implementation libs.com.google.android.material
|
||||||
|
testImplementation libs.junit
|
||||||
|
androidTestImplementation libs.androidx.test.ext.junit
|
||||||
|
androidTestImplementation libs.androidx.test.espresso.core
|
||||||
|
|
||||||
|
// Navigation
|
||||||
|
implementation libs.navigation.fragment
|
||||||
|
implementation libs.navigation.ui
|
||||||
|
implementation libs.navigation.dynamic.features.fragment
|
||||||
|
|
||||||
|
// DI
|
||||||
|
implementation libs.com.google.dagger.hilt.android
|
||||||
|
annotationProcessor libs.com.google.dagger.hilt.compiler
|
||||||
|
|
||||||
|
// shared
|
||||||
|
implementation project(':shared:ui')
|
||||||
|
|
||||||
|
}
|
||||||
File renamed without changes.
Vendored
+21
@@ -0,0 +1,21 @@
|
|||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# You can control the set of applied configuration files using the
|
||||||
|
# proguardFiles setting in build.gradle.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# If your project uses WebView with JS, uncomment the following
|
||||||
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
|
# class:
|
||||||
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
|
# public *;
|
||||||
|
#}
|
||||||
|
|
||||||
|
# Uncomment this to preserve the line number information for
|
||||||
|
# debugging stack traces.
|
||||||
|
#-keepattributes SourceFile,LineNumberTable
|
||||||
|
|
||||||
|
# If you keep the line number information, uncomment this to
|
||||||
|
# hide the original source file name.
|
||||||
|
#-renamesourcefileattribute SourceFile
|
||||||
+26
@@ -0,0 +1,26 @@
|
|||||||
|
package one.nem.lacerta.setting;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import androidx.test.platform.app.InstrumentationRegistry;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instrumented test, which will execute on an Android device.
|
||||||
|
*
|
||||||
|
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
|
||||||
|
*/
|
||||||
|
@RunWith(AndroidJUnit4.class)
|
||||||
|
public class ExampleInstrumentedTest {
|
||||||
|
@Test
|
||||||
|
public void useAppContext() {
|
||||||
|
// Context of the app under test.
|
||||||
|
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
|
||||||
|
assertEquals("one.nem.lacerta.setting.test", appContext.getPackageName());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
</manifest>
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
package one.nem.lacerta.setting;
|
||||||
|
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.navigation.Navigation;
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import one.nem.lacerta.setting.model.SettingListItem;
|
||||||
|
|
||||||
|
public class ListItemAdapter extends RecyclerView.Adapter<ListItemAdapter.ListItemViewHolder>{
|
||||||
|
|
||||||
|
ArrayList<SettingListItem> listItems;
|
||||||
|
|
||||||
|
public ListItemAdapter(ArrayList<SettingListItem> listItems){
|
||||||
|
this.listItems = listItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public ListItemAdapter.ListItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||||
|
View view = LayoutInflater.from(parent.getContext()).inflate(one.nem.lacerta.shared.ui.R.layout.common_list_item, parent, false);
|
||||||
|
return new ListItemViewHolder(view);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(@NonNull ListItemAdapter.ListItemViewHolder holder, int position) {
|
||||||
|
SettingListItem listItem = listItems.get(position);
|
||||||
|
holder.icon.setImageDrawable(listItem.getIcon());
|
||||||
|
holder.icon.setColorFilter(one.nem.lacerta.shared.ui.R.color.colorOnSurface);
|
||||||
|
holder.title.setText(listItem.getTitle());
|
||||||
|
holder.description.setText(listItem.getDescription());
|
||||||
|
|
||||||
|
holder.itemView.setOnClickListener( v -> {
|
||||||
|
Navigation.findNavController(v).navigate(listItem.getDestination());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemCount() {
|
||||||
|
return listItems.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class ListItemViewHolder extends RecyclerView.ViewHolder{
|
||||||
|
|
||||||
|
ImageView icon;
|
||||||
|
TextView title;
|
||||||
|
TextView description;
|
||||||
|
public ListItemViewHolder(@NonNull View itemView) {
|
||||||
|
super(itemView);
|
||||||
|
|
||||||
|
icon = itemView.findViewById(one.nem.lacerta.shared.ui.R.id.item_icon);
|
||||||
|
title = itemView.findViewById(one.nem.lacerta.shared.ui.R.id.item_title);
|
||||||
|
description = itemView.findViewById(one.nem.lacerta.shared.ui.R.id.item_description);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package one.nem.lacerta.setting;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A simple {@link Fragment} subclass.
|
||||||
|
* Use the {@link SettingAboutPageFragment#newInstance} factory method to
|
||||||
|
* create an instance of this fragment.
|
||||||
|
*/
|
||||||
|
public class SettingAboutPageFragment extends Fragment {
|
||||||
|
|
||||||
|
public SettingAboutPageFragment() {
|
||||||
|
// Required empty public constructor
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SettingAboutPageFragment newInstance() {
|
||||||
|
SettingAboutPageFragment fragment = new SettingAboutPageFragment();
|
||||||
|
Bundle args = new Bundle();
|
||||||
|
fragment.setArguments(args);
|
||||||
|
return fragment;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||||
|
Bundle savedInstanceState) {
|
||||||
|
// Inflate the layout for this fragment
|
||||||
|
View view = inflater.inflate(R.layout.fragment_setting_about_page, container, false);
|
||||||
|
|
||||||
|
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
package one.nem.lacerta.setting;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A simple {@link Fragment} subclass.
|
||||||
|
* Use the {@link SettingDataPageFragment#newInstance} factory method to
|
||||||
|
* create an instance of this fragment.
|
||||||
|
*/
|
||||||
|
public class SettingDataPageFragment extends Fragment {
|
||||||
|
|
||||||
|
public SettingDataPageFragment() {
|
||||||
|
// Required empty public constructor
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SettingDataPageFragment newInstance() {
|
||||||
|
SettingDataPageFragment fragment = new SettingDataPageFragment();
|
||||||
|
Bundle args = new Bundle();
|
||||||
|
fragment.setArguments(args);
|
||||||
|
return fragment;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||||
|
Bundle savedInstanceState) {
|
||||||
|
// Inflate the layout for this fragment
|
||||||
|
return inflater.inflate(R.layout.fragment_setting_data_page, container, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
package one.nem.lacerta.setting;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A simple {@link Fragment} subclass.
|
||||||
|
* Use the {@link SettingDisplayPageFragment#newInstance} factory method to
|
||||||
|
* create an instance of this fragment.
|
||||||
|
*/
|
||||||
|
public class SettingDisplayPageFragment extends Fragment {
|
||||||
|
|
||||||
|
public SettingDisplayPageFragment() {
|
||||||
|
// Required empty public constructor
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SettingDisplayPageFragment newInstance() {
|
||||||
|
SettingDisplayPageFragment fragment = new SettingDisplayPageFragment();
|
||||||
|
Bundle args = new Bundle();
|
||||||
|
fragment.setArguments(args);
|
||||||
|
return fragment;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||||
|
Bundle savedInstanceState) {
|
||||||
|
// Inflate the layout for this fragment
|
||||||
|
return inflater.inflate(R.layout.fragment_setting_display_page, container, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
package one.nem.lacerta.setting;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A simple {@link Fragment} subclass.
|
||||||
|
* Use the {@link SettingScanPageFragment#newInstance} factory method to
|
||||||
|
* create an instance of this fragment.
|
||||||
|
*/
|
||||||
|
public class SettingScanPageFragment extends Fragment {
|
||||||
|
|
||||||
|
public SettingScanPageFragment() {
|
||||||
|
// Required empty public constructor
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SettingScanPageFragment newInstance() {
|
||||||
|
SettingScanPageFragment fragment = new SettingScanPageFragment();
|
||||||
|
Bundle args = new Bundle();
|
||||||
|
fragment.setArguments(args);
|
||||||
|
return fragment;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||||
|
Bundle savedInstanceState) {
|
||||||
|
// Inflate the layout for this fragment
|
||||||
|
return inflater.inflate(R.layout.fragment_setting_scan_page, container, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
package one.nem.lacerta.setting;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import androidx.core.content.ContextCompat;
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import one.nem.lacerta.setting.model.SettingListItem;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A simple {@link Fragment} subclass.
|
||||||
|
* Use the {@link SettingTopFragment#newInstance} factory method to
|
||||||
|
* create an instance of this fragment.
|
||||||
|
*/
|
||||||
|
public class SettingTopFragment extends Fragment {
|
||||||
|
|
||||||
|
public SettingTopFragment() {
|
||||||
|
// Required empty public constructor
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SettingTopFragment newInstance() {
|
||||||
|
SettingTopFragment fragment = new SettingTopFragment();
|
||||||
|
Bundle args = new Bundle();
|
||||||
|
fragment.setArguments(args);
|
||||||
|
return fragment;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||||
|
Bundle savedInstanceState) {
|
||||||
|
// Inflate the layout for this fragment
|
||||||
|
View view = inflater.inflate(R.layout.fragment_setting_top, container, false);
|
||||||
|
|
||||||
|
// Setting items
|
||||||
|
ArrayList<SettingListItem> settingListItems = new ArrayList<>();
|
||||||
|
settingListItems.add(
|
||||||
|
new SettingListItem(
|
||||||
|
getResources().getString(one.nem.lacerta.shared.ui.R.string.setting_top_display_title),
|
||||||
|
getResources().getString(one.nem.lacerta.shared.ui.R.string.setting_top_display_description),
|
||||||
|
ContextCompat.getDrawable(getContext(), one.nem.lacerta.shared.ui.R.drawable.palette_24px),
|
||||||
|
R.id.action_settingTopFragment_to_settingDisplayPageFragment
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
settingListItems.add(
|
||||||
|
new SettingListItem(
|
||||||
|
getResources().getString(one.nem.lacerta.shared.ui.R.string.setting_top_data_title),
|
||||||
|
getResources().getString(one.nem.lacerta.shared.ui.R.string.setting_top_data_description),
|
||||||
|
ContextCompat.getDrawable(getContext(), one.nem.lacerta.shared.ui.R.drawable.settings_backup_restore_24px),
|
||||||
|
R.id.action_settingTopFragment_to_settingDataPageFragment
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
settingListItems.add(
|
||||||
|
new SettingListItem(
|
||||||
|
getResources().getString(one.nem.lacerta.shared.ui.R.string.setting_top_scan_title),
|
||||||
|
getResources().getString(one.nem.lacerta.shared.ui.R.string.setting_top_scan_description),
|
||||||
|
ContextCompat.getDrawable(getContext(), one.nem.lacerta.shared.ui.R.drawable.document_scanner_24px),
|
||||||
|
R.id.action_settingTopFragment_to_settingScanPageFragment
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
settingListItems.add(
|
||||||
|
new SettingListItem(
|
||||||
|
getResources().getString(one.nem.lacerta.shared.ui.R.string.setting_top_about_title),
|
||||||
|
getResources().getString(one.nem.lacerta.shared.ui.R.string.setting_top_about_description),
|
||||||
|
ContextCompat.getDrawable(getContext(), one.nem.lacerta.shared.ui.R.drawable.info_24px),
|
||||||
|
R.id.action_settingTopFragment_to_settingAboutPageFragment
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Init RecyclerView
|
||||||
|
RecyclerView recyclerView = view.findViewById(R.id.setting_item_recycler_view);
|
||||||
|
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
|
||||||
|
recyclerView.setAdapter(new ListItemAdapter(settingListItems));
|
||||||
|
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
package one.nem.lacerta.setting.model;
|
||||||
|
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
|
|
||||||
|
public class SettingListItem {
|
||||||
|
|
||||||
|
String title;
|
||||||
|
String description;
|
||||||
|
Drawable icon;
|
||||||
|
int destination;
|
||||||
|
|
||||||
|
public SettingListItem(String title, String description, Drawable icon, int destination) {
|
||||||
|
this.title = title;
|
||||||
|
this.description = description;
|
||||||
|
this.icon = icon;
|
||||||
|
this.destination = destination;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Drawable getIcon() {
|
||||||
|
return icon;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getDestination() {
|
||||||
|
return destination;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
tools:context=".SettingAboutPageFragment">
|
||||||
|
|
||||||
|
<!-- TODO: Update blank fragment layout -->
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:text="@string/hello_blank_fragment" />
|
||||||
|
|
||||||
|
</FrameLayout>
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
tools:context=".SettingDataPageFragment">
|
||||||
|
|
||||||
|
<!-- TODO: Update blank fragment layout -->
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:text="@string/hello_blank_fragment" />
|
||||||
|
|
||||||
|
</FrameLayout>
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
tools:context=".SettingDisplayPageFragment">
|
||||||
|
|
||||||
|
<!-- TODO: Update blank fragment layout -->
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:text="@string/hello_blank_fragment" />
|
||||||
|
|
||||||
|
</FrameLayout>
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
tools:context=".SettingScanPageFragment">
|
||||||
|
|
||||||
|
<!-- TODO: Update blank fragment layout -->
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:text="@string/hello_blank_fragment" />
|
||||||
|
|
||||||
|
</FrameLayout>
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="@color/colorSurface">
|
||||||
|
|
||||||
|
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<com.google.android.material.appbar.AppBarLayout
|
||||||
|
android:id="@+id/app_bar_layout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
|
<com.google.android.material.appbar.CollapsingToolbarLayout
|
||||||
|
android:id="@+id/collapsing_toolbar"
|
||||||
|
app:contentScrim="@color/colorSecondaryContainer"
|
||||||
|
android:background="@color/colorSurface"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="160dp"
|
||||||
|
android:fitsSystemWindows="true"
|
||||||
|
android:minHeight="?attr/actionBarSize"
|
||||||
|
app:collapsedTitleGravity="start|center_vertical"
|
||||||
|
app:expandedTitleGravity="start|bottom"
|
||||||
|
app:expandedTitleMarginBottom="16dp"
|
||||||
|
app:expandedTitleMarginStart="16dp"
|
||||||
|
app:expandedTitleTextAppearance="@style/TextAppearance.MaterialComponents.Headline4"
|
||||||
|
app:layout_scrollFlags="scroll|exitUntilCollapsed">
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.Toolbar
|
||||||
|
android:id="@+id/toolbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
app:layout_collapseMode="pin"
|
||||||
|
app:title="@string/setting_title" />
|
||||||
|
|
||||||
|
</com.google.android.material.appbar.CollapsingToolbarLayout>
|
||||||
|
|
||||||
|
</com.google.android.material.appbar.AppBarLayout>
|
||||||
|
|
||||||
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
|
android:id="@+id/setting_item_recycler_view"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
|
||||||
|
|
||||||
|
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||||
|
|
||||||
|
</FrameLayout>
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/feature_setting_navigation"
|
||||||
|
app:startDestination="@id/settingTopFragment">
|
||||||
|
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/settingTopFragment"
|
||||||
|
android:name="one.nem.lacerta.setting.SettingTopFragment"
|
||||||
|
android:label="SettingTopFragment" >
|
||||||
|
<action
|
||||||
|
android:id="@+id/action_settingTopFragment_to_settingAboutPageFragment"
|
||||||
|
app:destination="@id/settingAboutPageFragment"
|
||||||
|
app:enterAnim="@anim/slide_from_right"
|
||||||
|
app:exitAnim="@anim/slide_to_left"
|
||||||
|
app:popEnterAnim="@anim/slide_from_left"
|
||||||
|
app:popExitAnim="@anim/slide_to_right" />
|
||||||
|
<action
|
||||||
|
android:id="@+id/action_settingTopFragment_to_settingDisplayPageFragment"
|
||||||
|
app:destination="@id/settingDisplayPageFragment"
|
||||||
|
app:enterAnim="@anim/slide_from_right"
|
||||||
|
app:exitAnim="@anim/slide_to_left"
|
||||||
|
app:popEnterAnim="@anim/slide_from_left"
|
||||||
|
app:popExitAnim="@anim/slide_to_right" />
|
||||||
|
<action
|
||||||
|
android:id="@+id/action_settingTopFragment_to_settingDataPageFragment"
|
||||||
|
app:destination="@id/settingDataPageFragment"
|
||||||
|
app:enterAnim="@anim/slide_from_right"
|
||||||
|
app:exitAnim="@anim/slide_to_left"
|
||||||
|
app:popEnterAnim="@anim/slide_from_left"
|
||||||
|
app:popExitAnim="@anim/slide_to_right" />
|
||||||
|
<action
|
||||||
|
android:id="@+id/action_settingTopFragment_to_settingScanPageFragment"
|
||||||
|
app:destination="@id/settingScanPageFragment"
|
||||||
|
app:enterAnim="@anim/slide_from_right"
|
||||||
|
app:exitAnim="@anim/slide_to_left"
|
||||||
|
app:popEnterAnim="@anim/slide_from_left"
|
||||||
|
app:popExitAnim="@anim/slide_to_right" />
|
||||||
|
</fragment>
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/settingAboutPageFragment"
|
||||||
|
android:name="one.nem.lacerta.setting.SettingAboutPageFragment"
|
||||||
|
android:label="fragment_setting_about_page"
|
||||||
|
tools:layout="@layout/fragment_setting_about_page" />
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/settingDataPageFragment"
|
||||||
|
android:name="one.nem.lacerta.setting.SettingDataPageFragment"
|
||||||
|
android:label="fragment_setting_data_page"
|
||||||
|
tools:layout="@layout/fragment_setting_data_page" />
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/settingDisplayPageFragment"
|
||||||
|
android:name="one.nem.lacerta.setting.SettingDisplayPageFragment"
|
||||||
|
android:label="fragment_setting_display_page"
|
||||||
|
tools:layout="@layout/fragment_setting_display_page" />
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/settingScanPageFragment"
|
||||||
|
android:name="one.nem.lacerta.setting.SettingScanPageFragment"
|
||||||
|
android:label="fragment_setting_scan_page"
|
||||||
|
tools:layout="@layout/fragment_setting_scan_page" />
|
||||||
|
</navigation>
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
<resources>
|
||||||
|
<!-- TODO: Remove or change this placeholder text -->
|
||||||
|
<string name="hello_blank_fragment">Hello blank fragment</string>
|
||||||
|
</resources>
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package one.nem.lacerta.setting;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Example local unit test, which will execute on the development machine (host).
|
||||||
|
*
|
||||||
|
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
|
||||||
|
*/
|
||||||
|
public class ExampleUnitTest {
|
||||||
|
@Test
|
||||||
|
public void addition_isCorrect() {
|
||||||
|
assertEquals(4, 2 + 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -65,4 +65,10 @@ public class PublicPath {
|
|||||||
public String getStringPath() {
|
public String getStringPath() {
|
||||||
return String.join("/", path);
|
return String.join("/", path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public PublicPath getRoot() {
|
||||||
|
PublicPath root = new PublicPath();
|
||||||
|
root.add("/");
|
||||||
|
return root;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -3,12 +3,14 @@ package one.nem.lacerta.model.document;
|
|||||||
import org.eclipse.jgit.lib.Repository;
|
import org.eclipse.jgit.lib.Repository;
|
||||||
|
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
import one.nem.lacerta.model.document.path.DocumentPath;
|
import one.nem.lacerta.model.document.path.DocumentPath;
|
||||||
import one.nem.lacerta.model.PublicPath;
|
|
||||||
import one.nem.lacerta.model.document.DocumentMeta;
|
import one.nem.lacerta.model.document.DocumentMeta;
|
||||||
|
|
||||||
|
import one.nem.lacerta.model.document.page.Page;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ドキュメントの詳細データ
|
* ドキュメントの詳細データ
|
||||||
*/
|
*/
|
||||||
@@ -20,31 +22,21 @@ public class DocumentDetail {
|
|||||||
DocumentMeta meta;
|
DocumentMeta meta;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ユーザーが扱うパス
|
* ドキュメントのページ(Pageインスタンスのリスト)
|
||||||
*/
|
*/
|
||||||
PublicPath publicPath;
|
ArrayList<Page> pages;
|
||||||
|
|
||||||
/**
|
|
||||||
* ドキュメントの作者(String)
|
|
||||||
*/
|
|
||||||
String author;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ドキュメントのデフォルトブランチ(String)
|
|
||||||
*/
|
|
||||||
String defaultBranch;
|
|
||||||
|
|
||||||
Repository repository;
|
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
public DocumentDetail() {
|
public DocumentDetail() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public DocumentDetail(DocumentMeta meta, PublicPath publicPath, String author, String defaultBranch) {
|
public DocumentDetail(DocumentMeta meta) {
|
||||||
this.meta = meta;
|
this.meta = meta;
|
||||||
this.publicPath = publicPath;
|
}
|
||||||
this.author = author;
|
|
||||||
this.defaultBranch = defaultBranch;
|
public DocumentDetail(DocumentMeta meta, ArrayList<Page> pages) {
|
||||||
|
this.meta = meta;
|
||||||
|
this.pages = pages;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Getter
|
// Getter
|
||||||
@@ -57,34 +49,12 @@ public class DocumentDetail {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ユーザーが扱うパスを取得する
|
* ドキュメントのページ(Pageインスタンスのリスト)を取得する
|
||||||
*/
|
*/
|
||||||
public PublicPath getPublicPath() {
|
public ArrayList<Page> getPages() {
|
||||||
return publicPath;
|
return pages;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* ドキュメントの作者(String)を取得する
|
|
||||||
*/
|
|
||||||
public String getAuthor() {
|
|
||||||
return author;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ドキュメントのデフォルトブランチ(String)を取得する
|
|
||||||
*/
|
|
||||||
public String getDefaultBranch() {
|
|
||||||
return defaultBranch;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ドキュメントのリポジトリを取得する
|
|
||||||
*/
|
|
||||||
public Repository getRepository() {
|
|
||||||
return repository;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Setter
|
// Setter
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -96,34 +66,13 @@ public class DocumentDetail {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ユーザーが扱うパスを設定する
|
* ドキュメントのページ(Pageインスタンスのリスト)を設定する
|
||||||
* @param publicPath ユーザーが扱うパス
|
* @param pages Pageインスタンスのリスト
|
||||||
*/
|
*/
|
||||||
public void setPublicPath(PublicPath publicPath) {
|
public void setPages(ArrayList<Page> pages) {
|
||||||
this.publicPath = publicPath;
|
this.pages = pages;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* ドキュメントの作者(String)を設定する
|
|
||||||
* @param author ドキュメントの作者
|
|
||||||
*/
|
|
||||||
public void setAuthor(String author) {
|
|
||||||
this.author = author;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* ドキュメントのデフォルトブランチ(String)を設定する
|
|
||||||
* @param defaultBranch ドキュメントのデフォルトブランチ
|
|
||||||
*/
|
|
||||||
public void setDefaultBranch(String defaultBranch) {
|
|
||||||
this.defaultBranch = defaultBranch;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ドキュメントのリポジトリを設定する
|
|
||||||
*/
|
|
||||||
public void setRepository(Repository repository) {
|
|
||||||
this.repository = repository;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
package one.nem.lacerta.model.document;
|
package one.nem.lacerta.model.document;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import one.nem.lacerta.model.PublicPath;
|
||||||
import one.nem.lacerta.model.document.tag.DocumentTag;
|
import one.nem.lacerta.model.document.tag.DocumentTag;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -9,7 +11,7 @@ import java.util.UUID;
|
|||||||
/**
|
/**
|
||||||
* ドキュメントのメタデータ
|
* ドキュメントのメタデータ
|
||||||
*/
|
*/
|
||||||
public class DocumentMeta {
|
public class DocumentMeta { // TODO-rca: JavaDoc対応
|
||||||
/**
|
/**
|
||||||
* ドキュメントのID(String)
|
* ドキュメントのID(String)
|
||||||
*/
|
*/
|
||||||
@@ -35,42 +37,63 @@ public class DocumentMeta {
|
|||||||
*/
|
*/
|
||||||
List<DocumentTag> tags;
|
List<DocumentTag> tags;
|
||||||
|
|
||||||
|
PublicPath path;
|
||||||
|
|
||||||
|
String author;
|
||||||
|
|
||||||
|
String defaultBranch;
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
|
|
||||||
public DocumentMeta() {
|
public DocumentMeta() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public DocumentMeta(String id, String title, Date updatedAt, Date createdAt, List<DocumentTag> tags) { // With all
|
public DocumentMeta(String title) {
|
||||||
|
this.id = UUID.randomUUID().toString();
|
||||||
|
this.title = title;
|
||||||
|
this.tags = new ArrayList<>();
|
||||||
|
this.author = ""; // TODO-rca: 作者のデフォルト値を設定できるようにする
|
||||||
|
this.defaultBranch = "main"; // TODO-rca: デフォルトブランチのデフォルト値を設定できるようにする
|
||||||
|
this.path = new PublicPath().getRoot();
|
||||||
|
this.updatedAt = new Date();
|
||||||
|
this.createdAt = new Date();
|
||||||
|
}
|
||||||
|
|
||||||
|
public DocumentMeta(String title, List<DocumentTag> tags, String author, String defaultBranch) {
|
||||||
|
this.id = UUID.randomUUID().toString();
|
||||||
|
this.title = title;
|
||||||
|
this.tags = tags;
|
||||||
|
this.author = author;
|
||||||
|
this.defaultBranch = defaultBranch;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DocumentMeta(String id, String title, List<DocumentTag> tags, String author, String defaultBranch) {
|
||||||
|
this.id = id;
|
||||||
|
this.title = title;
|
||||||
|
this.tags = tags;
|
||||||
|
this.author = author;
|
||||||
|
this.defaultBranch = defaultBranch;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DocumentMeta(String id, String title, Date updatedAt, Date createdAt, List<DocumentTag> tags, String author, String defaultBranch) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.title = title;
|
this.title = title;
|
||||||
this.updatedAt = updatedAt;
|
this.updatedAt = updatedAt;
|
||||||
this.createdAt = createdAt;
|
this.createdAt = createdAt;
|
||||||
this.tags = tags;
|
this.tags = tags;
|
||||||
|
this.author = author;
|
||||||
|
this.defaultBranch = defaultBranch;
|
||||||
}
|
}
|
||||||
|
|
||||||
public DocumentMeta(String id, String title, Date updatedAt, Date createdAt) { // Without tags
|
public DocumentMeta(String id, String title, Date updatedAt, Date createdAt, List<DocumentTag> tags, PublicPath path, String author, String defaultBranch) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.title = title;
|
this.title = title;
|
||||||
this.updatedAt = updatedAt;
|
this.updatedAt = updatedAt;
|
||||||
this.createdAt = createdAt;
|
this.createdAt = createdAt;
|
||||||
this.tags = new ArrayList<>();
|
this.tags = tags;
|
||||||
}
|
this.path = path;
|
||||||
|
this.author = author;
|
||||||
public DocumentMeta(String id, String title) { // Without tags, updatedAt, createdAt
|
this.defaultBranch = defaultBranch;
|
||||||
this.id = id;
|
|
||||||
this.title = title;
|
|
||||||
// 現在時刻を設定
|
|
||||||
this.updatedAt = new Date();
|
|
||||||
this.createdAt = new Date();
|
|
||||||
this.tags = new ArrayList<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
public DocumentMeta(String title) { // title only
|
|
||||||
this.id = UUID.randomUUID().toString(); // 新規作成時想定なのでコンストラクタで生成してしまう(使う人が楽なので)
|
|
||||||
this.title = title;
|
|
||||||
// 現在時刻を設定
|
|
||||||
this.updatedAt = new Date();
|
|
||||||
this.createdAt = new Date();
|
|
||||||
this.tags = new ArrayList<>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Getter
|
// Getter
|
||||||
@@ -121,6 +144,27 @@ public class DocumentMeta {
|
|||||||
return tagIds;
|
return tagIds;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PublicPathを取得する
|
||||||
|
*/
|
||||||
|
public PublicPath getPath() {
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ドキュメントの作者(String)を取得する
|
||||||
|
*/
|
||||||
|
public String getAuthor() {
|
||||||
|
return author;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ドキュメントのデフォルトブランチ(String)を取得する
|
||||||
|
*/
|
||||||
|
public String getDefaultBranch() {
|
||||||
|
return defaultBranch;
|
||||||
|
}
|
||||||
|
|
||||||
// Setter
|
// Setter
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -163,6 +207,30 @@ public class DocumentMeta {
|
|||||||
this.tags = tags;
|
this.tags = tags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PublicPathを設定する
|
||||||
|
* @param path PublicPath
|
||||||
|
*/
|
||||||
|
public void setPath(PublicPath path) {
|
||||||
|
this.path = path;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ドキュメントの作者(String)を設定する
|
||||||
|
* @param author ドキュメントの作者
|
||||||
|
*/
|
||||||
|
public void setAuthor(String author) {
|
||||||
|
this.author = author;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ドキュメントのデフォルトブランチ(String)を設定する
|
||||||
|
* @param defaultBranch ドキュメントのデフォルトブランチ
|
||||||
|
*/
|
||||||
|
public void setDefaultBranch(String defaultBranch) {
|
||||||
|
this.defaultBranch = defaultBranch;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* updatedAtを現在時刻に設定する
|
* updatedAtを現在時刻に設定する
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -4,12 +4,8 @@ import java.util.ArrayList;
|
|||||||
|
|
||||||
public class XmlMetaModel {
|
public class XmlMetaModel {
|
||||||
|
|
||||||
String title;
|
String revisionId;
|
||||||
String author;
|
|
||||||
String description;
|
|
||||||
// Date created;
|
|
||||||
// Date updated;
|
|
||||||
String defaultBranch;
|
|
||||||
ArrayList<XmlMetaPageModel> pages;
|
ArrayList<XmlMetaPageModel> pages;
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
@@ -17,31 +13,15 @@ public class XmlMetaModel {
|
|||||||
public XmlMetaModel() {
|
public XmlMetaModel() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public XmlMetaModel(String title, String author, String description, String defaultBranch, ArrayList<XmlMetaPageModel> pages) {
|
public XmlMetaModel(String revisionId, ArrayList<XmlMetaPageModel> pages) {
|
||||||
this.title = title;
|
this.revisionId = revisionId;
|
||||||
this.author = author;
|
|
||||||
this.description = description;
|
|
||||||
this.defaultBranch = defaultBranch;
|
|
||||||
this.pages = pages;
|
this.pages = pages;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Getter
|
// Getter
|
||||||
|
|
||||||
public String getTitle() {
|
public String getRevisionId() {
|
||||||
return title;
|
return revisionId;
|
||||||
}
|
|
||||||
|
|
||||||
public String getAuthor() {
|
|
||||||
return author;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getDescription() {
|
|
||||||
return description;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getDefaultBranch() {
|
|
||||||
return defaultBranch;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ArrayList<XmlMetaPageModel> getPages() {
|
public ArrayList<XmlMetaPageModel> getPages() {
|
||||||
@@ -50,24 +30,11 @@ public class XmlMetaModel {
|
|||||||
|
|
||||||
// Setter
|
// Setter
|
||||||
|
|
||||||
public void setTitle(String title) {
|
public void setRevisionId(String revisionId) {
|
||||||
this.title = title;
|
this.revisionId = revisionId;
|
||||||
}
|
|
||||||
|
|
||||||
public void setAuthor(String author) {
|
|
||||||
this.author = author;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDescription(String description) {
|
|
||||||
this.description = description;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDefaultBranch(String defaultBranch) {
|
|
||||||
this.defaultBranch = defaultBranch;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPages(ArrayList<XmlMetaPageModel> pages) {
|
public void setPages(ArrayList<XmlMetaPageModel> pages) {
|
||||||
this.pages = pages;
|
this.pages = pages;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
package one.nem.lacerta.model.document.page;
|
||||||
|
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
|
||||||
|
public class Page {
|
||||||
|
|
||||||
|
String fileName;
|
||||||
|
Bitmap bitmap;
|
||||||
|
|
||||||
|
// Constructor
|
||||||
|
|
||||||
|
public Page() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Page(String fileName, Bitmap bitmap) {
|
||||||
|
this.fileName = fileName;
|
||||||
|
this.bitmap = bitmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Getter
|
||||||
|
|
||||||
|
public String getFileName() {
|
||||||
|
return fileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap getBitmap() {
|
||||||
|
return bitmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setter
|
||||||
|
|
||||||
|
public void setFileName(String fileName) {
|
||||||
|
this.fileName = fileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBitmap(Bitmap bitmap) {
|
||||||
|
this.bitmap = bitmap;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -44,4 +44,5 @@ dependencies {
|
|||||||
implementation project(':source')
|
implementation project(':source')
|
||||||
implementation project(':utils')
|
implementation project(':utils')
|
||||||
implementation project(':data')
|
implementation project(':data')
|
||||||
|
implementation project(':vcs')
|
||||||
}
|
}
|
||||||
@@ -2,13 +2,14 @@ package one.nem.lacerta.processor;
|
|||||||
|
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
|
|
||||||
|
import one.nem.lacerta.model.document.DocumentDetail;
|
||||||
|
|
||||||
public interface DocumentProcessor {
|
public interface DocumentProcessor {
|
||||||
|
|
||||||
// ページ操作
|
// ページ操作
|
||||||
void addNewPageToLast(Bitmap bitmap) throws Exception;
|
void addNewPageToLast(Bitmap bitmap) throws Exception;
|
||||||
void addNewPagesToLast(Bitmap[] bitmaps) throws Exception;
|
void addNewPagesToLast(Bitmap[] bitmaps) throws Exception;
|
||||||
void addNewPageAfterIndex(Bitmap bitmap, int index) throws Exception;
|
void insertPageAtIndex(Bitmap bitmap, int index) throws Exception;
|
||||||
void addNewPageBeforeIndex(Bitmap bitmap, int index) throws Exception;
|
|
||||||
void removePageAtIndex(int index) throws Exception;
|
void removePageAtIndex(int index) throws Exception;
|
||||||
|
|
||||||
// 更新
|
// 更新
|
||||||
@@ -18,7 +19,5 @@ public interface DocumentProcessor {
|
|||||||
Bitmap getPageAtIndex(int index);
|
Bitmap getPageAtIndex(int index);
|
||||||
int getPageCount();
|
int getPageCount();
|
||||||
|
|
||||||
void close() throws Exception;
|
DocumentDetail getDocumentDetail();
|
||||||
void init() throws Exception; // TODO-rca: 例外処理
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -3,23 +3,32 @@ package one.nem.lacerta.processor.impl;
|
|||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
|
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
// Hilt
|
||||||
import dagger.assisted.Assisted;
|
import dagger.assisted.Assisted;
|
||||||
import dagger.assisted.AssistedInject;
|
import dagger.assisted.AssistedInject;
|
||||||
import one.nem.lacerta.model.document.internal.XmlMetaPageModel;
|
|
||||||
|
// Lacerta/model
|
||||||
|
import one.nem.lacerta.model.document.DocumentDetail;
|
||||||
|
import one.nem.lacerta.model.document.internal.XmlMetaModel;
|
||||||
|
import one.nem.lacerta.model.document.page.Page;
|
||||||
|
|
||||||
|
// Lacerta/processor
|
||||||
import one.nem.lacerta.processor.DocumentProcessor;
|
import one.nem.lacerta.processor.DocumentProcessor;
|
||||||
|
|
||||||
import one.nem.lacerta.model.document.DocumentDetail;
|
// Lacerta/source
|
||||||
|
|
||||||
import one.nem.lacerta.model.document.internal.XmlMetaModel;
|
|
||||||
import one.nem.lacerta.source.file.FileManager;
|
import one.nem.lacerta.source.file.FileManager;
|
||||||
import one.nem.lacerta.source.file.factory.FileManagerFactory;
|
import one.nem.lacerta.source.file.factory.FileManagerFactory;
|
||||||
|
|
||||||
|
// Lacerta/utils
|
||||||
import one.nem.lacerta.utils.LacertaLogger;
|
import one.nem.lacerta.utils.LacertaLogger;
|
||||||
|
|
||||||
import one.nem.lacerta.utils.XmlMetaParser;
|
import one.nem.lacerta.utils.XmlMetaParser;
|
||||||
|
import one.nem.lacerta.utils.repository.DeviceInfoUtils;
|
||||||
|
|
||||||
|
// Lacerta/vcs
|
||||||
|
import one.nem.lacerta.vcs.LacertaVcs;
|
||||||
|
import one.nem.lacerta.vcs.factory.LacertaVcsFactory;
|
||||||
|
|
||||||
|
|
||||||
public class DocumentProcessorImpl implements DocumentProcessor{
|
public class DocumentProcessorImpl implements DocumentProcessor{
|
||||||
@@ -32,77 +41,47 @@ public class DocumentProcessorImpl implements DocumentProcessor{
|
|||||||
private XmlMetaModel xmlMetaModel;
|
private XmlMetaModel xmlMetaModel;
|
||||||
private Path documentRootPath;
|
private Path documentRootPath;
|
||||||
private FileManager fileManager;
|
private FileManager fileManager;
|
||||||
|
private LacertaVcs lacertaVcs;
|
||||||
|
|
||||||
// Injection
|
// Injection
|
||||||
private final FileManagerFactory fileManagerFactory;
|
private final FileManagerFactory fileManagerFactory;
|
||||||
private final LacertaLogger logger;
|
private final LacertaLogger logger;
|
||||||
private final XmlMetaParser xmlMetaParser;
|
private final XmlMetaParser xmlMetaParser;
|
||||||
|
private final LacertaVcsFactory lacertaVcsFactory;
|
||||||
|
private final DeviceInfoUtils deviceInfoUtils;
|
||||||
@AssistedInject
|
@AssistedInject
|
||||||
public DocumentProcessorImpl(FileManagerFactory fileManagerFactory, LacertaLogger logger, XmlMetaParser xmlMetaParser, @Assisted DocumentDetail documentDetail) {
|
public DocumentProcessorImpl(FileManagerFactory fileManagerFactory, LacertaLogger logger, XmlMetaParser xmlMetaParser, LacertaVcsFactory lacertaVcsFactory, DeviceInfoUtils deviceInfoUtils, @Assisted DocumentDetail documentDetail) {
|
||||||
this.fileManagerFactory = fileManagerFactory;
|
this.fileManagerFactory = fileManagerFactory;
|
||||||
this.logger = logger;
|
this.logger = logger;
|
||||||
this.xmlMetaParser = xmlMetaParser;
|
this.xmlMetaParser = xmlMetaParser;
|
||||||
if (documentDetail == null) {
|
if (documentDetail == null) {
|
||||||
throw new IllegalArgumentException("documentDetail must not be null");
|
throw new IllegalArgumentException("documentDetail must not be null");
|
||||||
}
|
}
|
||||||
|
this.lacertaVcsFactory = lacertaVcsFactory;
|
||||||
this.documentDetail = documentDetail;
|
this.documentDetail = documentDetail;
|
||||||
}
|
this.deviceInfoUtils = deviceInfoUtils;
|
||||||
|
|
||||||
@Override
|
// Init
|
||||||
public void init() throws Exception{
|
this.documentRootPath = deviceInfoUtils.getExternalStorageDirectory().resolve(this.documentDetail.getMeta().getId());
|
||||||
logger.debug("init", "called");
|
|
||||||
// Init Variables
|
|
||||||
this.documentRootPath = this.documentDetail.getPath().getFullPath();
|
|
||||||
logger.debug("init", "documentRootPath: " + this.documentRootPath);
|
logger.debug("init", "documentRootPath: " + this.documentRootPath);
|
||||||
|
|
||||||
this.fileManager = fileManagerFactory.create(this.documentRootPath).enableAutoCreateParent(); //Initialize FileManager
|
this.fileManager = fileManagerFactory.create(this.documentRootPath).enableAutoCreateParent(); //Initialize FileManager
|
||||||
|
this.lacertaVcs = lacertaVcsFactory.create(this.documentDetail.getMeta().getId());
|
||||||
FileManager initFileManager = this.fileManager.getNewInstance();
|
|
||||||
|
|
||||||
logger.debug("init", "fileManager created");
|
|
||||||
|
|
||||||
// xmlファイルの読み込み
|
|
||||||
if (initFileManager.isExist("meta.xml")) {
|
|
||||||
logger.debug("init", "meta.xml found");
|
|
||||||
try {
|
|
||||||
this.xmlMetaModel = xmlMetaParser.deserialize(this.fileManager.loadXml("meta.xml"));
|
|
||||||
logger.debug("init", "meta.xml parsed");
|
|
||||||
} catch (Exception e) {
|
|
||||||
logger.debug("init", "meta.xml parse failed");
|
|
||||||
logger.trace("init", e.getMessage());
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
logger.debug("init", "meta.xml not found");
|
|
||||||
xmlMetaModel = new XmlMetaModel();
|
|
||||||
|
|
||||||
xmlMetaModel.setTitle(this.documentDetail.getMeta().getTitle());
|
|
||||||
xmlMetaModel.setAuthor(this.documentDetail.getAuthor());
|
|
||||||
xmlMetaModel.setDescription(""); // FIXME-rca:
|
|
||||||
xmlMetaModel.setDefaultBranch(this.documentDetail.getDefaultBranch());
|
|
||||||
xmlMetaModel.setPages(new ArrayList<>());
|
|
||||||
|
|
||||||
try {
|
|
||||||
initFileManager.createFileIfNotExist("meta.xml").saveXml(xmlMetaParser.serialize(xmlMetaModel), "meta.xml");
|
|
||||||
logger.debug("init", "meta.xml saved");
|
|
||||||
} catch (Exception e) {
|
|
||||||
logger.error("init", "meta.xml save failed");
|
|
||||||
logger.trace("init", e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.info("init", "finished");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addNewPageToLast(Bitmap bitmap) throws Exception{
|
public void addNewPageToLast(Bitmap bitmap) throws Exception{
|
||||||
logger.debug("addNewPageToLast", "called");
|
logger.debug("addNewPageToLast", "called");
|
||||||
String filename = UUID.randomUUID().toString() + ".png"; // TODO-rca: 拡張子を動的にする
|
String filename = UUID.randomUUID().toString() + ".png"; // TODO-rca: 拡張子を動的にする
|
||||||
|
|
||||||
this.fileManager.getNewInstance().createDirectoryIfNotExist(DEFAULT_SAVE_DIR).resolve(DEFAULT_SAVE_DIR).saveBitmap(bitmap, filename);
|
Page page = new Page();
|
||||||
|
page.setFileName(filename);
|
||||||
|
page.setBitmap(bitmap);
|
||||||
|
this.documentDetail.getPages().add(page);
|
||||||
|
|
||||||
XmlMetaPageModel xmlMetaPageModel = new XmlMetaPageModel();
|
lacertaVcs.insertPage(documentDetail.getPages().size(), filename);
|
||||||
xmlMetaPageModel.setFilename(filename);
|
|
||||||
xmlMetaModel.getPages().add(xmlMetaPageModel);
|
this.fileManager.getNewInstance().createDirectoryIfNotExist(DEFAULT_SAVE_DIR).resolve(DEFAULT_SAVE_DIR).saveBitmap(bitmap, filename);
|
||||||
|
|
||||||
logger.info("addNewPageToLast", "finished");
|
logger.info("addNewPageToLast", "finished");
|
||||||
logger.info("addNewPageToLast", "filename: " + filename);
|
logger.info("addNewPageToLast", "filename: " + filename);
|
||||||
@@ -118,27 +97,18 @@ public class DocumentProcessorImpl implements DocumentProcessor{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addNewPageAfterIndex(Bitmap bitmap, int index) throws Exception {
|
public void insertPageAtIndex(Bitmap bitmap, int index) throws Exception {
|
||||||
logger.debug("addNewPageAfterIndex", "called");
|
logger.debug("addNewPageAfterIndex", "called");
|
||||||
String filename = UUID.randomUUID().toString() + ".png"; // TODO-rca: 拡張子を動的にする
|
String filename = UUID.randomUUID().toString() + ".png"; // TODO-rca: 拡張子を動的にする
|
||||||
|
|
||||||
this.fileManager.getNewInstance().createDirectoryIfNotExist(DEFAULT_SAVE_DIR).resolve(DEFAULT_SAVE_DIR).saveBitmap(bitmap, filename);
|
this.fileManager.getNewInstance().createDirectoryIfNotExist(DEFAULT_SAVE_DIR).resolve(DEFAULT_SAVE_DIR).saveBitmap(bitmap, filename);
|
||||||
|
|
||||||
XmlMetaPageModel xmlMetaPageModel = new XmlMetaPageModel();
|
Page page = new Page();
|
||||||
xmlMetaPageModel.setFilename(filename);
|
page.setFileName(filename);
|
||||||
xmlMetaModel.getPages().add(index, xmlMetaPageModel);
|
page.setBitmap(bitmap);
|
||||||
}
|
this.documentDetail.getPages().add(index, page);
|
||||||
|
|
||||||
@Override
|
lacertaVcs.insertPage(index, filename);
|
||||||
public void addNewPageBeforeIndex(Bitmap bitmap, int index) throws Exception {
|
|
||||||
logger.debug("addNewPageBeforeIndex", "called");
|
|
||||||
String filename = UUID.randomUUID().toString() + ".png"; // TODO-rca: 拡張子を動的にする
|
|
||||||
|
|
||||||
this.fileManager.getNewInstance().createDirectoryIfNotExist(DEFAULT_SAVE_DIR).resolve(DEFAULT_SAVE_DIR).saveBitmap(bitmap, filename);
|
|
||||||
|
|
||||||
XmlMetaPageModel xmlMetaPageModel = new XmlMetaPageModel();
|
|
||||||
xmlMetaPageModel.setFilename(filename);
|
|
||||||
xmlMetaModel.getPages().add(index - 1, xmlMetaPageModel);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -162,14 +132,7 @@ public class DocumentProcessorImpl implements DocumentProcessor{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void close() throws Exception{
|
public DocumentDetail getDocumentDetail() {
|
||||||
logger.debug("close", "called");
|
return this.documentDetail;
|
||||||
try {
|
|
||||||
this.fileManager.getNewInstance().createFileIfNotExist("meta.xml").saveXml(xmlMetaParser.serialize(xmlMetaModel), "meta.xml");
|
|
||||||
logger.debug("close", "meta.xml saved");
|
|
||||||
} catch (Exception e) {
|
|
||||||
logger.error("close", "meta.xml save failed");
|
|
||||||
logger.trace("close", e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+1
-1
@@ -30,5 +30,5 @@ include ':source'
|
|||||||
include ':model'
|
include ':model'
|
||||||
include ':processor'
|
include ':processor'
|
||||||
include ':shared:ui'
|
include ':shared:ui'
|
||||||
include ':shared:icon'
|
|
||||||
include ':vcs'
|
include ':vcs'
|
||||||
|
include ':feature:setting'
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<translate android:fromXDelta="-100%p" android:toXDelta="0"
|
<translate android:fromXDelta="-100%p" android:toXDelta="0"
|
||||||
android:duration="@android:integer/config_mediumAnimTime" />
|
android:duration="120" />
|
||||||
<alpha android:fromAlpha="0.0" android:toAlpha="1.0"
|
<alpha android:fromAlpha="0.0" android:toAlpha="1.0"
|
||||||
android:duration="@android:integer/config_mediumAnimTime" />
|
android:duration="120" />
|
||||||
</set>
|
</set>
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<translate android:fromXDelta="100%p" android:toXDelta="0"
|
<translate android:fromXDelta="100%p" android:toXDelta="0"
|
||||||
android:duration="@android:integer/config_mediumAnimTime" />
|
android:duration="120" />
|
||||||
<alpha android:fromAlpha="0.0" android:toAlpha="1.0"
|
<alpha android:fromAlpha="0.0" android:toAlpha="1.0"
|
||||||
android:duration="@android:integer/config_mediumAnimTime" />
|
android:duration="120" />
|
||||||
</set>
|
</set>
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<translate android:fromXDelta="0" android:toXDelta="-100%p"
|
<translate android:fromXDelta="0" android:toXDelta="-100%p"
|
||||||
android:duration="@android:integer/config_mediumAnimTime" />
|
android:duration="120" />
|
||||||
<alpha android:fromAlpha="1.0" android:toAlpha="0.0"
|
<alpha android:fromAlpha="1.0" android:toAlpha="0.0"
|
||||||
android:duration="@android:integer/config_mediumAnimTime" />
|
android:duration="120" />
|
||||||
</set>
|
</set>
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<translate android:fromXDelta="0" android:toXDelta="100%p"
|
<translate android:fromXDelta="0" android:toXDelta="100%p"
|
||||||
android:duration="@android:integer/config_mediumAnimTime" />
|
android:duration="120" />
|
||||||
<alpha android:fromAlpha="1.0" android:toAlpha="0.0"
|
<alpha android:fromAlpha="1.0" android:toAlpha="0.0"
|
||||||
android:duration="@android:integer/config_mediumAnimTime" />
|
android:duration="120" />
|
||||||
</set>
|
</set>
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="960"
|
||||||
|
android:viewportHeight="960"
|
||||||
|
android:tint="?attr/colorControlNormal">
|
||||||
|
<path
|
||||||
|
android:fillColor="@color/colorOnBackground"
|
||||||
|
android:pathData="M256,746.15L213.85,704L437.85,480L213.85,256L256,213.85L480,437.85L704,213.85L746.15,256L522.15,480L746.15,704L704,746.15L480,522.15L256,746.15Z"/>
|
||||||
|
</vector>
|
||||||
@@ -5,6 +5,6 @@
|
|||||||
android:viewportHeight="960"
|
android:viewportHeight="960"
|
||||||
android:tint="?attr/colorControlNormal">
|
android:tint="?attr/colorControlNormal">
|
||||||
<path
|
<path
|
||||||
android:fillColor="@android:color/white"
|
android:fillColor="@color/colorOnBackground"
|
||||||
android:pathData="M330,710L630,710L630,650L330,650L330,710ZM330,550L630,550L630,490L330,490L330,550ZM252.31,860Q222,860 201,839Q180,818 180,787.69L180,172.31Q180,142 201,121Q222,100 252.31,100L570,100L780,310L780,787.69Q780,818 759,839Q738,860 707.69,860L252.31,860ZM540,340L540,160L252.31,160Q247.69,160 243.85,163.85Q240,167.69 240,172.31L240,787.69Q240,792.31 243.85,796.15Q247.69,800 252.31,800L707.69,800Q712.31,800 716.15,796.15Q720,792.31 720,787.69L720,340L540,340ZM240,160L240,160L240,340L240,340L240,160L240,340L240,340L240,787.69Q240,792.31 240,796.15Q240,800 240,800L240,800Q240,800 240,796.15Q240,792.31 240,787.69L240,172.31Q240,167.69 240,163.85Q240,160 240,160Z"/>
|
android:pathData="M330,710L630,710L630,650L330,650L330,710ZM330,550L630,550L630,490L330,490L330,550ZM252.31,860Q222,860 201,839Q180,818 180,787.69L180,172.31Q180,142 201,121Q222,100 252.31,100L570,100L780,310L780,787.69Q780,818 759,839Q738,860 707.69,860L252.31,860ZM540,340L540,160L252.31,160Q247.69,160 243.85,163.85Q240,167.69 240,172.31L240,787.69Q240,792.31 243.85,796.15Q247.69,800 252.31,800L707.69,800Q712.31,800 716.15,796.15Q720,792.31 720,787.69L720,340L540,340ZM240,160L240,160L240,340L240,340L240,160L240,340L240,340L240,787.69Q240,792.31 240,796.15Q240,800 240,800L240,800Q240,800 240,796.15Q240,792.31 240,787.69L240,172.31Q240,167.69 240,163.85Q240,160 240,160Z"/>
|
||||||
</vector>
|
</vector>
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="960"
|
||||||
|
android:viewportHeight="960"
|
||||||
|
android:tint="?attr/colorControlNormal">
|
||||||
|
<path
|
||||||
|
android:fillColor="@color/colorOnBackground"
|
||||||
|
android:pathData="M90,230L90,50L270,50L270,110L150,110L150,230L90,230ZM810,230L810,110L690,110L690,50L870,50L870,230L810,230ZM90,910L90,730L150,730L150,850L270,850L270,910L90,910ZM690,910L690,850L810,850L810,730L870,730L870,910L690,910ZM270,717.69Q270,722.31 273.85,726.15Q277.69,730 282.31,730L677.69,730Q682.31,730 686.15,726.15Q690,722.31 690,717.69L690,242.31Q690,237.69 686.15,233.85Q682.31,230 677.69,230L282.31,230Q277.69,230 273.85,233.85Q270,237.69 270,242.31L270,717.69ZM282.31,790Q252,790 231,769Q210,748 210,717.69L210,242.31Q210,212 231,191Q252,170 282.31,170L677.69,170Q708,170 729,191Q750,212 750,242.31L750,717.69Q750,748 729,769Q708,790 677.69,790L282.31,790ZM370,390L590,390L590,330L370,330L370,390ZM370,510L590,510L590,450L370,450L370,510ZM370,630L590,630L590,570L370,570L370,630ZM270,717.69L270,242.31Q270,237.69 270,233.85Q270,230 270,230L270,230Q270,230 270,233.85Q270,237.69 270,242.31L270,717.69Q270,722.31 270,726.15Q270,730 270,730L270,730Q270,730 270,726.15Q270,722.31 270,717.69Z"/>
|
||||||
|
</vector>
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="960"
|
||||||
|
android:viewportHeight="960"
|
||||||
|
android:tint="?attr/colorControlNormal">
|
||||||
|
<path
|
||||||
|
android:fillColor="@color/colorOnBackground"
|
||||||
|
android:pathData="M450,670L510,670L510,440L450,440L450,670ZM480,371.54Q493.73,371.54 503.02,362.25Q512.31,352.96 512.31,339.23Q512.31,325.5 503.02,316.21Q493.73,306.92 480,306.92Q466.27,306.92 456.98,316.21Q447.69,325.5 447.69,339.23Q447.69,352.96 456.98,362.25Q466.27,371.54 480,371.54ZM480.07,860Q401.23,860 331.86,830.08Q262.49,800.16 211.18,748.87Q159.87,697.58 129.93,628.24Q100,558.9 100,480.07Q100,401.23 129.92,331.86Q159.84,262.49 211.13,211.18Q262.42,159.87 331.76,129.93Q401.1,100 479.93,100Q558.77,100 628.14,129.92Q697.51,159.84 748.82,211.13Q800.13,262.42 830.07,331.76Q860,401.1 860,479.93Q860,558.77 830.08,628.14Q800.16,697.51 748.87,748.82Q697.58,800.13 628.24,830.07Q558.9,860 480.07,860ZM480,800Q614,800 707,707Q800,614 800,480Q800,346 707,253Q614,160 480,160Q346,160 253,253Q160,346 160,480Q160,614 253,707Q346,800 480,800ZM480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Z"/>
|
||||||
|
</vector>
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="960"
|
||||||
|
android:viewportHeight="960"
|
||||||
|
android:tint="?attr/colorControlNormal">
|
||||||
|
<path
|
||||||
|
android:fillColor="@color/colorOnBackground"
|
||||||
|
android:pathData="M479.23,860Q401.46,860 332.31,830.04Q263.15,800.08 211.54,748.46Q159.92,696.84 129.96,627.5Q100,558.15 100,480Q100,400.85 130.77,331.5Q161.54,262.16 214.35,210.85Q267.15,159.54 337.89,129.77Q408.62,100 488.77,100Q563.77,100 630.92,125.58Q698.08,151.16 748.88,196.39Q799.69,241.62 829.84,303.89Q860,366.15 860,438.92Q860,542.77 798.27,601.38Q736.54,660 640,660L567.54,660Q550.46,660 540.23,671.15Q530,682.31 530,697.54Q530,716.08 545,736.08Q560,756.08 560,782Q560,821.61 538.08,840.81Q516.15,860 479.23,860ZM480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480L480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480ZM260,510Q281.38,510 295.69,495.69Q310,481.38 310,460Q310,438.62 295.69,424.31Q281.38,410 260,410Q238.62,410 224.31,424.31Q210,438.62 210,460Q210,481.38 224.31,495.69Q238.62,510 260,510ZM380,350Q401.38,350 415.69,335.69Q430,321.38 430,300Q430,278.62 415.69,264.31Q401.38,250 380,250Q358.62,250 344.31,264.31Q330,278.62 330,300Q330,321.38 344.31,335.69Q358.62,350 380,350ZM580,350Q601.38,350 615.69,335.69Q630,321.38 630,300Q630,278.62 615.69,264.31Q601.38,250 580,250Q558.62,250 544.31,264.31Q530,278.62 530,300Q530,321.38 544.31,335.69Q558.62,350 580,350ZM700,510Q721.38,510 735.69,495.69Q750,481.38 750,460Q750,438.62 735.69,424.31Q721.38,410 700,410Q678.62,410 664.31,424.31Q650,438.62 650,460Q650,481.38 664.31,495.69Q678.62,510 700,510ZM479.23,800Q489,800 494.5,795.19Q500,790.39 500,782Q500,768 485,750.54Q470,733.08 470,695.85Q470,653.08 499,626.54Q528,600 570,600L640,600Q710.62,600 755.31,558.61Q800,517.23 800,438.92Q800,317.54 706.92,238.77Q613.85,160 488.77,160Q351.61,160 255.81,253Q160,346 160,480Q160,613 253.5,706.5Q347,800 479.23,800Z"/>
|
||||||
|
</vector>
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="960"
|
||||||
|
android:viewportHeight="960"
|
||||||
|
android:tint="?attr/colorControlNormal">
|
||||||
|
<path
|
||||||
|
android:fillColor="@color/colorOnBackground"
|
||||||
|
android:pathData="M820,288.46L820,747.69Q820,778 799,799Q778,820 747.69,820L212.31,820Q182,820 161,799Q140,778 140,747.69L140,212.31Q140,182 161,161Q182,140 212.31,140L671.54,140L820,288.46ZM760,314L646,200L212.31,200Q206.92,200 203.46,203.46Q200,206.92 200,212.31L200,747.69Q200,753.08 203.46,756.54Q206.92,760 212.31,760L747.69,760Q753.08,760 756.54,756.54Q760,753.08 760,747.69L760,314ZM480,690.77Q521.54,690.77 550.77,661.54Q580,632.31 580,590.77Q580,549.23 550.77,520Q521.54,490.77 480,490.77Q438.46,490.77 409.23,520Q380,549.23 380,590.77Q380,632.31 409.23,661.54Q438.46,690.77 480,690.77ZM255.39,395.38L583.84,395.38L583.84,255.39L255.39,255.39L255.39,395.38ZM200,314L200,747.69Q200,753.08 200,756.54Q200,760 200,760L200,760Q200,760 200,756.54Q200,753.08 200,747.69L200,212.31Q200,206.92 200,203.46Q200,200 200,200L200,200L200,314Z"/>
|
||||||
|
</vector>
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="960"
|
||||||
|
android:viewportHeight="960"
|
||||||
|
android:tint="?attr/colorControlNormal">
|
||||||
|
<path
|
||||||
|
android:fillColor="@color/colorOnBackground"
|
||||||
|
android:pathData="M479.23,540Q454.69,540 436.96,522.27Q419.23,504.54 419.23,480Q419.23,455.46 436.96,437.73Q454.69,420 479.23,420Q503.77,420 521.5,437.73Q539.23,455.46 539.23,480Q539.23,504.54 521.5,522.27Q503.77,540 479.23,540ZM479.23,820Q348.69,820 252.46,734.27Q156.23,648.54 141.62,520L202.85,520Q218,623.61 296.27,691.81Q374.54,760 479.23,760Q596.23,760 677.73,678.5Q759.23,597 759.23,480Q759.23,363 677.73,281.5Q596.23,200 479.23,200Q413.69,200 356.39,229.11Q299.08,258.23 257.69,309.23L362.31,309.23L362.31,369.23L159.23,369.23L159.23,166.15L219.23,166.15L219.23,260.92Q267.92,203.46 335.85,171.73Q403.77,140 479.23,140Q550.03,140 611.86,166.77Q673.69,193.54 719.69,239.54Q765.69,285.54 792.46,347.36Q819.23,409.19 819.23,479.98Q819.23,550.77 792.46,612.61Q765.69,674.46 719.69,720.46Q673.69,766.46 611.86,793.23Q550.03,820 479.23,820Z"/>
|
||||||
|
</vector>
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingHorizontal="24dp"
|
||||||
|
android:paddingVertical="16dp">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/item_icon"
|
||||||
|
android:layout_width="32dp"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_marginEnd="16dp"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toStartOf="@id/item_text_container"
|
||||||
|
app:srcCompat="@drawable/description_24px"
|
||||||
|
android:contentDescription="icon" />
|
||||||
|
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
android:id="@+id/item_text_container"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toEndOf="@id/item_icon"
|
||||||
|
app:layout_constraintTop_toTopOf="parent">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/item_title"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textSize="16sp"
|
||||||
|
android:layout_marginEnd="8dp"
|
||||||
|
android:text="Placeholder Title"
|
||||||
|
android:textColor="@color/colorOnSurface"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/item_description"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textSize="14sp"
|
||||||
|
android:text="Placeholder Description"
|
||||||
|
android:textColor="@color/colorOnSurfaceSecondary"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/item_title" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
|
||||||
|
<style name="Base.Theme.Lacerta" parent="Theme.Material3.DayNight.NoActionBar">
|
||||||
|
|
||||||
|
<item name="colorPrimary">@color/colorPrimary</item>
|
||||||
|
<item name="colorOnPrimary">@color/colorOnPrimary</item>
|
||||||
|
<item name="colorSecondary">@color/colorSecondary</item>
|
||||||
|
<item name="colorOnSecondary">@color/colorOnSecondary</item>
|
||||||
|
<item name="colorSurface">@color/colorSurface</item>
|
||||||
|
<item name="colorOnSurface">@color/colorOnSurface</item>
|
||||||
|
<item name="colorSurfaceVariant">@color/colorSurfaceVariant</item>
|
||||||
|
<item name="colorOnSurfaceVariant">@color/colorOnSurfaceVariant</item>
|
||||||
|
<item name="colorSurfaceInverse">@color/colorSurfaceInverse</item>
|
||||||
|
<item name="colorOnSurfaceInverse">@color/colorOnSurfaceInverse</item>
|
||||||
|
<item name="colorPrimaryInverse">@color/colorPrimaryInverse</item>
|
||||||
|
<item name="colorPrimaryContainer">@color/colorPrimaryContainer</item>
|
||||||
|
<item name="colorOnPrimaryContainer">@color/colorOnPrimaryContainer</item>
|
||||||
|
<item name="colorSecondaryContainer">@color/colorSecondaryContainer</item>
|
||||||
|
<item name="colorOnSecondaryContainer">@color/colorOnSecondaryContainer</item>
|
||||||
|
<item name="colorTertiary">@color/colorTertiary</item>
|
||||||
|
<item name="colorOnTertiary">@color/colorOnTertiary</item>
|
||||||
|
<item name="colorTertiaryContainer">@color/colorTertiaryContainer</item>
|
||||||
|
<item name="colorOnTertiaryContainer">@color/colorOnTertiaryContainer</item>
|
||||||
|
<item name="colorError">@color/colorError</item>
|
||||||
|
<item name="colorOnError">@color/colorOnError</item>
|
||||||
|
<item name="colorErrorContainer">@color/colorErrorContainer</item>
|
||||||
|
<item name="colorOnErrorContainer">@color/colorOnErrorContainer</item>
|
||||||
|
<item name="colorOutline">@color/colorOutline</item>
|
||||||
|
<item name="colorOnBackground">@color/colorOnBackground</item>
|
||||||
|
|
||||||
|
<item name="android:windowLightNavigationBar">false</item>
|
||||||
|
<item name="android:windowLightStatusBar">false</item>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
</resources>
|
||||||
@@ -25,4 +25,8 @@
|
|||||||
<color name="colorSurfaceVariant">@color/material_dynamic_neutral_variant90</color>
|
<color name="colorSurfaceVariant">@color/material_dynamic_neutral_variant90</color>
|
||||||
<color name="colorOnSurfaceVariant">@color/material_dynamic_neutral_variant30</color>
|
<color name="colorOnSurfaceVariant">@color/material_dynamic_neutral_variant30</color>
|
||||||
<color name="colorSurfaceInverse">@color/material_dynamic_neutral20</color>
|
<color name="colorSurfaceInverse">@color/material_dynamic_neutral20</color>
|
||||||
|
|
||||||
|
<!-- indicator icon background -->
|
||||||
|
<color name="colorIndicator">@color/material_dynamic_secondary70</color>
|
||||||
|
<color name="colorOnSurfaceSecondary">@color/material_dynamic_neutral_variant30</color>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -25,4 +25,8 @@
|
|||||||
<color name="colorSurfaceInverse">#313033</color>
|
<color name="colorSurfaceInverse">#313033</color>
|
||||||
<color name="colorOnSurfaceInverse">#F4EFF4</color>
|
<color name="colorOnSurfaceInverse">#F4EFF4</color>
|
||||||
<color name="colorPrimaryInverse">#D0BCFF</color>
|
<color name="colorPrimaryInverse">#D0BCFF</color>
|
||||||
|
|
||||||
|
<!-- indicator icon background -->
|
||||||
|
<color name="colorIndicator">#d2d4bc</color>
|
||||||
|
<color name="colorOnSurfaceSecondary">#49454F</color>
|
||||||
</resources>
|
</resources>
|
||||||
Loaded 100 of 125 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user