Skip to content

Commit a81d93b

Browse files
committed
Add first draft of "Show diff"
1 parent eb0cbec commit a81d93b

File tree

7 files changed

+107
-0
lines changed

7 files changed

+107
-0
lines changed

app/src/main/java/com/orgzly/android/git/GitFileSynchronizer.java

+29
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import com.orgzly.android.util.MiscUtils;
1212

1313
import org.eclipse.jgit.api.Git;
14+
import org.eclipse.jgit.diff.DiffEntry;
15+
import org.eclipse.jgit.diff.DiffFormatter;
1416
import org.eclipse.jgit.api.MergeResult;
1517
import org.eclipse.jgit.api.ResetCommand;
1618
import org.eclipse.jgit.api.Status;
@@ -22,12 +24,16 @@
2224
import org.eclipse.jgit.revwalk.RevCommit;
2325
import org.eclipse.jgit.revwalk.RevWalk;
2426
import org.eclipse.jgit.treewalk.TreeWalk;
27+
import org.eclipse.jgit.lib.ObjectReader;
28+
import org.eclipse.jgit.lib.Repository;
29+
import org.eclipse.jgit.treewalk.CanonicalTreeParser;
2530

2631
import java.io.File;
2732
import java.io.IOException;
2833
import java.text.SimpleDateFormat;
2934
import java.util.Calendar;
3035
import java.util.TimeZone;
36+
import java.util.List;
3137

3238
public class GitFileSynchronizer {
3339
private static String TAG = GitFileSynchronizer.class.getSimpleName();
@@ -330,4 +336,27 @@ public boolean fileMatchesInRevisions(String pathString, RevCommit start, RevCom
330336
throws IOException {
331337
return getFileRevision(pathString, start).equals(getFileRevision(pathString, end));
332338
}
339+
340+
public void getDiff(ObjectId fileRevision, RevCommit revision) {
341+
try {
342+
ObjectId oldHead = currentHead().toObjectId(); // aka local
343+
ObjectId head = revision.toObjectId(); // aka remote
344+
Repository repository = git.getRepository();
345+
try (ObjectReader reader = repository.newObjectReader()) {
346+
CanonicalTreeParser oldTreeIter = new CanonicalTreeParser();
347+
oldTreeIter.reset(reader, oldHead);
348+
CanonicalTreeParser newTreeIter = new CanonicalTreeParser();
349+
newTreeIter.reset(reader, head);
350+
351+
List<DiffEntry> diffs = git.diff().setNewTree(newTreeIter).setOldTree(oldTreeIter).call();
352+
353+
for (DiffEntry entry : diffs) {
354+
Log.e(TAG, "Entry: " + entry);
355+
}
356+
}
357+
358+
} catch (Exception e) {
359+
e.printStackTrace();
360+
}
361+
}
333362
}

app/src/main/java/com/orgzly/android/repos/TwoWaySyncRepo.kt

+1
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ import java.io.IOException
77
interface TwoWaySyncRepo {
88
@Throws(IOException::class)
99
fun syncBook(uri: Uri, current: VersionedRook, fromDB: File): TwoWaySyncResult
10+
// fun getDiff(uri: Uri, current: VersionedRook, fromDB: File): TwoWaySyncResult
1011
}

app/src/main/java/com/orgzly/android/ui/books/BooksFragment.kt

+34
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import com.orgzly.android.usecase.BookDelete
3636
import com.orgzly.android.util.LogUtils
3737
import com.orgzly.android.util.MiscUtils
3838
import com.orgzly.databinding.DialogBookDeleteBinding
39+
import com.orgzly.databinding.DialogBookDiffBinding
3940
import com.orgzly.databinding.DialogBookRenameBinding
4041
import com.orgzly.databinding.FragmentBooksBinding
4142
import javax.inject.Inject
@@ -197,6 +198,10 @@ class BooksFragment : Fragment(), Fab, DrawerItem, OnViewHolderClickListener<Boo
197198
viewModel.deleteBookRequest(bookId)
198199
}
199200

201+
R.id.books_context_menu_show_diff -> {
202+
viewModel.diffBookRequest(bookId)
203+
}
204+
200205
else -> {
201206
}
202207
}
@@ -282,6 +287,28 @@ class BooksFragment : Fragment(), Fab, DrawerItem, OnViewHolderClickListener<Boo
282287
dialog = builder.show()
283288
}
284289

290+
private fun showBookDiffDialog(book: BookView) {
291+
val dialogBinding = DialogBookDiffBinding.inflate(LayoutInflater.from(context))
292+
293+
dialogBinding.book.setText("Local book")
294+
dialogBinding.rook.setText("Remote book")
295+
296+
297+
val dialogBuilder = AlertDialog.Builder(context)
298+
.setTitle(getString(R.string.rename_book, MiscUtils.quotedString(book.book.name)))
299+
.setView(dialogBinding.root)
300+
301+
val d = dialogBuilder.create()
302+
303+
d.setOnDismissListener { ActivityUtils.closeSoftKeyboard(activity) }
304+
305+
d.show()
306+
307+
d.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = false
308+
309+
dialog = d
310+
}
311+
285312
private fun renameBookDialog(book: BookView) {
286313
val dialogBinding = DialogBookRenameBinding.inflate(LayoutInflater.from(context))
287314

@@ -383,6 +410,13 @@ class BooksFragment : Fragment(), Fab, DrawerItem, OnViewHolderClickListener<Boo
383410
}
384411
})
385412

413+
viewModel.bookDiffRequestEvent.observeSingle(viewLifecycleOwner, Observer { bookView ->
414+
if (bookView != null) {
415+
showBookDiffDialog(bookView)
416+
}
417+
})
418+
419+
386420
viewModel.bookExportRequestEvent.observeSingle(viewLifecycleOwner, Observer { (book, format) ->
387421
listener?.onBookExportRequest(book, format)
388422
})

app/src/main/java/com/orgzly/android/ui/books/BooksViewModel.kt

+8
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ class BooksViewModel(private val dataRepository: DataRepository) : CommonViewMod
2626

2727
val bookRenameRequestEvent: SingleLiveEvent<BookView> = SingleLiveEvent()
2828

29+
val bookDiffRequestEvent: SingleLiveEvent<BookView> = SingleLiveEvent()
30+
2931
val bookExportRequestEvent: SingleLiveEvent<Pair<Book, BookFormat>> = SingleLiveEvent()
3032

3133
enum class ViewState {
@@ -77,6 +79,12 @@ class BooksViewModel(private val dataRepository: DataRepository) : CommonViewMod
7779
}
7880
}
7981

82+
fun diffBookRequest(bookId: Long) {
83+
App.EXECUTORS.diskIO().execute {
84+
bookDiffRequestEvent.postValue(dataRepository.getBookView(bookId))
85+
}
86+
}
87+
8088
fun renameBook(book: BookView, name: String) {
8189
App.EXECUTORS.diskIO().execute {
8290
catchAndPostError {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
3+
<layout
4+
xmlns:android="http://schemas.android.com/apk/res/android"
5+
xmlns:app="http://schemas.android.com/apk/res-auto"
6+
xmlns:tools="http://schemas.android.com/tools">
7+
8+
<LinearLayout
9+
android:layout_width="match_parent"
10+
android:layout_height="match_parent"
11+
android:padding="@dimen/screen_edge"
12+
android:orientation="horizontal">
13+
14+
<TextView
15+
android:id="@+id/book"
16+
android:layout_width="wrap_content"
17+
android:layout_height="100dp"
18+
app:autoSizeTextType="uniform" />
19+
20+
<TextView
21+
android:id="@+id/rook"
22+
android:layout_width="wrap_content"
23+
android:layout_height="100dp"
24+
app:autoSizeTextType="uniform" />
25+
26+
</LinearLayout>
27+
28+
</layout>

app/src/main/res/menu/books_context.xml

+6
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,10 @@
4040
app:showAsAction="never">
4141
</item>
4242

43+
<item
44+
android:id="@+id/books_context_menu_show_diff"
45+
android:title="@string/show_diff"
46+
app:showAsAction="never">
47+
</item>
48+
4349
</menu>

app/src/main/res/values/strings.xml

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
<string name="edit">Edit</string>
2323
<string name="edit_note">Edit note</string>
2424
<string name="delete">Delete</string>
25+
<string name="show_diff">Show Diff</string>
2526
<string name="delete_with_quoted_argument">Delete “%s”</string>
2627
<string name="name">Name</string>
2728
<string name="value">Value</string>

0 commit comments

Comments
 (0)