mirror of
https://github.com/lacerta-doc/Lacerta.git
synced 2026-11-07 19:47:36 +00:00
Compare commits
148
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 | ||
|
|
cc62529224 | ||
|
|
2d686ce776 | ||
|
|
a61c044391 | ||
|
|
bc19dd22d8 | ||
|
|
a5efab5838 | ||
|
|
f186064f6e | ||
|
|
59a35cbb4a | ||
|
|
a78e60416d | ||
|
|
ac5a950ce3 |
No files matched your search
Generated
+1
@@ -22,6 +22,7 @@
|
||||
<option value="$PROJECT_DIR$/feature/library" />
|
||||
<option value="$PROJECT_DIR$/feature/scan" />
|
||||
<option value="$PROJECT_DIR$/feature/search" />
|
||||
<option value="$PROJECT_DIR$/feature/setting" />
|
||||
<option value="$PROJECT_DIR$/model" />
|
||||
<option value="$PROJECT_DIR$/processor" />
|
||||
<option value="$PROJECT_DIR$/shared" />
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
# 概要
|
||||
<!-- PRの概要 -->
|
||||
|
||||
# 関連Issue
|
||||
- #000 <!-- 関連するIssueを指定(なければ省略可) -->
|
||||
|
||||
# 詳細
|
||||
<!-- 詳細 -->
|
||||
|
||||
# 影響箇所
|
||||
<!-- 予想される影響箇所 -->
|
||||
|
||||
# チェック
|
||||
<!-- 参考用, 全てにチェックがついている必要があるわけではありません -->
|
||||
- [ ] 機能として完成している
|
||||
- [ ] WIP(Work in progress: 作業中)
|
||||
- [ ] 正常にビルド/起動ができる
|
||||
- [ ] 既存の機能を壊していない
|
||||
+10
-24
@@ -59,30 +59,6 @@ dependencies {
|
||||
androidTestImplementation libs.androidx.test.ext.junit
|
||||
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')
|
||||
|
||||
// Hilt (DI)
|
||||
implementation libs.com.google.dagger.hilt.android
|
||||
annotationProcessor libs.com.google.dagger.hilt.compiler
|
||||
@@ -92,4 +68,14 @@ dependencies {
|
||||
implementation libs.navigation.ui
|
||||
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;
|
||||
|
||||
import android.app.Application;
|
||||
import android.util.Log;
|
||||
|
||||
import com.google.android.material.color.DynamicColors;
|
||||
|
||||
@@ -12,7 +13,13 @@ public class LacertaApplication extends Application {
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
|
||||
// DynamicColorを有効化
|
||||
DynamicColors.applyToActivitiesIfAvailable(this);
|
||||
if (DynamicColors.isDynamicColorAvailable()) {
|
||||
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;
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.navigation.NavController;
|
||||
import androidx.navigation.fragment.NavHostFragment;
|
||||
import androidx.navigation.ui.NavigationUI;
|
||||
|
||||
import android.graphics.Color;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.google.android.material.bottomnavigation.BottomNavigationView;
|
||||
@@ -25,16 +28,26 @@ public class MainActivity extends AppCompatActivity {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_main);
|
||||
|
||||
// Debug
|
||||
FragmentManager supportFragmentManager = getSupportFragmentManager();
|
||||
// Init navigation
|
||||
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);
|
||||
NavController navController = navHostFragment.getNavController();
|
||||
BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_nav);
|
||||
// Set navigation bar color
|
||||
getWindow().setNavigationBarColor(ContextCompat.getColor(this, one.nem.lacerta.shared.ui.R.color.colorSecondaryContainer));
|
||||
|
||||
NavigationUI.setupWithNavController(bottomNavigationView, navController);
|
||||
|
||||
Toast.makeText(this, "testMessage", Toast.LENGTH_SHORT).show();
|
||||
// Set status bar color
|
||||
getWindow().setStatusBarColor(ContextCompat.getColor(this, one.nem.lacerta.shared.ui.R.color.colorSurface));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -24,6 +24,11 @@
|
||||
android:id="@+id/bottom_nav"
|
||||
android:layout_width="0dp"
|
||||
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_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
|
||||
@@ -4,17 +4,26 @@
|
||||
<item
|
||||
android:id="@id/feature_home_navigation"
|
||||
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
|
||||
android:id="@id/feature_library_navigation"
|
||||
android:icon="@drawable/folder_24px"
|
||||
android:title="Library"/>
|
||||
android:title="@string/library_title"/>
|
||||
|
||||
<item
|
||||
android:id="@id/feature_debug_navigation"
|
||||
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>
|
||||
@@ -10,5 +10,9 @@
|
||||
|
||||
<include app:graph="@navigation/feature_home_navigation" />
|
||||
|
||||
<include app:graph="@navigation/feature_search_navigation" />
|
||||
|
||||
<include app:graph="@navigation/feature_setting_navigation" />
|
||||
|
||||
|
||||
</navigation>
|
||||
@@ -32,4 +32,6 @@ dependencies {
|
||||
testImplementation libs.junit
|
||||
androidTestImplementation libs.androidx.test.ext.junit
|
||||
androidTestImplementation libs.androidx.test.espresso.core
|
||||
|
||||
implementation project(':shared:ui')
|
||||
}
|
||||
+24
-1
@@ -26,8 +26,12 @@ 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 {
|
||||
@@ -40,6 +44,11 @@ public class ScannerManagerActivity extends AppCompatActivity {
|
||||
@Inject
|
||||
Document document;
|
||||
|
||||
@Inject
|
||||
DocumentProcessorFactory documentProcessorFactory;
|
||||
|
||||
@Inject
|
||||
LacertaVcsFactory lacertaVcsFactory;
|
||||
|
||||
// Variables
|
||||
private ArrayList<Bitmap> croppedImages = new ArrayList<>();
|
||||
@@ -143,7 +152,21 @@ public class ScannerManagerActivity extends AppCompatActivity {
|
||||
|
||||
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() {
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
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.LibraryItemPage;
|
||||
@@ -8,8 +11,8 @@ import one.nem.lacerta.model.document.DocumentDetail;
|
||||
public interface LacertaLibrary {
|
||||
|
||||
// Get History
|
||||
LibraryItemPage getRecentDocument(int limit);
|
||||
LibraryItemPage getRecentDocument(int limit, int offset);
|
||||
ArrayList<ListItem> getRecentDocument(int limit);
|
||||
ArrayList<ListItem> getRecentDocument(int limit, int offset);
|
||||
|
||||
// Get Library page
|
||||
LibraryItemPage getLibraryPage(int limit);
|
||||
|
||||
@@ -24,6 +24,7 @@ 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 {
|
||||
@@ -37,13 +38,13 @@ public class DocumentImpl implements Document {
|
||||
LacertaDatabase database;
|
||||
|
||||
@Inject
|
||||
LacertaVcs vcs;
|
||||
LacertaVcsFactory vcsFactory;
|
||||
|
||||
|
||||
@Inject
|
||||
public DocumentImpl() {
|
||||
// Init
|
||||
logger.debug(TAG, "called");
|
||||
// logger.debug(TAG, "called");
|
||||
}
|
||||
|
||||
|
||||
@@ -69,6 +70,7 @@ public class DocumentImpl implements Document {
|
||||
database.documentDao().insert(documentEntity);
|
||||
|
||||
// Vcs
|
||||
LacertaVcs vcs = vcsFactory.create(meta.getId());
|
||||
vcs.createDocument(meta.getId());
|
||||
|
||||
return detail;
|
||||
|
||||
@@ -1,18 +1,48 @@
|
||||
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.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.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 {
|
||||
|
||||
@Inject
|
||||
LacertaLogger logger;
|
||||
|
||||
@Inject
|
||||
LacertaDatabase database;
|
||||
|
||||
@Override
|
||||
public LibraryItemPage getRecentDocument(int limit) {
|
||||
return null;
|
||||
public ArrayList<ListItem> getRecentDocument(int limit) {
|
||||
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
|
||||
public LibraryItemPage getRecentDocument(int limit, int offset) {
|
||||
return null;
|
||||
public ArrayList<ListItem> getRecentDocument(int limit, int offset) {
|
||||
return null; // TODO-rca: Implement
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -148,8 +148,8 @@ public class LacertaLibraryStubImpl implements LacertaLibrary {
|
||||
* @return ページオブジェクト
|
||||
*/
|
||||
@Override
|
||||
public LibraryItemPage getRecentDocument(int limit) {
|
||||
return getRecentDocumentPage(limit);
|
||||
public ArrayList<ListItem> getRecentDocument(int limit) {
|
||||
return getRecentDocumentPage(limit).getListItems();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -159,8 +159,8 @@ public class LacertaLibraryStubImpl implements LacertaLibrary {
|
||||
* @return ページオブジェクト
|
||||
*/
|
||||
@Override
|
||||
public LibraryItemPage getRecentDocument(int limit, int offset) {
|
||||
return getRecentDocumentPage(limit);
|
||||
public ArrayList<ListItem> getRecentDocument(int limit, int offset) {
|
||||
return getRecentDocumentPage(limit).getListItems();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+3
-3
@@ -57,13 +57,13 @@ public class DebugMenuLibraryItemListPageFragment extends Fragment {
|
||||
// Inflate the layout for this fragment
|
||||
View view = inflater.inflate(R.layout.fragment_debug_menu_library_item_list_page, container, false);
|
||||
|
||||
LibraryItemPage libraryItemPage = lacertaLibrary.getRecentDocument(10);
|
||||
for (ListItem listItem : libraryItemPage.getListItems()) {
|
||||
ArrayList<ListItem> listItems = lacertaLibrary.getRecentDocument(10);
|
||||
for (ListItem listItem : listItems) {
|
||||
System.out.println(listItem.getTitle());
|
||||
}
|
||||
|
||||
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()));
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="16sp"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:text="Placeholder Title"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
@@ -19,8 +20,11 @@
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="14sp"
|
||||
android:text="Placeholder Description"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/debug_menu_item_title" />
|
||||
|
||||
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
@@ -1,4 +1,5 @@
|
||||
plugins {
|
||||
id 'com.google.dagger.hilt.android'
|
||||
id 'com.android.library'
|
||||
}
|
||||
|
||||
@@ -29,6 +30,8 @@ dependencies {
|
||||
|
||||
implementation libs.androidx.appcompat
|
||||
implementation libs.com.google.android.material
|
||||
implementation project(path: ':feature:debug')
|
||||
implementation project(path: ':utils')
|
||||
testImplementation libs.junit
|
||||
androidTestImplementation libs.androidx.test.ext.junit
|
||||
androidTestImplementation libs.androidx.test.espresso.core
|
||||
@@ -38,6 +41,20 @@ dependencies {
|
||||
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')
|
||||
|
||||
// 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 appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
|
||||
assertEquals("one.nem.lacerta.feature.home.test", appContext.getPackageName());
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,64 +1,122 @@
|
||||
package one.nem.lacerta.feature.home;
|
||||
|
||||
import android.os.Bundle;
|
||||
|
||||
import androidx.fragment.app.Fragment;
|
||||
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.View;
|
||||
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.
|
||||
* Use the {@link HomeTopFragment#newInstance} factory method to
|
||||
* create an instance of this fragment.
|
||||
*/
|
||||
@AndroidEntryPoint
|
||||
public class HomeTopFragment extends Fragment {
|
||||
|
||||
// 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;
|
||||
@Inject
|
||||
LacertaLibrary lacertaLibrary;
|
||||
|
||||
public HomeTopFragment() {
|
||||
// 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 HomeTopFragment.
|
||||
*/
|
||||
// TODO: Rename and change types and number of parameters
|
||||
public static HomeTopFragment newInstance(String param1, String param2) {
|
||||
public static HomeTopFragment newInstance() {
|
||||
HomeTopFragment fragment = new HomeTopFragment();
|
||||
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) {
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
// 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"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".HomeTopFragment">
|
||||
android:background="@color/colorSurface">
|
||||
|
||||
<!-- TODO: Update blank fragment layout -->
|
||||
<TextView
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:text="@string/hello_blank_fragment" />
|
||||
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="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>
|
||||
@@ -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>
|
||||
<!-- TODO: Remove or change this placeholder text -->
|
||||
<string name="hello_blank_fragment">Hello blank fragment</string>
|
||||
<string name="textview">TextView</string>
|
||||
</resources>
|
||||
@@ -25,6 +25,8 @@ import one.nem.lacerta.data.Document;
|
||||
import one.nem.lacerta.model.document.DocumentMeta;
|
||||
import one.nem.lacerta.model.document.tag.DocumentTag;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* A simple {@link Fragment} subclass.
|
||||
* Use the {@link LibraryTopFragment#newInstance} factory method to
|
||||
|
||||
@@ -27,9 +27,17 @@ android {
|
||||
|
||||
dependencies {
|
||||
|
||||
implementation 'androidx.appcompat:appcompat:1.6.1'
|
||||
implementation 'com.google.android.material:material:1.10.0'
|
||||
testImplementation 'junit:junit:4.13.2'
|
||||
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
|
||||
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
|
||||
|
||||
// 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')
|
||||
|
||||
}
|
||||
Whitespace-only 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);
|
||||
}
|
||||
}
|
||||
@@ -73,4 +73,6 @@ public class DocumentDetail {
|
||||
this.pages = pages;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -48,6 +48,17 @@ public class DocumentMeta { // TODO-rca: JavaDoc対応
|
||||
public DocumentMeta() {
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
@@ -31,3 +31,4 @@ include ':model'
|
||||
include ':processor'
|
||||
include ':shared:ui'
|
||||
include ':vcs'
|
||||
include ':feature:setting'
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<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"
|
||||
android:duration="@android:integer/config_mediumAnimTime" />
|
||||
android:duration="120" />
|
||||
</set>
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<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"
|
||||
android:duration="@android:integer/config_mediumAnimTime" />
|
||||
android:duration="120" />
|
||||
</set>
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<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"
|
||||
android:duration="@android:integer/config_mediumAnimTime" />
|
||||
android:duration="120" />
|
||||
</set>
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<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"
|
||||
android:duration="@android:integer/config_mediumAnimTime" />
|
||||
android:duration="120" />
|
||||
</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="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="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="colorOnSurfaceVariant">@color/material_dynamic_neutral_variant30</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>
|
||||
@@ -25,4 +25,8 @@
|
||||
<color name="colorSurfaceInverse">#313033</color>
|
||||
<color name="colorOnSurfaceInverse">#F4EFF4</color>
|
||||
<color name="colorPrimaryInverse">#D0BCFF</color>
|
||||
|
||||
<!-- indicator icon background -->
|
||||
<color name="colorIndicator">#d2d4bc</color>
|
||||
<color name="colorOnSurfaceSecondary">#49454F</color>
|
||||
</resources>
|
||||
@@ -24,4 +24,8 @@
|
||||
<color name="colorSurfaceVariant">@color/material_dynamic_neutral_variant90</color>
|
||||
<color name="colorOnSurfaceVariant">@color/material_dynamic_neutral_variant30</color>
|
||||
<color name="colorSurfaceInverse">@color/material_dynamic_neutral20</color>
|
||||
|
||||
<!-- indicator icon background -->
|
||||
<color name="colorIndicator">@color/material_dynamic_secondary80</color>
|
||||
<color name="colorOnSurfaceSecondary">@color/material_dynamic_neutral_variant30</color>
|
||||
</resources>
|
||||
@@ -0,0 +1,35 @@
|
||||
<?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">true</item>
|
||||
<item name="android:windowLightStatusBar">true</item>
|
||||
</style>
|
||||
</resources>
|
||||
@@ -25,4 +25,7 @@
|
||||
<color name="colorSurfaceInverse">#31312B</color>
|
||||
<color name="colorOnSurfaceInverse">#F3F1E8</color>
|
||||
<color name="colorPrimaryInverse">#B8D321</color>
|
||||
<!-- indicator icon background -->
|
||||
<color name="colorIndicator">#d2d4bc</color>
|
||||
<color name="colorOnSurfaceSecondary">#46483B</color>
|
||||
</resources>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<style name="Lacerta.Custom.Indicator" parent="Widget.Material3.BottomNavigationView.ActiveIndicator">
|
||||
<item name="android:color">@color/colorIndicator</item>
|
||||
</style>
|
||||
</resources>
|
||||
@@ -0,0 +1,34 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<!-- home -->
|
||||
<string name="home_title">ホーム</string>
|
||||
|
||||
<!-- search -->
|
||||
<string name="search_title">検索</string>
|
||||
|
||||
<!-- library -->
|
||||
<string name="library_title">ライブラリ</string>
|
||||
|
||||
<!-- debug -->
|
||||
<string name="debug_menu_title">デバッグメニュー</string>
|
||||
|
||||
<!-- setting -->
|
||||
<string name="setting_title">設定</string>
|
||||
|
||||
<string name="setting_top_scan_title">スキャン</string>
|
||||
<string name="setting_top_scan_description">画質, 保存先</string>
|
||||
|
||||
<string name="setting_top_display_title">表示</string>
|
||||
<string name="setting_top_display_description">テーマ, フォントサイズ</string>
|
||||
|
||||
<string name="setting_top_data_title">データ</string>
|
||||
<string name="setting_top_data_description">バックアップ, リストア</string>
|
||||
|
||||
<string name="setting_top_about_title">このアプリについて</string>
|
||||
<string name="setting_top_about_description">バージョン情報</string>
|
||||
|
||||
<!-- common -->
|
||||
|
||||
<string name="placeholder">Placeholder(TODO: Replace)</string>
|
||||
</resources>
|
||||
@@ -28,7 +28,6 @@
|
||||
<item name="colorOutline">@color/colorOutline</item>
|
||||
<item name="colorOnBackground">@color/colorOnBackground</item>
|
||||
|
||||
|
||||
</style>
|
||||
|
||||
<style name="Theme.Lacerta" parent="Base.Theme.Lacerta" >
|
||||
|
||||
@@ -47,4 +47,7 @@ dependencies {
|
||||
// Utils モジュール
|
||||
implementation project(':utils')
|
||||
|
||||
// Model
|
||||
implementation project(':model')
|
||||
|
||||
}
|
||||
@@ -4,6 +4,8 @@ import androidx.room.Database;
|
||||
import androidx.room.RoomDatabase;
|
||||
|
||||
// Entities
|
||||
import one.nem.lacerta.source.database.dao.FolderDao;
|
||||
import one.nem.lacerta.source.database.entity.FolderEntity;
|
||||
import one.nem.lacerta.source.database.entity.TagEntity;
|
||||
import one.nem.lacerta.source.database.entity.DocumentEntity;
|
||||
import one.nem.lacerta.source.database.entity.LibraryEntity;
|
||||
@@ -17,11 +19,12 @@ import one.nem.lacerta.source.database.dao.LibraryDao;
|
||||
import one.nem.lacerta.source.database.dao.VcsRevDao;
|
||||
import one.nem.lacerta.source.database.dao.VcsLogDao;
|
||||
|
||||
@Database(entities = {TagEntity.class, DocumentEntity.class, LibraryEntity.class, VcsRevEntity.class, VcsLogEntity.class}, version = 2)
|
||||
@Database(entities = {TagEntity.class, DocumentEntity.class, LibraryEntity.class, VcsRevEntity.class, VcsLogEntity.class, FolderEntity.class}, version = 4)
|
||||
public abstract class LacertaDatabase extends RoomDatabase {
|
||||
public abstract TagDao tagDao();
|
||||
public abstract DocumentDao documentDao();
|
||||
public abstract LibraryDao libraryDao();
|
||||
public abstract VcsRevDao vcsRevDao();
|
||||
public abstract VcsLogDao vcsLogDao();
|
||||
public abstract FolderDao folderDao();
|
||||
}
|
||||
@@ -28,6 +28,12 @@ public interface DocumentDao {
|
||||
@Query("SELECT * FROM Document WHERE id IN (:ids)")
|
||||
List<DocumentEntity> findByIds(List<String> ids);
|
||||
|
||||
@Query("SELECT * FROM Document WHERE public_path = :publicPath LIMIT :limit")
|
||||
List<DocumentEntity> findByPublicPathWithLimit(String publicPath, int limit);
|
||||
|
||||
@Query("SELECT * FROM Document ORDER BY created_at DESC LIMIT :limit")
|
||||
List<DocumentEntity> getRecentDocument(int limit);
|
||||
|
||||
// Insert
|
||||
@Insert
|
||||
void insert(DocumentEntity document);
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
package one.nem.lacerta.source.database.dao;
|
||||
|
||||
import androidx.room.Dao;
|
||||
import androidx.room.Insert;
|
||||
import androidx.room.Query;
|
||||
|
||||
import one.nem.lacerta.source.database.entity.FolderEntity;
|
||||
|
||||
@Dao
|
||||
public interface FolderDao {
|
||||
|
||||
@Query("SELECT * FROM Folder WHERE id = :id")
|
||||
FolderEntity findById(String id);
|
||||
|
||||
@Query("SELECT * FROM Folder WHERE public_path = :publicPath")
|
||||
FolderEntity findByPublicPath(String publicPath);
|
||||
|
||||
@Insert
|
||||
void insert(FolderEntity folderEntity);
|
||||
|
||||
@Insert
|
||||
void insertAll(FolderEntity... folderEntities);
|
||||
}
|
||||
@@ -3,6 +3,7 @@ package one.nem.lacerta.source.database.dao;
|
||||
import androidx.room.Dao;
|
||||
import androidx.room.Insert;
|
||||
import androidx.room.Query;
|
||||
import androidx.room.Update;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -24,6 +25,14 @@ public interface VcsLogDao {
|
||||
@Query("SELECT * FROM vcs_log WHERE document_id = :documentId")
|
||||
List<VcsLogEntity> findByDocumentId(String documentId);
|
||||
|
||||
@Query("SELECT * FROM vcs_log WHERE document_id = :documentId AND is_included = :isIncluded ORDER BY created_at")
|
||||
List<VcsLogEntity> findByDocumentIdAndIncluded(String documentId, boolean isIncluded);
|
||||
|
||||
@Query("SELECT * FROM vcs_log WHERE document_id = :documentId AND branch_name = :branchName")
|
||||
List<VcsLogEntity> findByDocumentIdAndBranchName(String documentId, String branchName);
|
||||
|
||||
@Query("SELECT * FROM vcs_log WHERE document_id = :documentId AND branch_name = :branchName AND is_included = :isIncluded ORDER BY created_at")
|
||||
List<VcsLogEntity> findByDocumentIdAndBranchNameAndIncluded(String documentId, String branchName, boolean isIncluded);
|
||||
// Insert
|
||||
|
||||
@Insert
|
||||
@@ -35,5 +44,12 @@ public interface VcsLogDao {
|
||||
@Insert
|
||||
void insert(VcsLogEntity vcsLog);
|
||||
|
||||
// TODO-rca: Update, Deleteが必要か検討
|
||||
@Update
|
||||
void update(VcsLogEntity vcsLog);
|
||||
|
||||
@Update
|
||||
void updateAll(VcsLogEntity... vcsLogs);
|
||||
|
||||
@Update
|
||||
void updateAll(List<VcsLogEntity> vcsLogs);
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package one.nem.lacerta.source.database.entity;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.room.ColumnInfo;
|
||||
import androidx.room.Entity;
|
||||
import androidx.room.PrimaryKey;
|
||||
|
||||
@Entity(tableName = "folder")
|
||||
public class FolderEntity {
|
||||
|
||||
@PrimaryKey
|
||||
@ColumnInfo(name = "id")
|
||||
@NonNull
|
||||
public String id; // フォルダID
|
||||
|
||||
@ColumnInfo(name = "title")
|
||||
public String name; // フォルダ名
|
||||
|
||||
@ColumnInfo(name = "public_path")
|
||||
public String publicPath; // 公開パス
|
||||
|
||||
}
|
||||
@@ -45,4 +45,10 @@ public class VcsLogEntity {
|
||||
*/
|
||||
@ColumnInfo(name = "action")
|
||||
public String action;
|
||||
|
||||
/**
|
||||
* Revに含まれてるかどうか
|
||||
*/
|
||||
@ColumnInfo(name = "is_included")
|
||||
public boolean isIncluded;
|
||||
}
|
||||
@@ -11,7 +11,12 @@ public interface LacertaVcs {
|
||||
|
||||
public void createDocument(String documentId);
|
||||
|
||||
public void generateRevisionAtCurrent(String message);
|
||||
|
||||
|
||||
// debug
|
||||
public void printLog();
|
||||
|
||||
public void printRev();
|
||||
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
package one.nem.lacerta.vcs.impl;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import javax.inject.Inject;
|
||||
@@ -8,8 +10,12 @@ import dagger.assisted.Assisted;
|
||||
import dagger.assisted.AssistedInject;
|
||||
import one.nem.lacerta.source.database.LacertaDatabase;
|
||||
import one.nem.lacerta.source.database.entity.VcsLogEntity;
|
||||
import one.nem.lacerta.source.database.entity.VcsRevEntity;
|
||||
import one.nem.lacerta.utils.LacertaLogger;
|
||||
import one.nem.lacerta.vcs.ActionType;
|
||||
import one.nem.lacerta.vcs.LacertaVcs;
|
||||
import one.nem.lacerta.vcs.internal.JsonUtils;
|
||||
import one.nem.lacerta.vcs.model.action.InsertPage;
|
||||
|
||||
public class LacertaVcsImpl implements LacertaVcs {
|
||||
|
||||
@@ -38,12 +44,17 @@ public class LacertaVcsImpl implements LacertaVcs {
|
||||
@Override
|
||||
public void insertPage(int index, String fileName) {
|
||||
logger.debug(TAG, "insertPage");
|
||||
|
||||
// InsertPage
|
||||
InsertPage insertPage = new InsertPage(index, fileName);
|
||||
insertPage.setActionType(ActionType.INSERT_PAGE);
|
||||
|
||||
VcsLogEntity vcsLogEntity = new VcsLogEntity();
|
||||
vcsLogEntity.id = UUID.randomUUID().toString();
|
||||
vcsLogEntity.documentId = documentId;
|
||||
vcsLogEntity.branchName = "master";
|
||||
vcsLogEntity.createdAt = new java.util.Date();
|
||||
vcsLogEntity.action = "placeholder";
|
||||
vcsLogEntity.action = JsonUtils.toJson(insertPage);
|
||||
database.vcsLogDao().insert(vcsLogEntity);
|
||||
}
|
||||
|
||||
@@ -54,7 +65,61 @@ public class LacertaVcsImpl implements LacertaVcs {
|
||||
|
||||
@Override
|
||||
public void createDocument(String documentId) {
|
||||
logger.debug(TAG, "createDocument");
|
||||
|
||||
VcsLogEntity vcsLogEntity = new VcsLogEntity();
|
||||
vcsLogEntity.id = UUID.randomUUID().toString();
|
||||
vcsLogEntity.documentId = documentId;
|
||||
vcsLogEntity.branchName = "master";
|
||||
vcsLogEntity.createdAt = new java.util.Date();
|
||||
vcsLogEntity.action = "ph-createDocument";
|
||||
database.vcsLogDao().insert(vcsLogEntity);
|
||||
}
|
||||
|
||||
// Internal
|
||||
private ArrayList<VcsLogEntity> getNonIncludedVcsLogEntities() {
|
||||
return new ArrayList<>(database.vcsLogDao().findByDocumentIdAndIncluded(documentId, false));
|
||||
}
|
||||
|
||||
private ArrayList<VcsLogEntity> getNonIncludedVcsLogEntities(String branchName) {
|
||||
return new ArrayList<>(database.vcsLogDao().findByDocumentIdAndBranchNameAndIncluded(documentId, branchName, false));
|
||||
}
|
||||
|
||||
private void setIncludedVcsLogEntities(ArrayList<VcsLogEntity> vcsLogEntities) {
|
||||
vcsLogEntities.forEach(vcsLogEntity -> {
|
||||
vcsLogEntity.isIncluded = true;
|
||||
database.vcsLogDao().update(vcsLogEntity);
|
||||
});
|
||||
|
||||
logger.debug(TAG, "setIncludedVcsLogEntities updated: " + vcsLogEntities.size() + " entities");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void generateRevisionAtCurrent(String message) {
|
||||
logger.debug(TAG, "generateRevisionAtCurrent");
|
||||
// TODO-rca: ブランチを考慮する
|
||||
|
||||
ArrayList<VcsLogEntity> vcsLogEntities = getNonIncludedVcsLogEntities();
|
||||
|
||||
ArrayList<String> logIds = new ArrayList<>();
|
||||
vcsLogEntities.forEach(vcsLogEntity -> {
|
||||
logIds.add(vcsLogEntity.id);
|
||||
});
|
||||
|
||||
VcsRevEntity vcsRevEntity = new VcsRevEntity();
|
||||
vcsRevEntity.id = UUID.randomUUID().toString();
|
||||
vcsRevEntity.documentId = documentId;
|
||||
vcsRevEntity.branchName = "master";
|
||||
vcsRevEntity.createdAt = new java.util.Date();
|
||||
vcsRevEntity.commitMessage = message;
|
||||
vcsRevEntity.logIds = logIds;
|
||||
|
||||
database.vcsRevDao().insert(vcsRevEntity);
|
||||
|
||||
setIncludedVcsLogEntities(vcsLogEntities);
|
||||
|
||||
logger.debug(TAG, "generateRevisionAtCurrent finished");
|
||||
logger.debug(TAG, "New revision inserted: " + vcsRevEntity.id);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -62,6 +127,19 @@ public class LacertaVcsImpl implements LacertaVcs {
|
||||
logger.debug(TAG, "printLog");
|
||||
database.vcsLogDao().findAll().forEach(vcsLog -> {
|
||||
logger.debug(TAG, vcsLog.id);
|
||||
logger.debug(TAG, vcsLog.documentId + " " + vcsLog.branchName);
|
||||
logger.debug(TAG, vcsLog.action);
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void printRev() {
|
||||
logger.debug(TAG, "printRev");
|
||||
database.vcsRevDao().findAll().forEach(vcsRev -> {
|
||||
logger.debug(TAG, vcsRev.id);
|
||||
logger.debug(TAG, vcsRev.documentId + " " + vcsRev.branchName);
|
||||
logger.debug(TAG, vcsRev.commitMessage);
|
||||
logger.debug(TAG, vcsRev.logIds.toString());
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user