iroiro, コミット履歴を表示できるように

This commit is contained in:
r-ca 2024-01-23 02:04:25 +09:00
parent af8935cd7f
commit b820f42007
No known key found for this signature in database
GPG Key ID: 6A72911AC73464A9
10 changed files with 160 additions and 38 deletions

View File

@ -3,7 +3,9 @@ package one.nem.lacerta.component.viewer;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.os.Bundle; import android.os.Bundle;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.navigation.Navigation;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
@ -67,6 +69,10 @@ public class ComponentViewerTopFragment extends Fragment {
// Inflate the layout for this fragment // Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_component_viewer_top, container, false); View view = inflater.inflate(R.layout.fragment_component_viewer_top, container, false);
// Toolbar
Toolbar toolbar = view.findViewById(R.id.toolbar);
toolbarSetup(toolbar, true, "Revision List");
RecyclerView recyclerView = view.findViewById(R.id.body_recycler_view); RecyclerView recyclerView = view.findViewById(R.id.body_recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
ViewerBodyAdapter viewerBodyAdapter = new ViewerBodyAdapter(fileName -> { ViewerBodyAdapter viewerBodyAdapter = new ViewerBodyAdapter(fileName -> {
@ -85,4 +91,39 @@ public class ComponentViewerTopFragment extends Fragment {
return view; return view;
} }
/**
* ToolbarをInitする
*
* @param toolbar Toolbar
* @param showBackButton 戻るボタンを表示するか
* @param title タイトル
*/
private void toolbarSetup(Toolbar toolbar, boolean showBackButton, String title) {
getActivity().runOnUiThread(() -> {
if (showBackButton) {
toolbar.setNavigationIcon(one.nem.lacerta.shared.ui.R.drawable.arrow_back_24px);
toolbar.setNavigationOnClickListener(v -> {
//this.libraryItemPage = lacertaLibrary.getLibraryPage(this.libraryItemPage.getParentId(), 10).join();
// Back
Navigation.findNavController(requireView()).popBackStack();
});
} else {
toolbar.setNavigationIcon(null);
}
toolbar.setTitle(title);
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))
.commit();
return true;
} else {
return false;
}
});
});
}
} }

View File

@ -1,14 +1,18 @@
package one.nem.lacerta.component.viewer; package one.nem.lacerta.component.viewer;
import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList; import java.util.ArrayList;
import one.nem.lacerta.model.VcsRevModel; import one.nem.lacerta.model.VcsRevModel;
import one.nem.lacerta.utils.FeatureSwitch;
public class RevAdapter extends RecyclerView.Adapter<RevAdapter.RevViewHolder>{ public class RevAdapter extends RecyclerView.Adapter<RevAdapter.RevViewHolder>{
@ -29,23 +33,48 @@ public class RevAdapter extends RecyclerView.Adapter<RevAdapter.RevViewHolder>{
@NonNull @NonNull
@Override @Override
public RevAdapter.RevViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { public RevAdapter.RevViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return null; View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.viewer_rev_list_item, parent, false);
return new RevAdapter.RevViewHolder(view);
} }
@Override @Override
public void onBindViewHolder(@NonNull RevAdapter.RevViewHolder holder, int position) { public void onBindViewHolder(@NonNull RevAdapter.RevViewHolder holder, int position) {
VcsRevModel revModel = revModels.get(position);
holder.title.setText(revModel.getCommitMessage());
if (FeatureSwitch.Vcs.disableBranchDisplay) {
// holder.detail.setText(DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(revModel.getCreatedAt().toInstant()));
holder.detail.setText("DateTimePlaceholder");
} else {
// holder.detail.setText(DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(revModel.getCreatedAt().toInstant()) + " " + revModel.getBranchName());
holder.detail.setText("DateTimePlaceholder" + " " + revModel.getBranchName());
}
holder.revId.setText("RevID: " + revModel.getId());
} }
@Override @Override
public int getItemCount() { public int getItemCount() {
if (revModels == null) {
return 0; return 0;
} else {
return revModels.size();
}
} }
class RevViewHolder extends RecyclerView.ViewHolder { class RevViewHolder extends RecyclerView.ViewHolder {
TextView title;
TextView detail;
TextView revId;
public RevViewHolder(@NonNull View itemView) { public RevViewHolder(@NonNull View itemView) {
super(itemView); super(itemView);
title = itemView.findViewById(R.id.rev_item_title);
detail = itemView.findViewById(R.id.rev_item_detail);
revId = itemView.findViewById(R.id.rev_item_id);
} }
} }
} }

View File

@ -58,8 +58,9 @@ public class ViewerMainActivity extends AppCompatActivity {
finish(); finish();
} }
// Navigation
getSupportFragmentManager().beginTransaction() getSupportFragmentManager().beginTransaction()
.replace(R.id.nav_host_fragment, ComponentViewerTopFragment.newInstance(documentId)) .replace(R.id.nav_host_fragment, ComponentViewerTopFragment.newInstance(documentId))
.commitNow(); .commit();
} }
} }

View File

@ -3,45 +3,46 @@ package one.nem.lacerta.component.viewer;
import android.os.Bundle; import android.os.Bundle;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import javax.inject.Inject;
import dagger.hilt.android.AndroidEntryPoint;
import one.nem.lacerta.utils.LacertaLogger;
import one.nem.lacerta.vcs.LacertaVcs;
import one.nem.lacerta.vcs.factory.LacertaVcsFactory;
/** /**
* A simple {@link Fragment} subclass. * A simple {@link Fragment} subclass.
* Use the {@link ViewerVcsRevListFragment#newInstance} factory method to * Use the {@link ViewerVcsRevListFragment#newInstance} factory method to
* create an instance of this fragment. * create an instance of this fragment.
*/ */
@AndroidEntryPoint
public class ViewerVcsRevListFragment extends Fragment { public class ViewerVcsRevListFragment extends Fragment {
// TODO: Rename parameter arguments, choose names that match @Inject
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER LacertaVcsFactory lacertaVcsFactory;
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters @Inject
private String mParam1; LacertaLogger logger;
private String mParam2;
LacertaVcs lacertaVcs;
private String documentId;
public ViewerVcsRevListFragment() { public ViewerVcsRevListFragment() {
// Required empty public constructor // Required empty public constructor
} }
/** public static ViewerVcsRevListFragment newInstance(String documentId) {
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment ViewerVcsRevListFragment.
*/
// TODO: Rename and change types and number of parameters
public static ViewerVcsRevListFragment newInstance(String param1, String param2) {
ViewerVcsRevListFragment fragment = new ViewerVcsRevListFragment(); ViewerVcsRevListFragment fragment = new ViewerVcsRevListFragment();
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1); args.putString("documentId", documentId);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args); fragment.setArguments(args);
return fragment; return fragment;
} }
@ -49,10 +50,6 @@ public class ViewerVcsRevListFragment extends Fragment {
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
} }
@Override @Override
@ -61,4 +58,38 @@ public class ViewerVcsRevListFragment extends Fragment {
// Inflate the layout for this fragment // Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_viewer_vcs_rev_list, container, false); return inflater.inflate(R.layout.fragment_viewer_vcs_rev_list, container, false);
} }
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
// Init arg
if (getArguments() != null) {
this.documentId = getArguments().getString("documentId");
logger.debug("ViewerVcsRevListFragment", "documentId: " + documentId);
}
// Init vcs
lacertaVcs = lacertaVcsFactory.create(documentId);
// Init view
RecyclerView recyclerView = view.findViewById(R.id.rev_list);
// Init adapter
RevAdapter revAdapter = new RevAdapter();
// Set adapter
recyclerView.setAdapter(revAdapter);
// Set layout manager
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
lacertaVcs.getRevisionHistory().thenAccept(revModels -> {
logger.debug("ViewerVcsRevListFragment", "revModels.size(): " + revModels.size());
getActivity().runOnUiThread(() -> {
revAdapter.setRevModels(revModels);
revAdapter.notifyDataSetChanged();
});
});
}
} }

View File

@ -5,10 +5,8 @@
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".ViewerVcsRevListFragment"> tools:context=".ViewerVcsRevListFragment">
<!-- TODO: Update blank fragment layout --> <androidx.recyclerview.widget.RecyclerView
<TextView android:id="@+id/rev_list"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent" />
android:text="@string/hello_blank_fragment" />
</FrameLayout> </FrameLayout>

View File

@ -15,7 +15,7 @@
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<TextView <TextView
android:id="@+id/item_title" android:id="@+id/rev_item_title"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textSize="16sp" android:textSize="16sp"
@ -26,7 +26,7 @@
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<TextView <TextView
android:id="@+id/item_detail" android:id="@+id/rev_item_detail"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textSize="14sp" android:textSize="14sp"
@ -34,10 +34,10 @@
android:textColor="@color/colorOnSurfaceSecondary" android:textColor="@color/colorOnSurfaceSecondary"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/item_title" /> app:layout_constraintTop_toBottomOf="@+id/rev_item_title" />
<TextView <TextView
android:id="@+id/item_rev_id" android:id="@+id/rev_item_id"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textSize="12sp" android:textSize="12sp"
@ -45,7 +45,7 @@
android:textColor="@color/colorOnSurfaceSecondary" android:textColor="@color/colorOnSurfaceSecondary"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/item_detail" /> app:layout_constraintTop_toBottomOf="@+id/rev_item_detail" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_open_vcs_rev_list"
android:title="Open VCS Rev List" />
</menu>

View File

@ -1,11 +1,21 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android" <navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/component_viewer_navigation" android:id="@+id/component_viewer_navigation"
app:startDestination="@id/componentViewerTopFragment"> app:startDestination="@id/componentViewerTopFragment">
<fragment <fragment
android:id="@+id/componentViewerTopFragment" android:id="@+id/componentViewerTopFragment"
android:name="one.nem.lacerta.component.viewer.ComponentViewerTopFragment" android:name="one.nem.lacerta.component.viewer.ComponentViewerTopFragment"
android:label="ComponentViewerTopFragment" /> android:label="ComponentViewerTopFragment" >
<action
android:id="@+id/action_componentViewerTopFragment_to_viewerVcsRevListFragment"
app:destination="@id/viewerVcsRevListFragment" />
</fragment>
<fragment
android:id="@+id/viewerVcsRevListFragment"
android:name="one.nem.lacerta.component.viewer.ViewerVcsRevListFragment"
android:label="fragment_viewer_vcs_rev_list"
tools:layout="@layout/fragment_viewer_vcs_rev_list" />
</navigation> </navigation>

View File

@ -11,6 +11,10 @@ public class FeatureSwitch {
public static boolean enableDebugMenu = false; public static boolean enableDebugMenu = false;
} }
public static class Vcs {
public static boolean disableBranchDisplay = true;
}
public static class Setting { public static class Setting {
public static boolean showDisplayMenu = false; public static boolean showDisplayMenu = false;
public static boolean showDataMenu = false; public static boolean showDataMenu = false;

View File

@ -133,6 +133,7 @@ public class LacertaVcsImpl implements LacertaVcs {
List<VcsRevEntity> vcsRevEntities = database.vcsRevDao().findByDocumentId(this.documentId); List<VcsRevEntity> vcsRevEntities = database.vcsRevDao().findByDocumentId(this.documentId);
vcsRevEntities.forEach(vcsRevEntity -> { vcsRevEntities.forEach(vcsRevEntity -> {
VcsRevModel vcsRevModel = new VcsRevModel(); VcsRevModel vcsRevModel = new VcsRevModel();
vcsRevModel.setId(vcsRevEntity.id);
vcsRevModel.setDocumentId(vcsRevEntity.documentId); vcsRevModel.setDocumentId(vcsRevEntity.documentId);
vcsRevModel.setBranchName(vcsRevEntity.branchName); vcsRevModel.setBranchName(vcsRevEntity.branchName);
vcsRevModel.setCommitMessage(vcsRevEntity.commitMessage); vcsRevModel.setCommitMessage(vcsRevEntity.commitMessage);