Skip to content

Commit

Permalink
Tool for conflict resolution
Browse files Browse the repository at this point in the history
  • Loading branch information
wizmer committed Jun 20, 2016
1 parent d244b12 commit afe49f5
Show file tree
Hide file tree
Showing 16 changed files with 584 additions and 275 deletions.
39 changes: 20 additions & 19 deletions MobileOrg/src/main/AndroidManifest.xml
Expand Up @@ -29,7 +29,7 @@
android:resource="@xml/widget_mobileorg" />
</receiver>

<service android:name=".Gui.Widget.MobileOrgWidget$MobileOrgWidgetService"></service>
<service android:name=".Gui.Widget.MobileOrgWidget$MobileOrgWidgetService" />
<service android:name=".Services.SyncService">
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
Expand Down Expand Up @@ -61,6 +61,7 @@
android:theme="@style/ActionModeAppTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
Expand All @@ -70,10 +71,10 @@
<activity
android:name=".Settings.SettingsActivity"
android:label="MobileOrg Settings"
android:theme="@style/AppTheme.NoActionBar"></activity>
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name=".OrgNodeDetailActivity"
android:theme="@style/ActionModeAppTheme"></activity>
android:theme="@style/ActionModeAppTheme" />
<activity
android:name=".Gui.Wizard.WizardActivity"
android:label="MobileOrg Wizard"
Expand All @@ -87,30 +88,30 @@
<activity
android:name=".Gui.CertificateConflictActivity"
android:label="MobileOrg Certificate Conflict"
android:theme="@style/AppTheme.NoActionBar"></activity>
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name=".Gui.FileDecryptionActivity"
android:theme="@style/AppTheme.NoActionBar"></activity>
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name=".Settings.Synchronizers.WebDAVSettingsActivity"
android:label="WebDAV Settings"></activity>
android:label="WebDAV Settings" />
<activity
android:name=".Settings.Synchronizers.SDCardSettingsActivity"
android:label="SDCard Settings"></activity>
android:label="SDCard Settings" />
<activity
android:name=".Settings.Synchronizers.ScpSettingsActivity"
android:label="Scp Settings"></activity>
android:label="Scp Settings" />
<activity
android:name=".Settings.Synchronizers.UbuntuOneSettingsActivity"
android:label="Ubuntu One Settings"></activity>
android:label="Ubuntu One Settings" />
<activity
android:name=".EditNodeActivity"
android:theme="@style/ActionModeAppTheme"></activity>
android:theme="@style/ActionModeAppTheme" />

<service android:name=".Services.TimeclockService"></service>
<service android:name=".Services.TimeclockService" />

<activity android:name=".Gui.Agenda.AgendaSettings"></activity>
<activity android:name=".Gui.Agenda.AgendaEntrySetting"></activity>
<activity android:name=".Gui.Agenda.AgendaSettings" />
<activity android:name=".Gui.Agenda.AgendaEntrySetting" />
<activity
android:name="com.dropbox.client2.android.AuthActivity"
android:configChanges="orientation|keyboard"
Expand All @@ -127,15 +128,15 @@
</intent-filter>
</activity>

<service android:name=".Services.CalendarSyncService"></service>
<service android:name=".Services.CalendarSyncService" />

<activity android:name=".Gui.Agenda.AgendasActivity"></activity>
<activity android:name=".Gui.Agenda.AgendaActivity"></activity>
<activity android:name=".Gui.Agenda.AgendasActivity" />
<activity android:name=".Gui.Agenda.AgendaActivity" />
<activity
android:name="layout.com.aaa.ScrollingActivity"
android:label="@string/title_activity_scrolling"
android:theme="@style/AppTheme.NoActionBar"></activity>
android:theme="@style/AppTheme.NoActionBar" />
<activity android:name=".Gui.Outline.ConflictResolverActivity"></activity>
</application>

</manifest>

</manifest>
@@ -0,0 +1,96 @@
package com.matburt.mobileorg2.Gui.Outline;

import android.content.Intent;
import android.support.v4.app.NavUtils;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.EditText;

import com.matburt.mobileorg2.OrgData.OrgContract;
import com.matburt.mobileorg2.OrgData.OrgFile;
import com.matburt.mobileorg2.OrgData.OrgProviderUtils;
import com.matburt.mobileorg2.OrgNodeListActivity;
import com.matburt.mobileorg2.R;
import com.matburt.mobileorg2.Synchronizers.JGitWrapper;
import com.matburt.mobileorg2.Synchronizers.SynchronizerManager;
import com.matburt.mobileorg2.util.OrgFileNotFoundException;
import com.matburt.mobileorg2.util.OrgUtils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class ConflictResolverActivity extends AppCompatActivity {

EditText editText;
String filename;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_conflict_resolver);
Toolbar toolbar = (Toolbar) findViewById(R.id.detail_toolbar);
setSupportActionBar(toolbar);

// Show the Up button in the action bar.
ActionBar actionBar = getSupportActionBar();



if (savedInstanceState == null) {
// Create the detail fragment and add it to the activity
// using a fragment transaction.
Bundle arguments = new Bundle();
Long nodeId = getIntent().getLongExtra(OrgContract.NODE_ID, -1);

editText = (EditText)findViewById(R.id.conflict_resolver_text);
try {
OrgFile file = new OrgFile(nodeId, getContentResolver());
if (actionBar != null) {
actionBar.setTitle(file.name);
}

String dir = SynchronizerManager.getInstance(null,null,null).getSyncher().getAbsoluteFilesDir(this);
this.filename = dir+"/"+file.filename;
editText.setText(OrgUtils.readAll(this.filename));

} catch (OrgFileNotFoundException e) {
e.printStackTrace();
}
}
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.edit_node_menu, menu);

return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.edit_menu_cancel:
NavUtils.navigateUpTo(this, new Intent(this, OrgNodeListActivity.class));
return true;
case R.id.edit_menu_ok:
if(this.filename!=null && !this.filename.equals("")){
OrgUtils.writeToFile(this.filename, editText.getText().toString());
new JGitWrapper.MergeTask(this).execute();
}
NavUtils.navigateUpTo(this, new Intent(this, OrgNodeListActivity.class));
return true;
}
return false;
}


}
Expand Up @@ -35,13 +35,13 @@

public class OutlineAdapter extends RecyclerView.Adapter<OutlineAdapter.OutlineItem> {
private final AppCompatActivity activity;
public List<OrgNode> items = new ArrayList<>();
public List<OrgFile> items = new ArrayList<>();
ActionMode actionMode;
private ContentResolver resolver;
private boolean mTwoPanes = false;
private SparseBooleanArray selectedItems;
// Number of added items. Here it is two: Agenda and Todos.
private int numExtraItems = 2;
final private int numExtraItems = 2;
private ActionMode.Callback mDeleteMode = new ActionMode.Callback() {
@Override
public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
Expand Down Expand Up @@ -110,11 +110,10 @@ public OutlineAdapter(AppCompatActivity activity) {
public void refresh() {
clear();

for (OrgNode node : OrgProviderUtils.getOrgNodeChildren(-1, resolver)){
add(node);
for (OrgFile file : OrgProviderUtils.getFiles(resolver)){
add(file);
}


notifyDataSetChanged();
}

Expand All @@ -130,7 +129,11 @@ public void refresh() {
@Override
public void onBindViewHolder(final OutlineItem holder, final int position) {
int positionInItems = position - numExtraItems;

OrgFile file = null;
try{
file = items.get(positionInItems);
} catch(ArrayIndexOutOfBoundsException ignored){}
final boolean conflict = (file != null && file.getState() == OrgFile.State.kConflict);
String title;
if(position == 0) {
title = activity.getResources().getString(R.string.menu_todos);
Expand All @@ -142,6 +145,15 @@ public void onBindViewHolder(final OutlineItem holder, final int position) {

holder.titleView.setText(title);

TextView comment = (TextView)holder.mView.findViewById(R.id.comment);

if (conflict) {
comment.setText(R.string.conflict);
comment.setVisibility(View.VISIBLE);
} else {
comment.setVisibility(View.GONE);
}

holder.mView.setActivated(selectedItems.get(positionInItems, false));

final long itemId = getItemId(position);
Expand All @@ -165,7 +177,15 @@ public void onClick(View v) {
// TODO: add agenda fragment
} else {
Context context = v.getContext();
Intent intent = new Intent(context, OrgNodeDetailActivity.class);
Intent intent;

// Special activity for conflicted file
if(conflict){
intent = new Intent(context, ConflictResolverActivity.class);
} else {
intent = new Intent(context, OrgNodeDetailActivity.class);
}


if(position == 0){
intent.putExtra(OrgContract.NODE_ID, OrgContract.TODO_ID);
Expand Down Expand Up @@ -208,14 +228,14 @@ public void clear() {
this.items.clear();
}

public void add(OrgNode node) {
this.items.add(node);
public void add(OrgFile file) {
this.items.add(file);
}

@Override
public long getItemId(int position) {
if(position < numExtraItems) return -1;
OrgNode node = items.get(position - numExtraItems);
OrgFile node = items.get(position - numExtraItems);
return node.id;
}

Expand All @@ -237,7 +257,6 @@ public void toggleSelection(int pos) {
if(countAfter > 0 && actionMode != null){
actionMode.invalidate();
}

}

public void clearSelections() {
Expand All @@ -262,16 +281,8 @@ private void deleteSelectedFiles(){
List<Integer> selectedItems = getSelectedItems();
for(Integer num: selectedItems){
num -= numExtraItems;
OrgNode node = items.get(num);
try {
OrgFile file = new OrgFile(node.fileId, resolver);
file.removeFile(activity);
} catch (OrgFileNotFoundException e) {
e.printStackTrace();
}

node.deleteNode(activity);
Log.v("selection","deleting : "+items.get(num).name);
OrgFile file = items.get(num);
file.removeFile(activity);
}
refresh();
actionMode.finish();
Expand Down
Expand Up @@ -32,7 +32,7 @@ interface FilesColumns {
String ID = "_id";
String NAME = "name";
String FILENAME = "filename";
String CHECKSUM = "checksum";
String COMMENT = "comment";
String NODE_ID = "node_id";
}

Expand Down Expand Up @@ -128,7 +128,7 @@ public static class Files implements FilesColumns {
BASE_CONTENT_URI.buildUpon().appendPath(PATH_FILES).build();

public static final String[] DEFAULT_COLUMNS = { ID, NAME, FILENAME,
CHECKSUM, NODE_ID };
COMMENT, NODE_ID };
public static final String DEFAULT_SORT = NAME + " ASC";

public static String getId(Uri uri) {
Expand Down

0 comments on commit afe49f5

Please sign in to comment.