mirror of
https://github.com/lacerta-doc/Lacerta.git
synced 2026-11-07 19:47:36 +00:00
Compare commits
48
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
383a7020ce | ||
|
|
f71aabed2a | ||
|
|
8256d01682 | ||
|
|
4d7f38a0f7 | ||
|
|
13e8ee7d87 | ||
|
|
41776b360b | ||
|
|
8a656f673d | ||
|
|
e5ba889780 | ||
|
|
c717f4c596 | ||
|
|
be64f5a186 | ||
|
|
1654700ee0 | ||
|
|
7a106b1ed3 | ||
|
|
97b1806407 | ||
|
|
77830ca96b | ||
|
|
bda2b82cea | ||
|
|
c05c80f3e7 | ||
|
|
9ba3c224c4 | ||
|
|
603a758ab6 | ||
|
|
c7f5502535 | ||
|
|
7ef75bb375 | ||
|
|
78d4345313 | ||
|
|
542c04b908 | ||
|
|
cf257a44ec | ||
|
|
f812e6c38e | ||
|
|
87c913811b | ||
|
|
3cfd54faf0 | ||
|
|
ffeb701b40 | ||
|
|
c48e5becac | ||
|
|
7291ab243e | ||
|
|
a34109441f | ||
|
|
75045c3fe3 | ||
|
|
733371ecbc | ||
|
|
5096e8de23 | ||
|
|
6679f8389c | ||
|
|
8df63b0ac6 | ||
|
|
4df56774c3 | ||
|
|
834ee42353 | ||
|
|
8a2b4ed12d | ||
|
|
58e74dbb16 | ||
|
|
9d750b5244 | ||
|
|
e96d213c33 | ||
|
|
c2f62a5a84 | ||
|
|
dbef7b45d1 | ||
|
|
3c079ffc23 | ||
|
|
f1667788aa | ||
|
|
cad97ef7a3 | ||
|
|
5e5e98f0b6 | ||
|
|
94def7bf1c |
No files matched your search
@@ -8,9 +8,11 @@ import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentTransaction;
|
||||
import androidx.navigation.NavController;
|
||||
import androidx.navigation.NavOptions;
|
||||
import androidx.navigation.fragment.NavHostFragment;
|
||||
import androidx.navigation.ui.NavigationUI;
|
||||
|
||||
import android.app.ActivityOptions;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.graphics.Color;
|
||||
@@ -60,6 +62,19 @@ public class MainActivity extends AppCompatActivity implements FragmentNavigatio
|
||||
assert navHostFragment != null;
|
||||
NavController navController = navHostFragment.getNavController();
|
||||
NavigationUI.setupWithNavController(bottomNavigationView, navController);
|
||||
|
||||
bottomNavigationView.setOnItemSelectedListener(item -> {
|
||||
NavOptions navOptions = new NavOptions.Builder()
|
||||
.setLaunchSingleTop(true)
|
||||
.setEnterAnim(androidx.navigation.ui.R.anim.nav_default_enter_anim)
|
||||
.setExitAnim(androidx.navigation.ui.R.anim.nav_default_exit_anim)
|
||||
.setPopEnterAnim(androidx.navigation.ui.R.anim.nav_default_pop_enter_anim)
|
||||
.setPopExitAnim(androidx.navigation.ui.R.anim.nav_default_pop_exit_anim)
|
||||
.build();
|
||||
|
||||
navController.navigate(item.getItemId(), null, navOptions);
|
||||
return true;
|
||||
});
|
||||
}
|
||||
catch (Exception e) {
|
||||
Log.e("Init", "Failed to init navigation");
|
||||
@@ -83,7 +98,8 @@ public class MainActivity extends AppCompatActivity implements FragmentNavigatio
|
||||
findViewById(R.id.scanFab).setOnClickListener(v -> {
|
||||
Toast.makeText(this, "Scan", Toast.LENGTH_SHORT).show();
|
||||
Intent intent = new Intent(this.getApplicationContext(), ScannerManagerActivity.class);
|
||||
startActivity(intent);
|
||||
// startActivity(intent);
|
||||
startActivity(intent, ActivityOptions.makeCustomAnimation(this, one.nem.lacerta.shared.ui.R.anim.nav_up_enter_anim, one.nem.lacerta.shared.ui.R.anim.nav_up_exit_anim).toBundle());
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
@@ -42,4 +42,6 @@ dependencies {
|
||||
implementation project(':utils')
|
||||
implementation project(':model')
|
||||
implementation project(':data')
|
||||
|
||||
implementation project(':vcs')
|
||||
}
|
||||
+2
-2
@@ -79,8 +79,8 @@ public class LacertaSelectDirDialog extends DialogFragment {
|
||||
LayoutInflater inflater = requireActivity().getLayoutInflater();
|
||||
View view = inflater.inflate(R.layout.lacerta_dialog_select_dir, null);
|
||||
|
||||
// 高さを画面の60%にする
|
||||
int height = (int) (getResources().getDisplayMetrics().heightPixels * 0.6);
|
||||
// 高さを画面の40%にする
|
||||
int height = (int) (getResources().getDisplayMetrics().heightPixels * 0.4);
|
||||
view.setMinimumHeight(height);
|
||||
|
||||
this.recyclerView = view.findViewById(R.id.select_dir_recycler_view);
|
||||
|
||||
+112
@@ -0,0 +1,112 @@
|
||||
package one.nem.lacerta.component.common;
|
||||
|
||||
import android.app.Dialog;
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import dagger.hilt.android.AndroidEntryPoint;
|
||||
import one.nem.lacerta.data.LacertaLibrary;
|
||||
import one.nem.lacerta.utils.LacertaLogger;
|
||||
import one.nem.lacerta.vcs.LacertaVcs;
|
||||
import one.nem.lacerta.vcs.factory.LacertaVcsFactory;
|
||||
|
||||
|
||||
@AndroidEntryPoint
|
||||
public class LacertaSelectRevDialog extends DialogFragment {
|
||||
|
||||
@Inject
|
||||
LacertaVcsFactory lacertaVcsFactory;
|
||||
|
||||
@Inject
|
||||
LacertaLogger logger;
|
||||
|
||||
String title;
|
||||
String documentId;
|
||||
String message;
|
||||
String negativeButtonText;
|
||||
|
||||
LacertaSelectRevDialogListener listener;
|
||||
|
||||
public LacertaSelectRevDialog setTitle(String title) {
|
||||
this.title = title;
|
||||
return this;
|
||||
}
|
||||
|
||||
public LacertaSelectRevDialog setDocumentId(String documentId) {
|
||||
this.documentId = documentId;
|
||||
return this;
|
||||
}
|
||||
|
||||
public LacertaSelectRevDialog setMessage(String message) {
|
||||
this.message = message;
|
||||
return this;
|
||||
}
|
||||
|
||||
public LacertaSelectRevDialog setNegativeButtonText(String negativeButtonText) {
|
||||
this.negativeButtonText = negativeButtonText;
|
||||
return this;
|
||||
}
|
||||
|
||||
public LacertaSelectRevDialog setListener(LacertaSelectRevDialogListener listener) {
|
||||
this.listener = listener;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||
super.onCreateDialog(savedInstanceState);
|
||||
|
||||
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(getActivity());
|
||||
LayoutInflater inflater = requireActivity().getLayoutInflater();
|
||||
View view = inflater.inflate(R.layout.lacerta_dialog_select_rev, null);
|
||||
|
||||
int height = (int) (getResources().getDisplayMetrics().heightPixels * 0.4);
|
||||
view.setMinimumHeight(height);
|
||||
|
||||
RecyclerView recyclerView = view.findViewById(R.id.select_rev_recycler_view);
|
||||
|
||||
SelectRevDialogItemAdapter adapter = new SelectRevDialogItemAdapter(revId -> {
|
||||
if (listener != null) {
|
||||
listener.onItemSelected(revId);
|
||||
dismiss();
|
||||
}
|
||||
});
|
||||
recyclerView.setAdapter(adapter);
|
||||
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
|
||||
builder.setView(view);
|
||||
|
||||
if (this.documentId == null) {
|
||||
logger.error("SelectRevDialog", "documentId is null");
|
||||
logger.e_code("0296fb0c-07a3-4971-a280-bd1a61461bb7");
|
||||
Toast.makeText(getContext(), "Sorry, something went wrong", Toast.LENGTH_SHORT).show();
|
||||
dismiss();
|
||||
}
|
||||
LacertaVcs lacertaVcs = lacertaVcsFactory.create(this.documentId);
|
||||
lacertaVcs.getRevisionHistory().thenAccept(revList -> {
|
||||
adapter.setRevList(revList);
|
||||
adapter.notifyDataSetChanged(); // TODO-rca:時間に応じてアニメーションをつける
|
||||
});
|
||||
|
||||
|
||||
builder.setTitle(title == null ? "Select Rev" : title);
|
||||
builder.setMessage(message == null ? "Select Rev" : message);
|
||||
builder.setNegativeButton(negativeButtonText == null ? "Cancel" : negativeButtonText, (dialog, which) -> {
|
||||
if (listener != null) {
|
||||
listener.onDialogCanceled();
|
||||
dismiss();
|
||||
}
|
||||
});
|
||||
|
||||
return builder.create();
|
||||
}
|
||||
}
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
package one.nem.lacerta.component.common;
|
||||
|
||||
public interface LacertaSelectRevDialogInternalListener {
|
||||
|
||||
void onItemSelected(String revId);
|
||||
}
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
package one.nem.lacerta.component.common;
|
||||
|
||||
public interface LacertaSelectRevDialogListener {
|
||||
|
||||
void onItemSelected(String revId);
|
||||
|
||||
void onDialogCanceled();
|
||||
}
|
||||
+66
@@ -0,0 +1,66 @@
|
||||
package one.nem.lacerta.component.common;
|
||||
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import one.nem.lacerta.model.VcsRevModel;
|
||||
|
||||
public class SelectRevDialogItemAdapter extends RecyclerView.Adapter<SelectRevDialogItemAdapter.SelectRevDialogItemViewHolder>{
|
||||
|
||||
ArrayList<VcsRevModel> revList;
|
||||
|
||||
LacertaSelectRevDialogInternalListener listener;
|
||||
|
||||
public SelectRevDialogItemAdapter(LacertaSelectRevDialogInternalListener listener) {
|
||||
this.listener = listener;
|
||||
}
|
||||
|
||||
public void setRevList(ArrayList<VcsRevModel> revList) {
|
||||
this.revList = revList;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public SelectRevDialogItemAdapter.SelectRevDialogItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.common_rev_list_item, parent, false);
|
||||
return new SelectRevDialogItemAdapter.SelectRevDialogItemViewHolder(view);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull SelectRevDialogItemAdapter.SelectRevDialogItemViewHolder holder, int position) {
|
||||
VcsRevModel rev = revList.get(position);
|
||||
holder.title.setText(rev.getCommitMessage());
|
||||
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
|
||||
holder.description.setText(simpleDateFormat.format(rev.getCreatedAt()));
|
||||
holder.revId.setText("RevID: " + rev.getId());
|
||||
|
||||
holder.itemView.setOnClickListener(v -> listener.onItemSelected(rev.getId()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return this.revList == null ? 0 : this.revList.size();
|
||||
}
|
||||
|
||||
public class SelectRevDialogItemViewHolder extends RecyclerView.ViewHolder {
|
||||
|
||||
TextView title;
|
||||
TextView description;
|
||||
TextView revId;
|
||||
|
||||
public SelectRevDialogItemViewHolder(@NonNull View itemView) {
|
||||
super(itemView);
|
||||
title = itemView.findViewById(R.id.rev_item_title);
|
||||
description = itemView.findViewById(R.id.rev_item_detail);
|
||||
revId = itemView.findViewById(R.id.rev_item_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
+115
@@ -0,0 +1,115 @@
|
||||
package one.nem.lacerta.component.common.picker;
|
||||
|
||||
import android.app.Dialog;
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import dagger.hilt.android.AndroidEntryPoint;
|
||||
import one.nem.lacerta.component.common.R;
|
||||
import one.nem.lacerta.component.common.picker.base.LacertaFilePickerAdapterBase;
|
||||
import one.nem.lacerta.component.common.picker.base.LacertaFilePickerDialogBase;
|
||||
import one.nem.lacerta.data.LacertaLibrary;
|
||||
import one.nem.lacerta.model.ListItemType;
|
||||
import one.nem.lacerta.model.PublicPath;
|
||||
|
||||
@AndroidEntryPoint
|
||||
public class LacertaDirPickerDialog extends LacertaFilePickerDialogBase {
|
||||
|
||||
@Inject
|
||||
LacertaLibrary lacertaLibrary;
|
||||
|
||||
// Listener
|
||||
public interface LacertaDirPickerDialogListener {
|
||||
void onDirSelected(String name, String dirId);
|
||||
}
|
||||
|
||||
// Variables
|
||||
LacertaDirPickerDialogListener listener;
|
||||
|
||||
// Setter
|
||||
public LacertaDirPickerDialog setListener(LacertaDirPickerDialogListener listener) {
|
||||
this.listener = listener;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||
super.onCreateDialog(savedInstanceState);
|
||||
|
||||
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(getActivity());
|
||||
|
||||
View view = LayoutInflater.from(getActivity()).inflate(R.layout.lacerta_dialog_select_dir, null);
|
||||
|
||||
// 高さを画面の40%にする
|
||||
int height = (int) (getResources().getDisplayMetrics().heightPixels * 0.4);
|
||||
view.setMinimumHeight(height);
|
||||
|
||||
RecyclerView recyclerView = view.findViewById(R.id.select_dir_recycler_view);
|
||||
TextView currentDirTextView = view.findViewById(R.id.current_dir_text_view);
|
||||
|
||||
LacertaFilePickerAdapterBase adapter = new LacertaFilePickerAdapterBase();
|
||||
adapter.setListener(new LacertaFilePickerAdapterBase.LacertaFilePickerAdapterListener() {
|
||||
@Override
|
||||
public void onItemSelected(String dirId) {
|
||||
updateList(adapter, dirId);
|
||||
updatePublicPath(currentDirTextView, dirId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackSelected(String dirId) {
|
||||
updateList(adapter, dirId);
|
||||
updatePublicPath(currentDirTextView, dirId);
|
||||
}
|
||||
});
|
||||
|
||||
recyclerView.setAdapter(adapter);
|
||||
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
|
||||
|
||||
this.updateList(adapter, null); // ルートディレクトリのリストを表示
|
||||
|
||||
// Init dialog
|
||||
builder.setTitle(this.title == null ? "フォルダを選択" : this.title);
|
||||
builder.setMessage(this.message == null ? "フォルダを選択してください" : this.message);
|
||||
builder.setView(view);
|
||||
builder.setPositiveButton(this.positiveButtonText == null ? "OK" : this.positiveButtonText, (dialog, which) -> {
|
||||
if (listener != null) {
|
||||
listener.onDirSelected(
|
||||
adapter.getCurrentPageTitle(),
|
||||
adapter.getCurrentId());
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(this.negativeButtonText == null ? "キャンセル" : this.negativeButtonText, (dialog, which) -> {
|
||||
if (listener != null) {
|
||||
dismiss();
|
||||
}
|
||||
});
|
||||
|
||||
return builder.create();
|
||||
}
|
||||
|
||||
private void updatePublicPath(TextView currentDirTextView, String folderId) {
|
||||
lacertaLibrary.getPublicPath(folderId, ListItemType.ITEM_TYPE_FOLDER).thenAccept(publicPath -> {
|
||||
this.updatePathTextView(currentDirTextView, publicPath, ListItemType.ITEM_TYPE_FOLDER);
|
||||
});
|
||||
}
|
||||
|
||||
private void updateList(LacertaFilePickerAdapterBase adapter, String folderId) {
|
||||
lacertaLibrary.getFolderList(folderId).thenAccept(libraryItemPage -> {
|
||||
int currentCount = adapter.getItemCount();
|
||||
String currentId = adapter.getCurrentId();
|
||||
// adapter.setListItems(libraryItemPage);
|
||||
getActivity().runOnUiThread(() -> {
|
||||
this.updateListView(adapter, libraryItemPage, currentCount, currentId);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
+110
@@ -0,0 +1,110 @@
|
||||
package one.nem.lacerta.component.common.picker.base;
|
||||
|
||||
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 one.nem.lacerta.model.LibraryItemPage;
|
||||
import one.nem.lacerta.model.ListItem;
|
||||
import one.nem.lacerta.model.ListItemType;
|
||||
|
||||
public class LacertaFilePickerAdapterBase extends RecyclerView.Adapter<LacertaFilePickerAdapterBase.LacertaFilePickerViewHolder> {
|
||||
|
||||
// Listener
|
||||
public interface LacertaFilePickerAdapterListener {
|
||||
void onItemSelected(String dirId);
|
||||
void onBackSelected(String dirId);
|
||||
}
|
||||
|
||||
private LibraryItemPage libraryItemPage;
|
||||
|
||||
private LacertaFilePickerAdapterListener listener;
|
||||
|
||||
// Empty constructor
|
||||
public LacertaFilePickerAdapterBase() {
|
||||
}
|
||||
|
||||
public void setListItems(LibraryItemPage libraryItemPage) {
|
||||
this.libraryItemPage = libraryItemPage;
|
||||
if (this.libraryItemPage.getPageId() != null) { // ルートディレクトリの場合は戻るボタンを表示しない
|
||||
this.libraryItemPage.getListItems().add(0, new ListItem("戻る", " ", ListItemType.ITEM_TYPE_ACTION_BACK, null));
|
||||
}
|
||||
}
|
||||
|
||||
public void setListener(LacertaFilePickerAdapterListener listener) {
|
||||
this.listener = listener;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public LacertaFilePickerViewHolder onCreateViewHolder(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 LacertaFilePickerViewHolder(view);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(LacertaFilePickerViewHolder holder, int position) {
|
||||
ListItem listItem = libraryItemPage.getListItems().get(position);
|
||||
holder.title.setText(listItem.getTitle());
|
||||
holder.description.setText(listItem.getDescription());
|
||||
holder.icon.setImageResource(listItem.getItemType().getIconId());
|
||||
if(listItem.getItemType() == ListItemType.ITEM_TYPE_ACTION_BACK) {
|
||||
holder.itemView.setOnClickListener(v -> listener.onBackSelected(this.libraryItemPage.getParentId()));
|
||||
} else {
|
||||
holder.itemView.setOnClickListener(v -> listener.onItemSelected(listItem.getItemId()));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return this.libraryItemPage == null ? 0 : this.libraryItemPage.getListItems().size();
|
||||
}
|
||||
|
||||
public String getCurrentId() {
|
||||
if (this.libraryItemPage == null) {
|
||||
return null;
|
||||
} else {
|
||||
if (this.libraryItemPage.getPageId() == null) {
|
||||
return null;
|
||||
} else {
|
||||
return this.libraryItemPage.getPageId();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public String getCurrentPageTitle() {
|
||||
if (this.libraryItemPage == null) {
|
||||
return null;
|
||||
} else {
|
||||
if (this.libraryItemPage.getPageId() == null) {
|
||||
return null;
|
||||
} else {
|
||||
return this.libraryItemPage.getPageTitle();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class LacertaFilePickerViewHolder extends RecyclerView.ViewHolder {
|
||||
|
||||
TextView title;
|
||||
TextView description;
|
||||
|
||||
ImageView icon;
|
||||
|
||||
|
||||
public LacertaFilePickerViewHolder(@NonNull View itemView) {
|
||||
super(itemView);
|
||||
|
||||
title = itemView.findViewById(one.nem.lacerta.shared.ui.R.id.item_title);
|
||||
description = itemView.findViewById(one.nem.lacerta.shared.ui.R.id.item_description);
|
||||
icon = itemView.findViewById(one.nem.lacerta.shared.ui.R.id.item_icon);
|
||||
description.setVisibility(View.GONE); // 暫定
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
+88
@@ -0,0 +1,88 @@
|
||||
package one.nem.lacerta.component.common.picker.base;
|
||||
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import one.nem.lacerta.model.LibraryItemPage;
|
||||
import one.nem.lacerta.model.ListItemType;
|
||||
import one.nem.lacerta.model.PublicPath;
|
||||
import one.nem.lacerta.utils.LacertaLogger;
|
||||
|
||||
public class LacertaFilePickerDialogBase extends DialogFragment {
|
||||
@Inject
|
||||
LacertaLogger logger;
|
||||
|
||||
// Variables
|
||||
protected String title;
|
||||
protected String message;
|
||||
protected String positiveButtonText;
|
||||
protected String negativeButtonText;
|
||||
|
||||
// Setter
|
||||
public LacertaFilePickerDialogBase setTitle(String title) {
|
||||
this.title = title;
|
||||
return this;
|
||||
}
|
||||
|
||||
public LacertaFilePickerDialogBase setMessage(String message) {
|
||||
this.message = message;
|
||||
return this;
|
||||
}
|
||||
|
||||
public LacertaFilePickerDialogBase setPositiveButtonText(String positiveButtonText) {
|
||||
this.positiveButtonText = positiveButtonText;
|
||||
return this;
|
||||
}
|
||||
|
||||
public LacertaFilePickerDialogBase setNegativeButtonText(String negativeButtonText) {
|
||||
this.negativeButtonText = negativeButtonText;
|
||||
return this;
|
||||
}
|
||||
|
||||
// Methods
|
||||
|
||||
protected void updatePathTextView(TextView currentDirTextView, PublicPath publicPath, ListItemType listItemType) {
|
||||
if (publicPath == null) {
|
||||
currentDirTextView.setText("/");
|
||||
} else {
|
||||
if (listItemType == ListItemType.ITEM_TYPE_FOLDER) {
|
||||
currentDirTextView.setText("/" + publicPath.getStringPath()); // TODO-rca: PublicPath側の実装を治すべき
|
||||
} else {
|
||||
currentDirTextView.setText("/" + publicPath.parent().getStringPath()); // TODO-rca: PublicPath側の実装を治すべき
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void updateListView(LacertaFilePickerAdapterBase adapter, LibraryItemPage libraryItemPage, int currentCount, String currentDirId) {
|
||||
if (currentCount == 0) {
|
||||
// 初回表示
|
||||
adapter.setListItems(libraryItemPage);
|
||||
adapter.notifyItemRangeInserted(0, libraryItemPage.getListItems().size());
|
||||
} else if (currentDirId == null) {
|
||||
// Rootが関わる推移 (Rootからの推移)
|
||||
adapter.setListItems(libraryItemPage);
|
||||
adapter.notifyItemRangeRemoved(0, currentCount);
|
||||
adapter.notifyItemRangeInserted(0, libraryItemPage.getListItems().size());
|
||||
} else if (libraryItemPage.getPageId() == null) {
|
||||
// Rootが関わる推移 (Rootへの推移)
|
||||
adapter.setListItems(libraryItemPage);
|
||||
adapter.notifyItemRangeRemoved(0, currentCount);
|
||||
adapter.notifyItemRangeInserted(0, libraryItemPage.getListItems().size());
|
||||
} else if (libraryItemPage.getPageId() != null) {
|
||||
// Rootが関わらない推移
|
||||
adapter.setListItems(libraryItemPage);
|
||||
adapter.notifyItemRangeRemoved(1, currentCount);
|
||||
adapter.notifyItemRangeInserted(1, libraryItemPage.getListItems().size());
|
||||
} else {
|
||||
// その他の遷移(安全側に倒すため全アイテム更新)
|
||||
logger.warn("FilePickerDialogBase", "Unknown transition.");
|
||||
logger.warn("FilePickerDialogBase", "currentDirId: " + currentDirId + ", libraryItemPage.getPageId(): " + libraryItemPage.getPageId());
|
||||
adapter.setListItems(libraryItemPage);
|
||||
adapter.notifyItemRangeRemoved(0, currentCount);
|
||||
adapter.notifyItemRangeInserted(0, libraryItemPage.getListItems().size());
|
||||
}
|
||||
}
|
||||
}
|
||||
Whitespace-only changes.
Whitespace-only changes.
@@ -0,0 +1,55 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingHorizontal="24dp"
|
||||
android:paddingVertical="16dp">
|
||||
|
||||
<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_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/rev_item_title"
|
||||
android:layout_width="match_parent"
|
||||
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/rev_item_detail"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="14sp"
|
||||
android:text="2023/01/01 00:00:00 - hogehoge"
|
||||
android:textColor="@color/colorOnSurfaceSecondary"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/rev_item_title" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/rev_item_id"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="12sp"
|
||||
android:text="dd76a029-51f1-40f7-b316-a0c74bbfebb1(Example)"
|
||||
android:textColor="@color/colorOnSurfaceSecondary"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/rev_item_detail" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
|
||||
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/select_rev_recycler_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
</FrameLayout>
|
||||
@@ -58,4 +58,7 @@ dependencies {
|
||||
|
||||
implementation project(':component:common')
|
||||
|
||||
// TODO-rca: バージョンカタログに切り出す
|
||||
implementation "com.hendraanggrian.material:collapsingtoolbarlayout-subtitle:1.5.0"
|
||||
|
||||
}
|
||||
+57
-31
@@ -21,7 +21,12 @@ import javax.inject.Inject;
|
||||
import dagger.hilt.android.AndroidEntryPoint;
|
||||
import one.nem.lacerta.component.common.LacertaSelectDirDialog;
|
||||
import one.nem.lacerta.component.common.LacertaSelectDirDialogListener;
|
||||
import one.nem.lacerta.component.common.LacertaSelectRevDialog;
|
||||
import one.nem.lacerta.component.common.LacertaSelectRevDialogListener;
|
||||
import one.nem.lacerta.component.common.picker.LacertaDirPickerDialog;
|
||||
import one.nem.lacerta.data.Document;
|
||||
import one.nem.lacerta.data.LacertaLibrary;
|
||||
import one.nem.lacerta.model.ListItemType;
|
||||
import one.nem.lacerta.model.document.page.Page;
|
||||
import one.nem.lacerta.utils.FeatureSwitch;
|
||||
import one.nem.lacerta.utils.LacertaLogger;
|
||||
@@ -39,6 +44,9 @@ public class ViewerListFragment extends Fragment {
|
||||
@Inject
|
||||
Document document;
|
||||
|
||||
@Inject
|
||||
LacertaLibrary lacertaLibrary;
|
||||
|
||||
@Inject
|
||||
LacertaLogger logger;
|
||||
|
||||
@@ -92,7 +100,7 @@ public class ViewerListFragment extends Fragment {
|
||||
|
||||
// Toolbar
|
||||
Toolbar toolbar = view.findViewById(R.id.toolbar);
|
||||
toolbarSetup(toolbar, true, this.documentName == null ? "Document" : this.documentName);
|
||||
toolbarSetup(toolbar, true, this.documentName == null ? "Document" : this.documentName, null);
|
||||
|
||||
RecyclerView recyclerView = view.findViewById(R.id.body_recycler_view);
|
||||
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
|
||||
@@ -112,6 +120,8 @@ public class ViewerListFragment extends Fragment {
|
||||
viewerBodyAdapter.notifyItemRangeChanged(0, pages.size());
|
||||
if (FeatureSwitch.Viewer.showProgressBarWhenLoading) view.findViewById(R.id.loading_progress_bar).setVisibility(View.GONE);
|
||||
});
|
||||
}).thenCompose(aVoid -> lacertaLibrary.getPublicPath(documentId, ListItemType.ITEM_TYPE_DOCUMENT)).thenAccept(publicPath -> {
|
||||
updateToolbarSubtitle(toolbar, "/" + publicPath.parent().getStringPath());
|
||||
});
|
||||
} else {
|
||||
logger.debug(TAG, "revisionId: " + revisionId);
|
||||
@@ -127,23 +137,35 @@ public class ViewerListFragment extends Fragment {
|
||||
if (FeatureSwitch.Viewer.showProgressBarWhenLoading) view.findViewById(R.id.loading_progress_bar).setVisibility(View.GONE);
|
||||
});
|
||||
});
|
||||
}).thenCompose(aVoid -> lacertaLibrary.getPublicPath(documentId, ListItemType.ITEM_TYPE_DOCUMENT)).thenAccept(publicPath -> {
|
||||
updateToolbarSubtitle(toolbar, "/" + publicPath.parent().getStringPath()); // TODO-rca: リビジョンの場合はリビジョン名を表示する?
|
||||
});
|
||||
}
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
/**
|
||||
* Toolbarのサブタイトルを更新
|
||||
* @param subtitle サブタイトル
|
||||
*/
|
||||
private void updateToolbarSubtitle(Toolbar toolbar, String subtitle) {
|
||||
getActivity().runOnUiThread(() -> {
|
||||
toolbar.setSubtitle(subtitle);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* ToolbarをInitする
|
||||
*
|
||||
* @param toolbar Toolbar
|
||||
* @param showBackButton 戻るボタンを表示するか
|
||||
* @param showCloseButton 戻るボタンを表示するか
|
||||
* @param title タイトル
|
||||
*/
|
||||
private void toolbarSetup(Toolbar toolbar, boolean showBackButton, String title) {
|
||||
private void toolbarSetup(Toolbar toolbar, boolean showCloseButton, String title, String Subtitle) {
|
||||
getActivity().runOnUiThread(() -> {
|
||||
if (showBackButton) {
|
||||
toolbar.setNavigationIcon(one.nem.lacerta.shared.ui.R.drawable.arrow_back_24px);
|
||||
if (showCloseButton) {
|
||||
toolbar.setNavigationIcon(one.nem.lacerta.shared.ui.R.drawable.close_24px);
|
||||
toolbar.setNavigationOnClickListener(v -> {
|
||||
// Stop Activity
|
||||
getActivity().finish();
|
||||
@@ -152,13 +174,26 @@ public class ViewerListFragment extends Fragment {
|
||||
toolbar.setNavigationIcon(null);
|
||||
}
|
||||
toolbar.setTitle(title);
|
||||
if (Subtitle != null) toolbar.setSubtitle(Subtitle);
|
||||
toolbar.inflateMenu(R.menu.viewer_menu);
|
||||
toolbar.setOnMenuItemClickListener(item -> {
|
||||
if (item.getItemId() == R.id.action_open_vcs_rev_list) {
|
||||
// Open vcs rev list
|
||||
getParentFragmentManager().beginTransaction()
|
||||
.replace(R.id.nav_host_fragment, ViewerVcsRevListFragment.newInstance(documentId, documentName))
|
||||
.commit();
|
||||
LacertaSelectRevDialog lacertaSelectRevDialog = new LacertaSelectRevDialog();
|
||||
lacertaSelectRevDialog.setDocumentId(this.documentId).setTitle("リビジョンの選択").setMessage("リビジョンを選択してください。").setNegativeButtonText("キャンセル");
|
||||
lacertaSelectRevDialog.setListener(new LacertaSelectRevDialogListener() {
|
||||
@Override
|
||||
public void onItemSelected(String revId) {
|
||||
getParentFragmentManager().beginTransaction()
|
||||
.replace(R.id.nav_host_fragment, ViewerListFragment.newInstance(documentId, documentName, revisionId))
|
||||
.commit();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDialogCanceled() {
|
||||
logger.debug(TAG, "Canceled");
|
||||
}
|
||||
});
|
||||
lacertaSelectRevDialog.show(getParentFragmentManager(), "select_rev_dialog");
|
||||
return true;
|
||||
} else if (item.getItemId() == R.id.action_rename) {
|
||||
|
||||
@@ -205,30 +240,21 @@ public class ViewerListFragment extends Fragment {
|
||||
builder.show();
|
||||
return true;
|
||||
} else if (item.getItemId() == R.id.action_move) {
|
||||
// Toast.makeText(getContext(), "Work in progress", Toast.LENGTH_SHORT).show();
|
||||
LacertaSelectDirDialog lacertaSelectDirDialog = new LacertaSelectDirDialog();
|
||||
lacertaSelectDirDialog.setListener(new LacertaSelectDirDialogListener() {
|
||||
@Override
|
||||
public void onDirSelected(String name, String itemId) {
|
||||
logger.debug(TAG, "Selected dir: " + name + ", " + itemId);
|
||||
document.moveDocument(documentId, itemId).thenAccept(aVoid -> {
|
||||
getActivity().runOnUiThread(() -> {
|
||||
// Stop Activity
|
||||
getActivity().finish(); // TODO-rca: ファイル移動後に終了するべきかは検討
|
||||
});
|
||||
LacertaDirPickerDialog lacertaDirPickerDialog = new LacertaDirPickerDialog();
|
||||
lacertaDirPickerDialog.setListener((name, dirId) -> {
|
||||
logger.debug(TAG, "Selected dir: " + name + ", " + dirId);
|
||||
document.moveDocument(documentId, dirId).thenAccept(aVoid -> {
|
||||
getActivity().runOnUiThread(() -> {
|
||||
// Stop Activity
|
||||
getActivity().finish(); // TODO-rca: ファイル移動後に終了するべきかは検討
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCanceled() {
|
||||
logger.debug(TAG, "Canceled");
|
||||
}
|
||||
});
|
||||
});
|
||||
lacertaSelectDirDialog.setTitle("ファイルの移動")
|
||||
.setMessage("ファイルを移動するフォルダを選択してください。")
|
||||
.setPositiveButtonText("移動")
|
||||
.setNegativeButtonText("キャンセル");
|
||||
lacertaSelectDirDialog.show(getParentFragmentManager(), "select_dir_dialog");
|
||||
lacertaDirPickerDialog.setTitle("ファイルの移動")
|
||||
.setMessage("ファイルを移動するフォルダを選択してください。")
|
||||
.setPositiveButtonText("移動")
|
||||
.setNegativeButtonText("キャンセル");
|
||||
lacertaDirPickerDialog.show(getParentFragmentManager(), "select_dir_dialog");
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
|
||||
+5
@@ -5,6 +5,7 @@ import android.os.Bundle;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.activity.EdgeToEdge;
|
||||
import androidx.activity.OnBackPressedCallback;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.core.graphics.Insets;
|
||||
import androidx.core.view.ViewCompat;
|
||||
@@ -41,6 +42,9 @@ public class ViewerMainActivity extends AppCompatActivity {
|
||||
return insets;
|
||||
});
|
||||
|
||||
// // Transition
|
||||
// overridePendingTransition(one.nem.lacerta.shared.ui.R.anim.nav_up_enter_anim, one.nem.lacerta.shared.ui.R.anim.nav_up_exit_anim);
|
||||
|
||||
Intent intent = getIntent();
|
||||
try {
|
||||
documentId = intent.getStringExtra("documentId");
|
||||
@@ -58,4 +62,5 @@ public class ViewerMainActivity extends AppCompatActivity {
|
||||
.replace(R.id.nav_host_fragment, ViewerListFragment.newInstance(documentId, documentName))
|
||||
.commit();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -13,7 +13,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<com.google.android.material.appbar.CollapsingToolbarLayout
|
||||
<com.google.android.material.appbar.SubtitleCollapsingToolbarLayout
|
||||
android:id="@+id/collapsing_toolbar"
|
||||
app:contentScrim="@color/colorSecondaryContainer"
|
||||
android:background="@color/colorSurface"
|
||||
@@ -35,7 +35,7 @@
|
||||
app:layout_collapseMode="pin"
|
||||
app:title="Title" />
|
||||
|
||||
</com.google.android.material.appbar.CollapsingToolbarLayout>
|
||||
</com.google.android.material.appbar.SubtitleCollapsingToolbarLayout>
|
||||
|
||||
|
||||
<ProgressBar
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package one.nem.lacerta.feature.home;
|
||||
|
||||
import android.app.ActivityOptions;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
@@ -89,7 +90,7 @@ public class HomeTopFragment extends Fragment {
|
||||
Log.d("HomeTopFragment", "onDocumentSelect: " + documentId + " " + documentName);
|
||||
intent.putExtra("documentId", documentId);
|
||||
intent.putExtra("documentName", documentName);
|
||||
startActivity(intent);
|
||||
startActivity(intent, ActivityOptions.makeCustomAnimation(getContext(), one.nem.lacerta.shared.ui.R.anim.nav_up_enter_anim, one.nem.lacerta.shared.ui.R.anim.nav_up_exit_anim).toBundle());
|
||||
}
|
||||
});
|
||||
recyclerView.setAdapter(listItemAdapter);
|
||||
@@ -106,20 +107,22 @@ public class HomeTopFragment extends Fragment {
|
||||
}
|
||||
|
||||
private void updateList() {
|
||||
long startTime = System.currentTimeMillis();
|
||||
lacertaLibrary.getRecentDocument(10).thenAccept(listItems -> {
|
||||
long endTime = System.currentTimeMillis();
|
||||
if (listItems == null) {
|
||||
return;
|
||||
}
|
||||
this.listItemAdapter.setListItems(listItems);
|
||||
getActivity().runOnUiThread(() -> {
|
||||
Log.d("HomeTopFragment", "onViewCreated: " + listItems.size());
|
||||
if (FeatureSwitch.RecyclerView.useSimpleNotifyMethod) {
|
||||
if (endTime - startTime > 500) { // 500ms以上かかった場合は表示アニメーションをする
|
||||
getActivity().runOnUiThread(() -> {
|
||||
this.listItemAdapter.notifyItemRangeInserted(0, listItems.size());
|
||||
});
|
||||
} else {
|
||||
getActivity().runOnUiThread(() -> {
|
||||
this.listItemAdapter.notifyDataSetChanged();
|
||||
} else {
|
||||
// IndexOutOfBoundsExceptionを吐くことがあったので いったん
|
||||
this.listItemAdapter.notifyItemRangeInserted(0, listItems.size() - 1);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -55,5 +55,6 @@ dependencies {
|
||||
|
||||
implementation project(':component:viewer')
|
||||
|
||||
|
||||
// TODO-rca: バージョンカタログに切り出す
|
||||
implementation "com.hendraanggrian.material:collapsingtoolbarlayout-subtitle:1.5.0"
|
||||
}
|
||||
+35
-35
@@ -23,6 +23,7 @@ import dagger.hilt.android.AndroidEntryPoint;
|
||||
import one.nem.lacerta.component.viewer.ViewerMainActivity;
|
||||
import one.nem.lacerta.data.LacertaLibrary;
|
||||
import one.nem.lacerta.model.LibraryItemPage;
|
||||
import one.nem.lacerta.model.ListItemType;
|
||||
import one.nem.lacerta.utils.FeatureSwitch;
|
||||
import one.nem.lacerta.utils.LacertaLogger;
|
||||
|
||||
@@ -43,6 +44,7 @@ public class LibraryPageFragment extends Fragment {
|
||||
String folderId;
|
||||
String title;
|
||||
String parentId;
|
||||
Toolbar toolbar;
|
||||
|
||||
|
||||
@Inject
|
||||
@@ -128,12 +130,19 @@ public class LibraryPageFragment extends Fragment {
|
||||
logger.debug("LibraryTopFragment", "getArguments() is null(maybe root)");
|
||||
this.libraryItemPage = new LibraryItemPage();
|
||||
}
|
||||
this.toolbar = view.findViewById(R.id.library_toolbar);
|
||||
|
||||
// Toolbar Setup
|
||||
toolbarSetup(view.findViewById(R.id.library_toolbar), this.folderId != null, this.title != null ? this.title : "ライブラリ");
|
||||
toolbarSetup(this.toolbar, this.folderId != null, this.title != null ? this.title : "ライブラリ");
|
||||
if(this.folderId == null) {
|
||||
updateToolbarSubtitle(this.toolbar, null); //負荷軽減のため+邪魔なので(folderIdがnullの場合は、ルートフォルダを表示しているので)
|
||||
} else {
|
||||
lacertaLibrary.getPublicPath(this.folderId, ListItemType.ITEM_TYPE_FOLDER).thenAccept(publicPath -> {
|
||||
updateToolbarSubtitle(this.toolbar, "/" + publicPath.parent().getStringPath());
|
||||
});
|
||||
}
|
||||
|
||||
// RecyclerView Setup
|
||||
|
||||
RecyclerView recyclerView = view.findViewById(R.id.library_item_recycler_view);
|
||||
this.listItemAdapter = new ListItemAdapter(new DocumentSelectListener() {
|
||||
@Override
|
||||
@@ -168,33 +177,8 @@ public class LibraryPageFragment extends Fragment {
|
||||
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
|
||||
|
||||
// Get library page and update RecyclerView items
|
||||
lacertaLibrary.getLibraryPage(this.folderId, 10).thenAccept(libraryItemPage -> {
|
||||
this.libraryItemPage = libraryItemPage;
|
||||
|
||||
if (this.parentId == null) {
|
||||
this.parentId = libraryItemPage.getParentId();
|
||||
}
|
||||
if (this.title == null) {
|
||||
this.title = libraryItemPage.getPageTitle();
|
||||
// Toolbar init again
|
||||
toolbarSetup(view.findViewById(R.id.library_toolbar), this.folderId != null, this.title != null ? this.title : "ライブラリ");
|
||||
}
|
||||
|
||||
logger.debug("LibraryTopFragment", "Item selected! Total item page: " + this.libraryItemPage.getListItems().size());
|
||||
if (!FeatureSwitch.RecyclerView.useSimpleNotifyMethod) {
|
||||
getActivity().runOnUiThread(() -> { // TODO-rca: 実行条件を考える?
|
||||
listItemAdapter.notifyItemRangeRemoved(0, this.libraryItemPage.getListItems().size() - 1);
|
||||
});
|
||||
}
|
||||
listItemAdapter.setLibraryItemPage(this.libraryItemPage);
|
||||
getActivity().runOnUiThread(() -> {
|
||||
if (FeatureSwitch.RecyclerView.useSimpleNotifyMethod) {
|
||||
listItemAdapter.notifyDataSetChanged();
|
||||
} else {
|
||||
listItemAdapter.notifyItemRangeInserted(0, this.libraryItemPage.getListItems().size() - 1);
|
||||
}
|
||||
});
|
||||
});
|
||||
updateItem(this.folderId);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -216,6 +200,7 @@ public class LibraryPageFragment extends Fragment {
|
||||
lacertaLibrary.createFolder(pageId, input.getText().toString()).thenAccept(folderId -> {
|
||||
// Refresh
|
||||
updateItem(pageId);
|
||||
|
||||
});
|
||||
});
|
||||
builder.setNegativeButton("キャンセル", (dialog, which) -> {
|
||||
@@ -226,19 +211,34 @@ public class LibraryPageFragment extends Fragment {
|
||||
}
|
||||
|
||||
/**
|
||||
* RecyclerViewのアイテムを更新する
|
||||
* RecyclerViewのアイテムとUIを更新する
|
||||
*/
|
||||
private void updateItem(String pageId) {
|
||||
long startTime = System.currentTimeMillis();
|
||||
lacertaLibrary.getLibraryPage(pageId, 10).thenAccept(libraryItemPage -> {
|
||||
long endTime = System.currentTimeMillis();
|
||||
this.libraryItemPage = libraryItemPage;
|
||||
logger.debug("LibraryTopFragment", "Item selected! libraryItemPage.getListItems().size(): " + libraryItemPage.getListItems().size());
|
||||
getActivity().runOnUiThread(() -> {
|
||||
listItemAdapter.notifyItemRangeRemoved(0, libraryItemPage.getListItems().size() - 1);
|
||||
});
|
||||
listItemAdapter.setLibraryItemPage(libraryItemPage);
|
||||
getActivity().runOnUiThread(() -> {
|
||||
listItemAdapter.notifyItemRangeInserted(0, libraryItemPage.getListItems().size() - 1);
|
||||
});
|
||||
if (endTime - startTime > 500) { // 500ms以上かかった場合は表示アニメーションをする
|
||||
getActivity().runOnUiThread(() -> {
|
||||
listItemAdapter.notifyItemRangeInserted(0, this.libraryItemPage.getListItems().size());
|
||||
});
|
||||
} else {
|
||||
getActivity().runOnUiThread(() -> {
|
||||
listItemAdapter.notifyDataSetChanged();
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Toolbarのサブタイトルを更新
|
||||
* @param subtitle サブタイトル
|
||||
*/
|
||||
private void updateToolbarSubtitle(Toolbar toolbar, String subtitle) {
|
||||
getActivity().runOnUiThread(() -> {
|
||||
toolbar.setSubtitle(subtitle);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<com.google.android.material.appbar.CollapsingToolbarLayout
|
||||
<com.google.android.material.appbar.SubtitleCollapsingToolbarLayout
|
||||
android:id="@+id/collapsing_toolbar"
|
||||
app:contentScrim="@color/colorSecondaryContainer"
|
||||
android:background="@color/colorSurface"
|
||||
@@ -35,7 +35,7 @@
|
||||
app:layout_collapseMode="pin"
|
||||
app:title="HOGE" />
|
||||
|
||||
</com.google.android.material.appbar.CollapsingToolbarLayout>
|
||||
</com.google.android.material.appbar.SubtitleCollapsingToolbarLayout>
|
||||
|
||||
</com.google.android.material.appbar.AppBarLayout>
|
||||
|
||||
|
||||
@@ -12,10 +12,10 @@
|
||||
<action
|
||||
android:id="@+id/action_feature_library_top_fragment_self"
|
||||
app:destination="@id/feature_library_top_fragment"
|
||||
app:enterAnim="@anim/nav_default_enter_anim"
|
||||
app:exitAnim="@anim/nav_default_exit_anim"
|
||||
app:popEnterAnim="@anim/nav_default_pop_enter_anim"
|
||||
app:popExitAnim="@anim/nav_default_pop_exit_anim"
|
||||
app:enterAnim="@anim/nav_twitter_enter_anim"
|
||||
app:exitAnim="@anim/nav_twitter_exit_anim"
|
||||
app:popEnterAnim="@anim/nav_twitter_pop_enter_anim"
|
||||
app:popExitAnim="@anim/nav_twitter_pop_exit_anim"
|
||||
app:popUpTo="@id/feature_library_top_fragment"
|
||||
app:popUpToInclusive="false"/>
|
||||
</fragment>
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<translate
|
||||
android:duration="@android:integer/config_mediumAnimTime"
|
||||
android:fromXDelta="105%"
|
||||
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
|
||||
android:toXDelta="0" />
|
||||
|
||||
<scale
|
||||
android:duration="@android:integer/config_mediumAnimTime"
|
||||
android:fromXScale="0.9"
|
||||
android:fromYScale="0.9"
|
||||
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
|
||||
android:pivotX="50%"
|
||||
android:pivotY="50%"
|
||||
android:toXScale="1"
|
||||
android:toYScale="1" />
|
||||
|
||||
<alpha
|
||||
android:duration="@android:integer/config_mediumAnimTime"
|
||||
android:fromAlpha="0.5"
|
||||
android:interpolator="@android:anim/linear_interpolator"
|
||||
android:toAlpha="1" />
|
||||
|
||||
</set>
|
||||
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<translate
|
||||
android:duration="@android:integer/config_mediumAnimTime"
|
||||
android:fromXDelta="0"
|
||||
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
|
||||
android:toXDelta="-105%" />
|
||||
|
||||
<scale
|
||||
android:duration="@android:integer/config_mediumAnimTime"
|
||||
android:fromXScale="1"
|
||||
android:fromYScale="1"
|
||||
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
|
||||
android:pivotX="50%"
|
||||
android:pivotY="50%"
|
||||
android:toXScale="0.9"
|
||||
android:toYScale="0.9" />
|
||||
|
||||
<alpha
|
||||
android:duration="@android:integer/config_mediumAnimTime"
|
||||
android:fromAlpha="1"
|
||||
android:interpolator="@android:anim/linear_interpolator"
|
||||
android:toAlpha="0.5" />
|
||||
</set>
|
||||
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<translate
|
||||
android:duration="@android:integer/config_mediumAnimTime"
|
||||
android:fromXDelta="-105%"
|
||||
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
|
||||
android:toXDelta="0" />
|
||||
|
||||
<scale
|
||||
android:duration="@android:integer/config_mediumAnimTime"
|
||||
android:fromXScale="0.9"
|
||||
android:fromYScale="0.9"
|
||||
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
|
||||
android:pivotX="50%"
|
||||
android:pivotY="50%"
|
||||
android:toXScale="1"
|
||||
android:toYScale="1" />
|
||||
|
||||
<alpha
|
||||
android:duration="@android:integer/config_mediumAnimTime"
|
||||
android:fromAlpha="0.5"
|
||||
android:interpolator="@android:anim/linear_interpolator"
|
||||
android:toAlpha="1" />
|
||||
</set>
|
||||
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<translate
|
||||
android:duration="@android:integer/config_mediumAnimTime"
|
||||
android:fromXDelta="0"
|
||||
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
|
||||
android:toXDelta="105%" />
|
||||
|
||||
<scale
|
||||
android:duration="@android:integer/config_mediumAnimTime"
|
||||
android:fromXScale="1"
|
||||
android:fromYScale="1"
|
||||
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
|
||||
android:pivotX="50%"
|
||||
android:pivotY="50%"
|
||||
android:toXScale="0.9"
|
||||
android:toYScale="0.9" />
|
||||
|
||||
<alpha
|
||||
android:duration="@android:integer/config_mediumAnimTime"
|
||||
android:fromAlpha="1"
|
||||
android:interpolator="@android:anim/linear_interpolator"
|
||||
android:toAlpha="0.5" />
|
||||
|
||||
</set>
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<translate
|
||||
android:duration="@android:integer/config_shortAnimTime"
|
||||
android:fromXDelta="100%p"
|
||||
android:interpolator="@android:anim/decelerate_interpolator"
|
||||
android:toXDelta="0" />
|
||||
</set>
|
||||
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<translate
|
||||
android:duration="@android:integer/config_shortAnimTime"
|
||||
android:fromXDelta="0"
|
||||
android:interpolator="@android:anim/accelerate_interpolator"
|
||||
android:toXDelta="-20%p" />
|
||||
|
||||
<alpha
|
||||
android:duration="@android:integer/config_shortAnimTime"
|
||||
android:fromAlpha="1"
|
||||
android:interpolator="@android:anim/linear_interpolator"
|
||||
android:toAlpha="0.5" />
|
||||
|
||||
</set>
|
||||
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<translate
|
||||
android:duration="@android:integer/config_shortAnimTime"
|
||||
android:fromXDelta="-20%p"
|
||||
android:interpolator="@android:anim/decelerate_interpolator"
|
||||
android:toXDelta="0" />
|
||||
|
||||
<alpha
|
||||
android:duration="@android:integer/config_shortAnimTime"
|
||||
android:fromAlpha="0.5"
|
||||
android:interpolator="@android:anim/linear_interpolator"
|
||||
android:toAlpha="1" />
|
||||
</set>
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<translate
|
||||
android:duration="@android:integer/config_shortAnimTime"
|
||||
android:fromXDelta="0"
|
||||
android:interpolator="@android:anim/accelerate_interpolator"
|
||||
android:toXDelta="100%p" />
|
||||
</set>
|
||||
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<rotate
|
||||
android:duration="@android:integer/config_shortAnimTime"
|
||||
android:fromDegrees="30"
|
||||
android:interpolator="@android:anim/decelerate_interpolator"
|
||||
android:pivotX="50%"
|
||||
android:pivotY="90%"
|
||||
android:toDegrees="0" />
|
||||
<alpha
|
||||
android:duration="@android:integer/config_shortAnimTime"
|
||||
android:fromAlpha="0.0"
|
||||
android:toAlpha="1.0" />
|
||||
</set>
|
||||
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<rotate
|
||||
android:duration="@android:integer/config_shortAnimTime"
|
||||
android:fromDegrees="0"
|
||||
android:interpolator="@android:anim/accelerate_interpolator"
|
||||
android:pivotX="50%"
|
||||
android:pivotY="90%"
|
||||
android:toDegrees="-30" />
|
||||
<alpha
|
||||
android:duration="@android:integer/config_shortAnimTime"
|
||||
android:fromAlpha="1.0"
|
||||
android:toAlpha="0.0" />
|
||||
</set>
|
||||
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<rotate
|
||||
android:duration="@android:integer/config_shortAnimTime"
|
||||
android:fromDegrees="-30"
|
||||
android:interpolator="@android:anim/decelerate_interpolator"
|
||||
android:pivotX="50%"
|
||||
android:pivotY="90%"
|
||||
android:toDegrees="0" />
|
||||
<alpha
|
||||
android:duration="@android:integer/config_shortAnimTime"
|
||||
android:fromAlpha="0.0"
|
||||
android:toAlpha="1.0" />
|
||||
</set>
|
||||
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<rotate
|
||||
android:duration="@android:integer/config_shortAnimTime"
|
||||
android:fromDegrees="0"
|
||||
android:interpolator="@android:anim/accelerate_interpolator"
|
||||
android:pivotX="50%"
|
||||
android:pivotY="90%"
|
||||
android:toDegrees="30" />
|
||||
<alpha
|
||||
android:duration="@android:integer/config_shortAnimTime"
|
||||
android:fromAlpha="1"
|
||||
android:toAlpha="0" />
|
||||
</set>
|
||||
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<translate
|
||||
android:duration="@integer/config_navAnimTime"
|
||||
android:fromXDelta="50%p"
|
||||
android:interpolator="@android:anim/decelerate_interpolator"
|
||||
android:toXDelta="0" />
|
||||
<alpha
|
||||
android:duration="@integer/config_navAnimTime"
|
||||
android:fromAlpha="0.0"
|
||||
android:toAlpha="1.0" />
|
||||
</set>
|
||||
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<translate
|
||||
android:duration="@integer/config_navAnimTime"
|
||||
android:fromXDelta="0%p"
|
||||
android:interpolator="@android:anim/accelerate_interpolator"
|
||||
android:toXDelta="-50%p" />
|
||||
<alpha
|
||||
android:duration="@integer/config_navAnimTime"
|
||||
android:fromAlpha="1.0"
|
||||
android:toAlpha="0.0" />
|
||||
</set>
|
||||
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<translate
|
||||
android:duration="@integer/config_navAnimTime"
|
||||
android:fromXDelta="-50%p"
|
||||
android:interpolator="@android:anim/decelerate_interpolator"
|
||||
android:toXDelta="0%p" />
|
||||
<alpha
|
||||
android:duration="@integer/config_navAnimTime"
|
||||
android:fromAlpha="0.0"
|
||||
android:toAlpha="1.0" />
|
||||
</set>
|
||||
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<translate
|
||||
android:duration="@integer/config_navAnimTime"
|
||||
android:fromXDelta="0"
|
||||
android:interpolator="@android:anim/accelerate_interpolator"
|
||||
android:toXDelta="50%p" />
|
||||
<alpha
|
||||
android:duration="@integer/config_navAnimTime"
|
||||
android:fromAlpha="1.0"
|
||||
android:toAlpha="0.0" />
|
||||
</set>
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<translate
|
||||
android:duration="@android:integer/config_shortAnimTime"
|
||||
android:fromXDelta="100%p"
|
||||
android:interpolator="@android:anim/decelerate_interpolator"
|
||||
android:toXDelta="0" />
|
||||
</set>
|
||||
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<scale
|
||||
android:duration="@android:integer/config_shortAnimTime"
|
||||
android:fromXScale="1"
|
||||
android:fromYScale="1"
|
||||
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
|
||||
android:pivotX="50%"
|
||||
android:pivotY="50%"
|
||||
android:toXScale="0.9"
|
||||
android:toYScale="0.9" />
|
||||
|
||||
<alpha
|
||||
android:duration="@android:integer/config_shortAnimTime"
|
||||
android:fromAlpha="1"
|
||||
android:interpolator="@android:anim/linear_interpolator"
|
||||
android:toAlpha="0.5" />
|
||||
</set>
|
||||
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<scale
|
||||
android:duration="@android:integer/config_shortAnimTime"
|
||||
android:fromXScale="0.9"
|
||||
android:fromYScale="0.9"
|
||||
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
|
||||
android:pivotX="50%"
|
||||
android:pivotY="50%"
|
||||
android:toXScale="1"
|
||||
android:toYScale="1" />
|
||||
|
||||
<alpha
|
||||
android:duration="@android:integer/config_shortAnimTime"
|
||||
android:fromAlpha="0.5"
|
||||
android:interpolator="@android:anim/linear_interpolator"
|
||||
android:toAlpha="1" />
|
||||
</set>
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<translate
|
||||
android:duration="@android:integer/config_shortAnimTime"
|
||||
android:fromXDelta="0"
|
||||
android:interpolator="@android:anim/accelerate_interpolator"
|
||||
android:toXDelta="100%p" />
|
||||
</set>
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<translate
|
||||
android:duration="@android:integer/config_mediumAnimTime"
|
||||
android:fromYDelta="100%p"
|
||||
android:interpolator="@android:anim/decelerate_interpolator"
|
||||
android:toYDelta="0" />
|
||||
</set>
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<alpha
|
||||
android:duration="@android:integer/config_mediumAnimTime"
|
||||
android:fromAlpha="1"
|
||||
android:toAlpha="1" />
|
||||
</set>
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<alpha
|
||||
android:duration="@android:integer/config_mediumAnimTime"
|
||||
android:fromAlpha="1"
|
||||
android:toAlpha="1" />
|
||||
</set>
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<translate
|
||||
android:duration="@android:integer/config_mediumAnimTime"
|
||||
android:fromYDelta="0"
|
||||
android:interpolator="@android:anim/accelerate_interpolator"
|
||||
android:toYDelta="100%p" />
|
||||
</set>
|
||||
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<scale
|
||||
android:duration="@integer/config_navAnimTime"
|
||||
android:fromXScale="0.9"
|
||||
android:fromYScale="0.9"
|
||||
android:interpolator="@android:anim/decelerate_interpolator"
|
||||
android:pivotX="50%"
|
||||
android:pivotY="50%"
|
||||
android:toXScale="1"
|
||||
android:toYScale="1" />
|
||||
<alpha
|
||||
android:duration="@integer/config_navAnimTime"
|
||||
android:fromAlpha="0.0"
|
||||
android:toAlpha="1.0" />
|
||||
</set>
|
||||
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<scale
|
||||
android:duration="@integer/config_navAnimTime"
|
||||
android:fromXScale="1"
|
||||
android:fromYScale="1"
|
||||
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
|
||||
android:pivotX="50%"
|
||||
android:pivotY="50%"
|
||||
android:toXScale="1.05"
|
||||
android:toYScale="1.05" />
|
||||
</set>
|
||||
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<scale
|
||||
android:duration="@integer/config_navAnimTime"
|
||||
android:fromXScale="1.05"
|
||||
android:fromYScale="1.05"
|
||||
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
|
||||
android:pivotX="50%"
|
||||
android:pivotY="50%"
|
||||
android:toXScale="1"
|
||||
android:toYScale="1" />
|
||||
</set>
|
||||
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<scale
|
||||
android:duration="@integer/config_navAnimTime"
|
||||
android:fromXScale="1"
|
||||
android:fromYScale="1"
|
||||
android:interpolator="@android:anim/accelerate_interpolator"
|
||||
android:pivotX="50%"
|
||||
android:pivotY="50%"
|
||||
android:toXScale="0.9"
|
||||
android:toYScale="0.9" />
|
||||
<alpha
|
||||
android:duration="@integer/config_navAnimTime"
|
||||
android:fromAlpha="1.0"
|
||||
android:toAlpha="0.0" />
|
||||
</set>
|
||||
Reference in new issue
Block a user