Merge pull request #86 from lacerta-doc/fix/async

非同期化
This commit is contained in:
ろむねこ 2024-01-21 15:03:21 +09:00 committed by GitHub
commit 5840c0126e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 455 additions and 327 deletions

View File

@ -1,5 +1,6 @@
package one.nem.lacerta.component.scanner; package one.nem.lacerta.component.scanner;
import android.app.ProgressDialog;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.BitmapDrawable;
@ -22,6 +23,7 @@ import com.websitebeaver.documentscanner.DocumentScanner;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.CompletableFuture;
import javax.inject.Inject; import javax.inject.Inject;
@ -152,21 +154,34 @@ public class ScannerManagerActivity extends AppCompatActivity {
private void saveNewDocument() { private void saveNewDocument() {
logger.debug(TAG, "saveNewDocument"); logger.debug(TAG, "saveNewDocument");
// Deprecatedだが中断機能が存在しないので操作をブロックする目的で(意図的に)使用
ProgressDialog dialog = new ProgressDialog(this);
dialog.setMessage("保存中..."); // TODO-rca: テキストをリソースに移動
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
dialog.setCancelable(false);
dialog.show();
DocumentMeta documentMeta = new DocumentMeta("Untitled"); // TODO-rca: デフォルトタイトルを指定できるようにする DocumentMeta documentMeta = new DocumentMeta("Untitled"); // TODO-rca: デフォルトタイトルを指定できるようにする
DocumentDetail documentDetail = document.createDocument(documentMeta); document.createDocument(documentMeta).thenAccept((documentDetail1) -> {
Bitmap[] bitmaps = new Bitmap[this.croppedImages.size()]; Bitmap[] bitmaps = new Bitmap[this.croppedImages.size()];
this.croppedImages.toArray(bitmaps); this.croppedImages.toArray(bitmaps);
try { addPagesToDocumentDetail(documentDetail1, bitmaps).thenRun(() -> {
documentProcessorFactory.create(documentDetail).addNewPagesToLast(bitmaps); dialog.dismiss();
Toast.makeText(this, "Saved.", Toast.LENGTH_SHORT).show(); finish();
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()); private CompletableFuture<Void> addPagesToDocumentDetail(DocumentDetail documentDetail, Bitmap[] bitmaps) {
logger.e_code("9dff2a28-20e8-4ccd-9d04-f0c7646faa6a"); return CompletableFuture.runAsync(() -> {
} try {
documentProcessorFactory.create(documentDetail).addNewPagesToLast(bitmaps);
lacertaVcsFactory.create(documentDetail.getMeta().getId()).generateRevisionAtCurrent("Initial commit");
} catch (Exception e) {
logger.error(TAG, "Error: " + e.getMessage());
logger.e_code("9dff2a28-20e8-4ccd-9d04-f0c7646faa6a");
}
});
} }
private void insertToExistDocument() { private void insertToExistDocument() {

View File

@ -2,6 +2,7 @@ package one.nem.lacerta.data;
import java.lang.reflect.Array; import java.lang.reflect.Array;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.concurrent.CompletableFuture;
import one.nem.lacerta.model.document.DocumentMeta; import one.nem.lacerta.model.document.DocumentMeta;
import one.nem.lacerta.model.document.DocumentDetail; import one.nem.lacerta.model.document.DocumentDetail;
@ -13,13 +14,13 @@ import one.nem.lacerta.model.document.tag.DocumentTag;
*/ */
public interface Document { public interface Document {
DocumentDetail createDocument(DocumentMeta meta); CompletableFuture<DocumentDetail> createDocument(DocumentMeta meta);
DocumentDetail createDocument(); CompletableFuture<DocumentDetail> createDocument();
void deleteDocument(String documentId); CompletableFuture<Void> deleteDocument(String documentId);
void updateDocument(DocumentMeta meta, DocumentDetail detail); CompletableFuture<Void> updateDocument(DocumentMeta meta, DocumentDetail detail);
DocumentDetail getDocument(String documentId); CompletableFuture<DocumentDetail> getDocument(String documentId);
} }

View File

@ -1,6 +1,7 @@
package one.nem.lacerta.data; package one.nem.lacerta.data;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.concurrent.CompletableFuture;
import one.nem.lacerta.model.ListItem; import one.nem.lacerta.model.ListItem;
import one.nem.lacerta.model.ListItemType; import one.nem.lacerta.model.ListItemType;
@ -11,15 +12,13 @@ import one.nem.lacerta.model.document.DocumentDetail;
public interface LacertaLibrary { public interface LacertaLibrary {
// Get History // Get History
ArrayList<ListItem> getRecentDocument(int limit); CompletableFuture<ArrayList<ListItem>> getRecentDocument(int limit);
ArrayList<ListItem> getRecentDocument(int limit, int offset); CompletableFuture<ArrayList<ListItem>> getRecentDocument(int limit, int offset);
// Get Library page // Get Library page
LibraryItemPage getLibraryPage(int limit); CompletableFuture<LibraryItemPage> getLibraryPage(int limit);
LibraryItemPage getLibraryPage(int limit, int offset); CompletableFuture<LibraryItemPage> getLibraryPage(int limit, int offset);
LibraryItemPage getLibraryPage(String pageId, int limit); CompletableFuture<LibraryItemPage> getLibraryPage(String pageId, int limit);
LibraryItemPage getLibraryPage(String pageId, int limit, int offset); CompletableFuture<LibraryItemPage> getLibraryPage(String pageId, int limit, int offset);
// GetDocument
DocumentDetail getDocumentDetailById(String id); // TODO-rca: Documentに統合する
} }

View File

@ -1,8 +1,10 @@
package one.nem.lacerta.data.impl; package one.nem.lacerta.data.impl;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.CompletableFuture;
// Hilt // Hilt
import javax.inject.Inject; import javax.inject.Inject;
@ -16,13 +18,19 @@ import one.nem.lacerta.model.document.DocumentMeta;
import one.nem.lacerta.model.document.DocumentDetail; import one.nem.lacerta.model.document.DocumentDetail;
// Lacerta/source // Lacerta/source
import one.nem.lacerta.model.document.internal.XmlMetaPageModel;
import one.nem.lacerta.model.document.page.Page;
import one.nem.lacerta.source.database.LacertaDatabase; import one.nem.lacerta.source.database.LacertaDatabase;
import one.nem.lacerta.source.database.entity.DocumentEntity; import one.nem.lacerta.source.database.entity.DocumentEntity;
// Lacerta/utils // Lacerta/utils
import one.nem.lacerta.source.file.FileManager;
import one.nem.lacerta.source.file.factory.FileManagerFactory;
import one.nem.lacerta.utils.LacertaLogger; import one.nem.lacerta.utils.LacertaLogger;
// Lacerta/vcs // Lacerta/vcs
import one.nem.lacerta.utils.XmlMetaParser;
import one.nem.lacerta.utils.repository.DeviceInfoUtils;
import one.nem.lacerta.vcs.LacertaVcs; import one.nem.lacerta.vcs.LacertaVcs;
import one.nem.lacerta.vcs.factory.LacertaVcsFactory; import one.nem.lacerta.vcs.factory.LacertaVcsFactory;
@ -40,6 +48,14 @@ public class DocumentImpl implements Document {
@Inject @Inject
LacertaVcsFactory vcsFactory; LacertaVcsFactory vcsFactory;
@Inject
FileManagerFactory fileManagerFactory;
@Inject
DeviceInfoUtils deviceInfoUtils;
@Inject
XmlMetaParser xmlMetaParser;
@Inject @Inject
public DocumentImpl() { public DocumentImpl() {
@ -49,35 +65,34 @@ public class DocumentImpl implements Document {
@Override @Override
public DocumentDetail createDocument(DocumentMeta meta) { public CompletableFuture<DocumentDetail> createDocument(DocumentMeta meta) {
DocumentDetail detail = new DocumentDetail(); return CompletableFuture.supplyAsync(() -> {
detail.setMeta(meta); DocumentDetail detail = new DocumentDetail();
detail.setPages(new ArrayList<>()); detail.setMeta(meta);
detail.setPages(new ArrayList<>());
// Create DocumentEntity
DocumentEntity documentEntity = new DocumentEntity();
documentEntity.id = meta.getId();
documentEntity.title = meta.getTitle();
documentEntity.author = meta.getAuthor();
documentEntity.defaultBranch = meta.getDefaultBranch();
documentEntity.updatedAt = meta.getUpdatedAt();
documentEntity.createdAt = meta.getCreatedAt();
documentEntity.publicPath = meta.getPath().getStringPath();
documentEntity.tagIds = meta.getTagIds();
// TODO-rca: UIスレッドから追い出す database.documentDao().insert(documentEntity);
// Create DocumentEntity // Vcs
DocumentEntity documentEntity = new DocumentEntity(); LacertaVcs vcs = vcsFactory.create(meta.getId());
documentEntity.id = meta.getId(); vcs.createDocument(meta.getId());
documentEntity.title = meta.getTitle();
documentEntity.author = meta.getAuthor();
documentEntity.defaultBranch = meta.getDefaultBranch();
documentEntity.updatedAt = meta.getUpdatedAt();
documentEntity.createdAt = meta.getCreatedAt();
documentEntity.publicPath = meta.getPath().getStringPath();
documentEntity.tagIds = meta.getTagIds();
database.documentDao().insert(documentEntity); return detail;
});
// Vcs
LacertaVcs vcs = vcsFactory.create(meta.getId());
vcs.createDocument(meta.getId());
return detail;
} }
@Override @Override
public DocumentDetail createDocument() { public CompletableFuture<DocumentDetail> createDocument() {
DocumentMeta meta = new DocumentMeta(); DocumentMeta meta = new DocumentMeta();
meta.setId(UUID.randomUUID().toString()); meta.setId(UUID.randomUUID().toString());
meta.setTitle("New Document"); meta.setTitle("New Document");
@ -91,17 +106,83 @@ public class DocumentImpl implements Document {
} }
@Override @Override
public void deleteDocument(String documentId) { public CompletableFuture<Void> deleteDocument(String documentId) {
return CompletableFuture.supplyAsync(() -> {
return null;
});
} }
@Override @Override
public void updateDocument(DocumentMeta meta, DocumentDetail detail) { public CompletableFuture<Void> updateDocument(DocumentMeta meta, DocumentDetail detail) {
return CompletableFuture.supplyAsync(() -> {
return null;
});
} }
@Override @Override
public DocumentDetail getDocument(String documentId) { public CompletableFuture<DocumentDetail> getDocument(String documentId) {
return null; return CompletableFuture.supplyAsync(() -> {
DocumentEntity documentEntity = database.documentDao().findById(documentId);
if (documentEntity == null) {
throw new IllegalArgumentException("documentId is not found");
}
DocumentMeta meta = new DocumentMeta();
meta.setId(documentEntity.id);
meta.setTitle(documentEntity.title);
meta.setAuthor(documentEntity.author);
meta.setDefaultBranch(documentEntity.defaultBranch);
meta.setUpdatedAt(documentEntity.updatedAt);
meta.setCreatedAt(documentEntity.createdAt);
meta.setPath(new PublicPath().resolve(documentEntity.publicPath));
meta.setTags(new ArrayList<>()); // TODO-rca: タグを取得する
DocumentDetail detail = new DocumentDetail();
getPagesByXmlMeta(documentId).thenCompose(xmlMetaPageModels -> getPagesByXmlMetaPageModel(documentId, xmlMetaPageModels)).thenAccept(pages -> {
detail.setMeta(meta);
detail.setPages(pages);
});
return detail;
});
}
private CompletableFuture<ArrayList<XmlMetaPageModel>> getPagesByXmlMeta(String documentId) {
return CompletableFuture.supplyAsync(() -> {
FileManager fileManager = fileManagerFactory.create(deviceInfoUtils.getExternalStorageDirectory());
try {
return xmlMetaParser.deserialize(fileManager.resolve(documentId).loadXml("meta.xml")).getPages();
} catch (IOException e) {
logger.error(TAG, "DocumentMeta parse error");
logger.trace(TAG, e.getMessage());
logger.e_code("db18c04a-1625-4871-9e4e-918d805568ac");
}
return null;
});
}
private CompletableFuture<ArrayList<Page>> getPagesByXmlMetaPageModel(String documentId, ArrayList<XmlMetaPageModel> xmlMetaPageModels) {
return CompletableFuture.supplyAsync(() -> {
ArrayList<Page> pages = new ArrayList<>();
FileManager fileManager;
try {
fileManager = fileManagerFactory.create(deviceInfoUtils.getExternalStorageDirectory()).resolve(documentId);
} catch (IOException e) {
logger.error(TAG, "FileManager resolve error");
logger.trace(TAG, e.getMessage());
logger.e_code("2235e8ee-4177-46f8-af6b-084381b202e6");
return null;
}
for (XmlMetaPageModel xmlMetaPageModel : xmlMetaPageModels) {
try {
pages.add(new Page(xmlMetaPageModel.getFilename(), fileManager.loadBitmap(xmlMetaPageModel.getFilename())));
} catch (IOException e) {
logger.error(TAG, "Bitmap decode error");
logger.trace(TAG, e.getMessage());
logger.e_code("3bba8c8f-90fb-4a24-a726-7ea201929f8b");
return null;
}
}
return pages;
});
} }
} }

View File

@ -2,7 +2,9 @@ package one.nem.lacerta.data.impl;
import java.text.DateFormat; import java.text.DateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.concurrent.CompletableFuture;
import javax.inject.Inject; import javax.inject.Inject;
@ -18,55 +20,71 @@ import one.nem.lacerta.utils.LacertaLogger;
public class LacertaLibraryImpl implements LacertaLibrary { public class LacertaLibraryImpl implements LacertaLibrary {
@Inject
LacertaLogger logger; LacertaLogger logger;
@Inject
LacertaDatabase database; LacertaDatabase database;
@Override @Inject
public ArrayList<ListItem> getRecentDocument(int limit) { public LacertaLibraryImpl(LacertaLogger logger, LacertaDatabase database) {
List<DocumentEntity> documentEntities = database.documentDao().getRecentDocument(limit); this.logger = logger;
this.database = database;
ArrayList<ListItem> listItems = new ArrayList<>();
for (DocumentEntity documentEntity : documentEntities) {
ListItem listItem = new ListItem();
listItem.setItemType(ListItemType.ITEM_TYPE_DOCUMENT);
listItem.setTitle(documentEntity.title);
listItem.setDescription(DateFormat.getDateInstance().format(documentEntity.updatedAt));
listItem.setItemId(documentEntity.id);
listItems.add(listItem);
}
return listItems;
} }
@Override @Override
public ArrayList<ListItem> getRecentDocument(int limit, int offset) { public CompletableFuture<ArrayList<ListItem>> getRecentDocument(int limit) {
return CompletableFuture.supplyAsync(() -> {
// 5秒フリーズさせる
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
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 CompletableFuture<ArrayList<ListItem>> getRecentDocument(int limit, int offset) {
return null; // TODO-rca: Implement return null; // TODO-rca: Implement
} }
@Override @Override
public LibraryItemPage getLibraryPage(int limit) { public CompletableFuture<LibraryItemPage> getLibraryPage(int limit) {
return null; return CompletableFuture.supplyAsync(() -> {
return null;
});
} }
@Override @Override
public LibraryItemPage getLibraryPage(int limit, int offset) { public CompletableFuture<LibraryItemPage> getLibraryPage(int limit, int offset) {
return null; return CompletableFuture.supplyAsync(() -> {
return null;
});
} }
@Override @Override
public LibraryItemPage getLibraryPage(String pageId, int limit) { public CompletableFuture<LibraryItemPage> getLibraryPage(String pageId, int limit) {
return null; return CompletableFuture.supplyAsync(() -> {
return null;
});
} }
@Override @Override
public LibraryItemPage getLibraryPage(String pageId, int limit, int offset) { public CompletableFuture<LibraryItemPage> getLibraryPage(String pageId, int limit, int offset) {
return null; return CompletableFuture.supplyAsync(() -> {
} return null;
});
@Override
public DocumentDetail getDocumentDetailById(String id) {
return null;
} }
} }

View File

@ -1,219 +1,219 @@
package one.nem.lacerta.data.impl; //package one.nem.lacerta.data.impl;
//
import one.nem.lacerta.data.LacertaLibrary; //import one.nem.lacerta.data.LacertaLibrary;
import one.nem.lacerta.model.LibraryItemPage; //import one.nem.lacerta.model.LibraryItemPage;
import one.nem.lacerta.model.ListItem; //import one.nem.lacerta.model.ListItem;
import one.nem.lacerta.model.ListItemType; //import one.nem.lacerta.model.ListItemType;
import one.nem.lacerta.model.document.DocumentDetail; //import one.nem.lacerta.model.document.DocumentDetail;
//
import one.nem.lacerta.model.document.DocumentMeta; //import one.nem.lacerta.model.document.DocumentMeta;
import one.nem.lacerta.model.document.path.DocumentPath; //import one.nem.lacerta.model.document.path.DocumentPath;
import one.nem.lacerta.utils.LacertaLogger; //import one.nem.lacerta.utils.LacertaLogger;
//
import com.github.javafaker.DateAndTime; //import com.github.javafaker.DateAndTime;
import com.github.javafaker.Faker; //import com.github.javafaker.Faker;
//
import java.text.DateFormat; //import java.text.DateFormat;
import java.util.ArrayList; //import java.util.ArrayList;
import java.util.Objects; //import java.util.Objects;
import java.util.UUID; //import java.util.UUID;
//
import javax.inject.Inject; //import javax.inject.Inject;
//
/** ///**
* LacertaLibraryのスタブ実装 // * LacertaLibraryのスタブ実装
*/ // */
public class LacertaLibraryStubImpl implements LacertaLibrary { //public class LacertaLibraryStubImpl implements LacertaLibrary {
//
LacertaLogger logger; // LacertaLogger logger;
//
Faker faker; // Faker faker;
//
@Inject // @Inject
public LacertaLibraryStubImpl(LacertaLogger logger) { // public LacertaLibraryStubImpl(LacertaLogger logger) {
faker = new Faker(); // Init Faker // faker = new Faker(); // Init Faker
this.logger = logger; // this.logger = logger;
logger.debug("LibraryStub", "Initialized"); // logger.debug("LibraryStub", "Initialized");
} // }
//
// Internal Methods // // Internal Methods
//
// Generate Stub Data // // Generate Stub Data
private LibraryItemPage generateStubLibraryItemPage(int limit, String pageId) { // private LibraryItemPage generateStubLibraryItemPage(int limit, String pageId) {
logger.debug("LibraryStub", "generateStubLibraryItemPage"); // logger.debug("LibraryStub", "generateStubLibraryItemPage");
ArrayList<ListItem> listItems = new ArrayList<>(); // ArrayList<ListItem> listItems = new ArrayList<>();
int itemTotal = faker.number().numberBetween(1, limit); // 実際に返却するアイテム数を決定 // int itemTotal = faker.number().numberBetween(1, limit); // 実際に返却するアイテム数を決定
int folderTotal; // int folderTotal;
// フォルダ数の抽選 // // フォルダ数の抽選
if (itemTotal > 4) { // if (itemTotal > 4) {
folderTotal = faker.number().numberBetween(1, itemTotal - 2); // folderTotal = faker.number().numberBetween(1, itemTotal - 2);
} // }
else { // else {
if (itemTotal > 2) { // if (itemTotal > 2) {
folderTotal = 1; // folderTotal = 1;
} // }
else { // ドキュメント数がゼロにならないように // else { // ドキュメント数がゼロにならないように
folderTotal = 0; // folderTotal = 0;
} // }
} // }
int documentTotal = itemTotal - folderTotal; // ドキュメント数を決定 // int documentTotal = itemTotal - folderTotal; // ドキュメント数を決定
logger.debug("LibraryStub", "itemTotal: " + itemTotal); // logger.debug("LibraryStub", "itemTotal: " + itemTotal);
logger.debug("LibraryStub", "folderTotal: " + folderTotal); // logger.debug("LibraryStub", "folderTotal: " + folderTotal);
logger.debug("LibraryStub", "documentTotal: " + documentTotal); // logger.debug("LibraryStub", "documentTotal: " + documentTotal);
//
// フォルダを生成 // // フォルダを生成
for (int i = 0; i < folderTotal; i++) { // for (int i = 0; i < folderTotal; i++) {
listItems.add(generateStubListItem(ListItemType.ITEM_TYPE_FOLDER)); // listItems.add(generateStubListItem(ListItemType.ITEM_TYPE_FOLDER));
} // }
// ドキュメントを生成 // // ドキュメントを生成
for (int i = 0; i < documentTotal; i++) { // for (int i = 0; i < documentTotal; i++) {
listItems.add(generateStubListItem(ListItemType.ITEM_TYPE_DOCUMENT)); // listItems.add(generateStubListItem(ListItemType.ITEM_TYPE_DOCUMENT));
} // }
//
LibraryItemPage libraryItemPage = new LibraryItemPage(); // LibraryItemPage libraryItemPage = new LibraryItemPage();
libraryItemPage.setListItems(listItems); // libraryItemPage.setListItems(listItems);
if (pageId == null) { // if (pageId == null) {
libraryItemPage.setPageId(UUID.randomUUID().toString()); // libraryItemPage.setPageId(UUID.randomUUID().toString());
} else { // } else {
libraryItemPage.setPageId(pageId); // libraryItemPage.setPageId(pageId);
} // }
libraryItemPage.setPageTitle("FakePage" + faker.number().digits(3)); // libraryItemPage.setPageTitle("FakePage" + faker.number().digits(3));
//
return libraryItemPage; // return libraryItemPage;
} // }
//
private ListItem generateStubListItem(ListItemType itemType) { // private ListItem generateStubListItem(ListItemType itemType) {
if (itemType == ListItemType.ITEM_TYPE_FOLDER) { // if (itemType == ListItemType.ITEM_TYPE_FOLDER) {
ListItem listItem = new ListItem(); // ListItem listItem = new ListItem();
listItem.setTitle("FakeFolder" + faker.number().digits(3)); // listItem.setTitle("FakeFolder" + faker.number().digits(3));
listItem.setDescription("Updated at " + DateFormat.getDateTimeInstance().format(faker.date().birthday())); // listItem.setDescription("Updated at " + DateFormat.getDateTimeInstance().format(faker.date().birthday()));
listItem.setItemType(ListItemType.ITEM_TYPE_FOLDER); // listItem.setItemType(ListItemType.ITEM_TYPE_FOLDER);
listItem.setItemId(UUID.randomUUID().toString()); // listItem.setItemId(UUID.randomUUID().toString());
return listItem; // return listItem;
} else if (itemType == ListItemType.ITEM_TYPE_DOCUMENT) { // } else if (itemType == ListItemType.ITEM_TYPE_DOCUMENT) {
ListItem listItem = new ListItem(); // ListItem listItem = new ListItem();
listItem.setTitle("FakeDocument" + faker.book().title()); // listItem.setTitle("FakeDocument" + faker.book().title());
listItem.setDescription("Updated at " + DateFormat.getDateTimeInstance().format(faker.date().birthday())); // listItem.setDescription("Updated at " + DateFormat.getDateTimeInstance().format(faker.date().birthday()));
listItem.setItemType(ListItemType.ITEM_TYPE_DOCUMENT); // listItem.setItemType(ListItemType.ITEM_TYPE_DOCUMENT);
listItem.setItemId(UUID.randomUUID().toString()); // listItem.setItemId(UUID.randomUUID().toString());
return listItem; // return listItem;
} else { // } else {
return null; // return null;
} // }
} // }
//
private LibraryItemPage getRecentDocumentPage(int limit) { // private LibraryItemPage getRecentDocumentPage(int limit) {
int itemTotal = faker.number().numberBetween(1, limit); // int itemTotal = faker.number().numberBetween(1, limit);
ArrayList<ListItem> listItems = new ArrayList<>(); // ArrayList<ListItem> listItems = new ArrayList<>();
for (int i = 0; i < itemTotal; i++) { // for (int i = 0; i < itemTotal; i++) {
listItems.add(generateStubListItem(ListItemType.ITEM_TYPE_DOCUMENT)); // listItems.add(generateStubListItem(ListItemType.ITEM_TYPE_DOCUMENT));
} // }
// DescriptionからDateを抽出して新しい順にソート // // DescriptionからDateを抽出して新しい順にソート
listItems.sort((a, b) -> { // listItems.sort((a, b) -> {
String aDate = a.getDescription().substring(11); // String aDate = a.getDescription().substring(11);
String bDate = b.getDescription().substring(11); // String bDate = b.getDescription().substring(11);
return bDate.compareTo(aDate); // return bDate.compareTo(aDate);
}); // });
LibraryItemPage libraryItemPage = new LibraryItemPage(); // LibraryItemPage libraryItemPage = new LibraryItemPage();
libraryItemPage.setListItems(listItems); // libraryItemPage.setListItems(listItems);
libraryItemPage.setPageId(UUID.randomUUID().toString()); // libraryItemPage.setPageId(UUID.randomUUID().toString());
libraryItemPage.setPageTitle("RecentDocument"); // libraryItemPage.setPageTitle("RecentDocument");
return libraryItemPage; // return libraryItemPage;
} // }
//
private DocumentDetail generateStubDocumentDetail(String id) throws IllegalArgumentException { // private DocumentDetail generateStubDocumentDetail(String id) throws IllegalArgumentException {
//
if (Objects.isNull(id)) { // if (Objects.isNull(id)) {
throw new IllegalArgumentException("id is null"); // throw new IllegalArgumentException("id is null");
} // }
//
DocumentMeta documentMeta = new DocumentMeta(); // DocumentMeta documentMeta = new DocumentMeta();
documentMeta.setId(id); // documentMeta.setId(id);
documentMeta.setTitle("FakeDocument" + faker.book().title()); // documentMeta.setTitle("FakeDocument" + faker.book().title());
documentMeta.setCreatedAt(faker.date().birthday()); // documentMeta.setCreatedAt(faker.date().birthday());
documentMeta.setUpdatedAt(faker.date().birthday()); // TODO-rca: 更新日のほうが古くなることがあるのでなんとかする // documentMeta.setUpdatedAt(faker.date().birthday()); // TODO-rca: 更新日のほうが古くなることがあるのでなんとかする
ArrayList<String> tagIds = new ArrayList<>(); // ArrayList<String> tagIds = new ArrayList<>();
//
DocumentDetail documentDetail = new DocumentDetail(); // DocumentDetail documentDetail = new DocumentDetail();
documentDetail.setMeta(documentMeta); // documentDetail.setMeta(documentMeta);
// documentDetail.setPath(null); // TODO-rca: なんとかする //// documentDetail.setPath(null); // TODO-rca: なんとかする
// documentDetail.setAuthor(faker.name().fullName()); //// documentDetail.setAuthor(faker.name().fullName());
// documentDetail.setRepository(null); // TODO-rca: なんとかする //// documentDetail.setRepository(null); // TODO-rca: なんとかする
return documentDetail; // return documentDetail;
} // }
//
/** // /**
* 履歴ページを取得する // * 履歴ページを取得する
* @param limit 取得するアイテム数 // * @param limit 取得するアイテム数
* @return ページオブジェクト // * @return ページオブジェクト
*/ // */
@Override // @Override
public ArrayList<ListItem> getRecentDocument(int limit) { // public ArrayList<ListItem> getRecentDocument(int limit) {
return getRecentDocumentPage(limit).getListItems(); // return getRecentDocumentPage(limit).getListItems();
} // }
//
/** // /**
* 履歴ページを取得する // * 履歴ページを取得する
* @param limit 取得するアイテム数 // * @param limit 取得するアイテム数
* @param offset 取得するアイテムのオフセット // * @param offset 取得するアイテムのオフセット
* @return ページオブジェクト // * @return ページオブジェクト
*/ // */
@Override // @Override
public ArrayList<ListItem> getRecentDocument(int limit, int offset) { // public ArrayList<ListItem> getRecentDocument(int limit, int offset) {
return getRecentDocumentPage(limit).getListItems(); // return getRecentDocumentPage(limit).getListItems();
} // }
//
/** // /**
* ライブラリページを取得する // * ライブラリページを取得する
* @param limit 取得するアイテム数 // * @param limit 取得するアイテム数
* @return ページオブジェクト // * @return ページオブジェクト
*/ // */
@Override // @Override
public LibraryItemPage getLibraryPage(int limit) { // public LibraryItemPage getLibraryPage(int limit) {
return generateStubLibraryItemPage(limit, null); // return generateStubLibraryItemPage(limit, null);
} // }
//
/** // /**
* ライブラリページを取得する // * ライブラリページを取得する
* @param limit 取得するアイテム数 // * @param limit 取得するアイテム数
* @param offset 取得するアイテムのオフセット // * @param offset 取得するアイテムのオフセット
* @return ページオブジェクト // * @return ページオブジェクト
*/ // */
@Override // @Override
public LibraryItemPage getLibraryPage(int limit, int offset) { // public LibraryItemPage getLibraryPage(int limit, int offset) {
return generateStubLibraryItemPage(limit, null); // return generateStubLibraryItemPage(limit, null);
} // }
//
/** // /**
* ライブラリページを取得する // * ライブラリページを取得する
* @param pageId ページID // * @param pageId ページID
* @param limit 取得するアイテム数 // * @param limit 取得するアイテム数
* @return ページオブジェクト // * @return ページオブジェクト
*/ // */
@Override // @Override
public LibraryItemPage getLibraryPage(String pageId, int limit) { // public LibraryItemPage getLibraryPage(String pageId, int limit) {
return generateStubLibraryItemPage(limit, pageId); // return generateStubLibraryItemPage(limit, pageId);
} // }
//
/** // /**
* ライブラリページを取得する // * ライブラリページを取得する
* @param pageId ページID // * @param pageId ページID
* @param limit 取得するアイテム数 // * @param limit 取得するアイテム数
* @param offset 取得するアイテムのオフセット // * @param offset 取得するアイテムのオフセット
* @return ページオブジェクト // * @return ページオブジェクト
*/ // */
@Override // @Override
public LibraryItemPage getLibraryPage(String pageId, int limit, int offset) { // public LibraryItemPage getLibraryPage(String pageId, int limit, int offset) {
return generateStubLibraryItemPage(limit, pageId); // return generateStubLibraryItemPage(limit, pageId);
} // }
//
/** // /**
* ドキュメント詳細を取得する // * ドキュメント詳細を取得する
* @param id ドキュメントID // * @param id ドキュメントID
* @return ドキュメント詳細オブジェクト // * @return ドキュメント詳細オブジェクト
*/ // */
@Override // @Override
public DocumentDetail getDocumentDetailById(String id) throws IllegalArgumentException { // public DocumentDetail getDocumentDetailById(String id) throws IllegalArgumentException {
return generateStubDocumentDetail(id); // return generateStubDocumentDetail(id);
} // }
} //}

View File

@ -30,9 +30,10 @@ public class LacertaSearchStubImpl implements LacertaSearch {
*/ */
@Override @Override
public ArrayList<ListItem> autoSearch(String query, int limit) { public ArrayList<ListItem> autoSearch(String query, int limit) {
logger.debug("SearchStub", "autoSearch"); // logger.debug("SearchStub", "autoSearch");
logger.debug("SearchStub", "query: " + query); // logger.debug("SearchStub", "query: " + query);
return library.getLibraryPage(limit).getListItems(); // return library.getLibraryPage(limit).getListItems();
return null;
} }
/** /**
@ -44,8 +45,9 @@ public class LacertaSearchStubImpl implements LacertaSearch {
*/ */
@Override @Override
public ArrayList<ListItem> autoSearch(String query, int limit, int offset) { public ArrayList<ListItem> autoSearch(String query, int limit, int offset) {
logger.debug("SearchStub", "autoSearch"); // logger.debug("SearchStub", "autoSearch");
logger.debug("SearchStub", "query: " + query); // logger.debug("SearchStub", "query: " + query);
return library.getLibraryPage(limit, offset).getListItems(); // return library.getLibraryPage(limit, offset).getListItems();
return null;
} }
} }

View File

@ -7,7 +7,7 @@ import dagger.hilt.android.components.FragmentComponent;
import dagger.hilt.migration.DisableInstallInCheck; import dagger.hilt.migration.DisableInstallInCheck;
import one.nem.lacerta.data.LacertaLibrary; import one.nem.lacerta.data.LacertaLibrary;
import one.nem.lacerta.data.impl.LacertaLibraryStubImpl; import one.nem.lacerta.data.impl.LacertaLibraryImpl;
import one.nem.lacerta.utils.LacertaLogger; import one.nem.lacerta.utils.LacertaLogger;
@Module @Module
@ -16,6 +16,6 @@ import one.nem.lacerta.utils.LacertaLogger;
abstract public class LacertaLibraryModule { abstract public class LacertaLibraryModule {
@Binds @Binds
public abstract LacertaLibrary bindLacertaLibrary(LacertaLibraryStubImpl impl); public abstract LacertaLibrary bindLacertaLibrary(LacertaLibraryImpl impl);
} }

View File

@ -57,7 +57,8 @@ public class DebugMenuLibraryItemListPageFragment extends Fragment {
// Inflate the layout for this fragment // Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_debug_menu_library_item_list_page, container, false); View view = inflater.inflate(R.layout.fragment_debug_menu_library_item_list_page, container, false);
ArrayList<ListItem> listItems = lacertaLibrary.getRecentDocument(10); // ArrayList<ListItem> listItems = lacertaLibrary.getRecentDocument(10);
ArrayList<ListItem> listItems = new ArrayList<>();
for (ListItem listItem : listItems) { for (ListItem listItem : listItems) {
System.out.println(listItem.getTitle()); System.out.println(listItem.getTitle());
} }

View File

@ -23,6 +23,7 @@ import com.google.android.material.appbar.CollapsingToolbarLayout;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.CompletableFuture;
import javax.inject.Inject; import javax.inject.Inject;
@ -67,18 +68,6 @@ public class HomeTopFragment extends Fragment {
// Inflate the layout for this fragment // Inflate the layout for this fragment
View view = 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; return view;
} }
@ -86,6 +75,20 @@ public class HomeTopFragment extends Fragment {
public void onViewCreated(View view, Bundle savedInstanceState) { public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
RecyclerView recyclerView = view.findViewById(R.id.home_item_recycler_view);
ListItemAdapter listItemAdapter = new ListItemAdapter();
recyclerView.setAdapter(listItemAdapter);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
lacertaLibrary.getRecentDocument(10).thenAccept(listItems -> {
listItemAdapter.setListItems(listItems);
getActivity().runOnUiThread(() -> {
listItemAdapter.notifyItemRangeInserted(0, listItems.size());
});
});
CollapsingToolbarLayout collapsingToolbarLayout = view.findViewById(R.id.collapsing_toolbar); CollapsingToolbarLayout collapsingToolbarLayout = view.findViewById(R.id.collapsing_toolbar);
Toolbar toolbar = view.findViewById(R.id.toolbar); Toolbar toolbar = view.findViewById(R.id.toolbar);

View File

@ -21,6 +21,14 @@ public class ListItemAdapter extends RecyclerView.Adapter<ListItemAdapter.ListIt
this.listItems = listItems; this.listItems = listItems;
} }
public ListItemAdapter() {
this.listItems = new ArrayList<>();
}
public void setListItems(ArrayList<ListItem> listItems) {
this.listItems = listItems;
}
@NonNull @NonNull
@Override @Override
public ListItemAdapter.ListItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { public ListItemAdapter.ListItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {