Merge contacts/calendars collection handling

This also removes the "stats" from the edit collection screen.
pull/5/head
Tom Hacohen 7 years ago
parent 3530821ddd
commit 838cc2a79d

@ -183,10 +183,8 @@
</activity>
<activity android:name=".ui.JournalViewerActivity"/>
<activity android:name=".ui.AccountSettingsActivity"/>
<activity android:name=".ui.CreateAddressBookActivity"
android:label="@string/create_addressbook"/>
<activity android:name=".ui.CreateCalendarActivity"
android:label="@string/create_calendar"/>
<activity android:name=".ui.CreateCollectionActivity"/>
<activity android:name=".ui.EditCollectionActivity"/>
<activity
android:name=".ui.DebugInfoActivity"

@ -61,7 +61,6 @@ import com.etesync.syncadapter.model.ServiceDB.Services;
import com.etesync.syncadapter.resource.LocalCalendar;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
@ -164,45 +163,24 @@ public class AccountActivity extends AppCompatActivity implements Toolbar.OnMenu
@Override
public boolean onMenuItemClick(MenuItem item) {
Intent intent;
switch (item.getItemId()) {
case R.id.create_calendar:
intent = new Intent(this, CreateCalendarActivity.class);
intent.putExtra(CreateCalendarActivity.EXTRA_ACCOUNT, account);
startActivity(intent);
CollectionInfo info = new CollectionInfo();
info.type = CollectionInfo.Type.CALENDAR;
startActivity(CreateCollectionActivity.newIntent(AccountActivity.this, account, info));
break;
}
return false;
}
private AdapterView.OnItemClickListener onContactItemClickListener = new AdapterView.OnItemClickListener() {
private AdapterView.OnItemClickListener onItemClickListener = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
final ListView list = (ListView)parent;
final ArrayAdapter<CollectionInfo> adapter = (ArrayAdapter)list.getAdapter();
final CollectionInfo info = adapter.getItem(position);
Intent intent = new Intent(AccountActivity.this, CreateAddressBookActivity.class);
intent.putExtra(CreateAddressBookActivity.EXTRA_ACCOUNT, account);
intent.putExtra(CreateAddressBookActivity.EXTRA_COLLECTION_INFO, info);
startActivity(intent);
}
};
private AdapterView.OnItemClickListener onCalendarItemClickListener = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
final ListView list = (ListView)parent;
final ArrayAdapter<CollectionInfo> adapter = (ArrayAdapter)list.getAdapter();
final CollectionInfo info = adapter.getItem(position);
Intent intent = new Intent(AccountActivity.this, CreateCalendarActivity.class);
intent.putExtra(CreateCalendarActivity.EXTRA_ACCOUNT, account);
intent.putExtra(CreateCalendarActivity.EXTRA_COLLECTION_INFO, info);
if (adapter.getCount() > 1) {
intent.putExtra(CreateCalendarActivity.EXTRA_ALLOW_DELETE, true);
}
startActivity(intent);
startActivity(EditCollectionActivity.newIntent(AccountActivity.this, account, info, (adapter.getCount() > 1)));
}
};
@ -250,7 +228,7 @@ public class AccountActivity extends AppCompatActivity implements Toolbar.OnMenu
AddressBookAdapter adapter = new AddressBookAdapter(this);
adapter.addAll(info.carddav.collections);
listCardDAV.setAdapter(adapter);
listCardDAV.setOnItemClickListener(onContactItemClickListener);
listCardDAV.setOnItemClickListener(onItemClickListener);
} else
card.setVisibility(View.GONE);
@ -266,7 +244,7 @@ public class AccountActivity extends AppCompatActivity implements Toolbar.OnMenu
final CalendarAdapter adapter = new CalendarAdapter(this);
adapter.addAll(info.caldav.collections);
listCalDAV.setAdapter(adapter);
listCalDAV.setOnItemClickListener(onCalendarItemClickListener);
listCalDAV.setOnItemClickListener(onItemClickListener);
} else
card.setVisibility(View.GONE);
}

@ -1,174 +0,0 @@
/*
* Copyright © 2013 2016 Ricki Hirner (bitfire web engineering).
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*/
package com.etesync.syncadapter.ui;
import android.accounts.Account;
import android.content.Intent;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.provider.CalendarContract;
import android.support.v4.app.NavUtils;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import org.apache.commons.lang3.StringUtils;
import com.etesync.syncadapter.App;
import com.etesync.syncadapter.R;
import com.etesync.syncadapter.model.CollectionInfo;
import com.etesync.syncadapter.model.EntryEntity;
import com.etesync.syncadapter.model.JournalEntity;
import com.etesync.syncadapter.resource.LocalCalendar;
import java.util.Locale;
import at.bitfire.ical4android.CalendarStorageException;
import io.requery.Persistable;
import io.requery.sql.EntityDataStore;
import yuku.ambilwarna.AmbilWarnaDialog;
public class CreateCalendarActivity extends AppCompatActivity {
public static final String EXTRA_ACCOUNT = "account",
EXTRA_COLLECTION_INFO = "collectionInfo",
EXTRA_ALLOW_DELETE = "allowDelete";
protected Account account;
protected CollectionInfo info;
protected Boolean allowDelete;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
account = getIntent().getExtras().getParcelable(EXTRA_ACCOUNT);
info = (CollectionInfo) getIntent().getExtras().getSerializable(EXTRA_COLLECTION_INFO);
allowDelete = (Boolean) getIntent().getExtras().get(EXTRA_ALLOW_DELETE);
allowDelete = (allowDelete == null) ? false : allowDelete;
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
setContentView(R.layout.activity_create_calendar);
final View colorSquare = findViewById(R.id.color);
colorSquare.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new AmbilWarnaDialog(CreateCalendarActivity.this, ((ColorDrawable) colorSquare.getBackground()).getColor(), true, new AmbilWarnaDialog.OnAmbilWarnaListener() {
@Override
public void onCancel(AmbilWarnaDialog dialog) {
}
@Override
public void onOk(AmbilWarnaDialog dialog, int color) {
colorSquare.setBackgroundColor(color);
}
}).show();
}
});
if (info != null) {
final EditText edit = (EditText) findViewById(R.id.display_name);
edit.setText(info.displayName);
final EditText desc = (EditText) findViewById(R.id.description);
desc.setText(info.description);
if (info.color != null) {
colorSquare.setBackgroundColor(info.color);
} else {
colorSquare.setBackgroundColor(LocalCalendar.defaultColor);
}
final TextView stats = (TextView) findViewById(R.id.stats);
final View statsGroup = findViewById(R.id.stats_group);
try {
LocalCalendar resource = (LocalCalendar) LocalCalendar.find(account, this.getContentResolver().acquireContentProviderClient(CalendarContract.CONTENT_URI),
LocalCalendar.Factory.INSTANCE, CalendarContract.Calendars.NAME + "=?", new String[]{info.url})[0];
long count = resource.count();
EntityDataStore<Persistable> data = ((App) getApplication()).getData();
int entryCount = -1;
final JournalEntity journalEntity = data.select(JournalEntity.class).where(JournalEntity.UID.eq(info.url)).limit(1).get().firstOrNull();
if (journalEntity != null) {
entryCount = data.count(EntryEntity.class).where(EntryEntity.JOURNAL.eq(journalEntity)).get().value();
}
stats.setText(String.format(Locale.getDefault(), "Events: %d, Journal entries: %d", count, entryCount));
statsGroup.setVisibility(View.VISIBLE);
} catch (CalendarStorageException e) {
e.printStackTrace();
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (info == null) {
getMenuInflater().inflate(R.menu.activity_create_collection, menu);
} else {
getMenuInflater().inflate(R.menu.activity_edit_collection, menu);
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
Intent intent = new Intent(this, AccountActivity.class);
intent.putExtra(AccountActivity.EXTRA_ACCOUNT, account);
NavUtils.navigateUpTo(this, intent);
return true;
}
return false;
}
public void onDeleteCollection(MenuItem item) {
if (!allowDelete) {
new AlertDialog.Builder(this)
.setIcon(R.drawable.ic_error_dark)
.setTitle(R.string.account_delete_collection_last_title)
.setMessage(R.string.account_delete_collection_last_text)
.setPositiveButton(android.R.string.ok, null)
.show();
} else {
DeleteCollectionFragment.ConfirmDeleteCollectionFragment.newInstance(account, info).show(getSupportFragmentManager(), null);
}
}
public void onCreateCollection(MenuItem item) {
boolean ok = true;
if (info == null) {
info = new CollectionInfo();
}
EditText edit = (EditText) findViewById(R.id.display_name);
info.displayName = edit.getText().toString();
if (TextUtils.isEmpty(info.displayName)) {
edit.setError(getString(R.string.create_collection_display_name_required));
ok = false;
}
edit = (EditText) findViewById(R.id.description);
info.description = StringUtils.trimToNull(edit.getText().toString());
View view = findViewById(R.id.color);
info.color = ((ColorDrawable) view.getBackground()).getColor();
if (ok) {
info.type = CollectionInfo.Type.CALENDAR;
info.supportsVEVENT = true;
info.selected = true;
CreateCollectionFragment.newInstance(account, info).show(getSupportFragmentManager(), null);
}
}
}

@ -9,9 +9,10 @@
package com.etesync.syncadapter.ui;
import android.accounts.Account;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.v4.app.NavUtils;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
@ -19,65 +20,63 @@ import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import com.etesync.syncadapter.App;
import com.etesync.syncadapter.R;
import com.etesync.syncadapter.model.CollectionInfo;
import com.etesync.syncadapter.model.EntryEntity;
import com.etesync.syncadapter.model.JournalEntity;
import com.etesync.syncadapter.resource.LocalAddressBook;
import org.apache.commons.lang3.StringUtils;
import org.w3c.dom.Text;
import java.util.Locale;
import yuku.ambilwarna.AmbilWarnaDialog;
import at.bitfire.vcard4android.ContactsStorageException;
import io.requery.Persistable;
import io.requery.sql.EntityDataStore;
public class CreateAddressBookActivity extends AppCompatActivity {
public static final String EXTRA_ACCOUNT = "account",
EXTRA_COLLECTION_INFO = "collectionInfo";
public class CreateCollectionActivity extends AppCompatActivity {
static final String EXTRA_ACCOUNT = "account",
EXTRA_COLLECTION_INFO = "collectionInfo";
protected Account account;
protected CollectionInfo info;
public static Intent newIntent(Context context, Account account, CollectionInfo info) {
Intent intent = new Intent(context, CreateCollectionActivity.class);
intent.putExtra(CreateCollectionActivity.EXTRA_ACCOUNT, account);
intent.putExtra(CreateCollectionActivity.EXTRA_COLLECTION_INFO, info);
return intent;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
account = getIntent().getParcelableExtra(EXTRA_ACCOUNT);
account = getIntent().getExtras().getParcelable(EXTRA_ACCOUNT);
info = (CollectionInfo) getIntent().getExtras().getSerializable(EXTRA_COLLECTION_INFO);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
setContentView(R.layout.activity_create_address_book);
if (info != null) {
final EditText edit = (EditText) findViewById(R.id.display_name);
edit.setText(info.displayName);
final EditText desc = (EditText) findViewById(R.id.description);
desc.setText(info.description);
final TextView stats = (TextView) findViewById(R.id.stats);
final View statsGroup = findViewById(R.id.stats_group);
try {
LocalAddressBook resource = new LocalAddressBook(account, this.getContentResolver().acquireContentProviderClient(ContactsContract.Contacts.CONTENT_URI));
long count = resource.count();
EntityDataStore<Persistable> data = ((App) getApplication()).getData();
int entryCount = -1;
final JournalEntity journalEntity = data.select(JournalEntity.class).where(JournalEntity.UID.eq(info.url)).limit(1).get().firstOrNull();
if (journalEntity != null) {
entryCount = data.count(EntryEntity.class).where(EntryEntity.JOURNAL.eq(journalEntity)).get().value();
};
stats.setText(String.format(Locale.getDefault(), "Contacts: %d, Journal Entries: %d", count, entryCount));
statsGroup.setVisibility(View.VISIBLE);
} catch (ContactsStorageException e) {
e.printStackTrace();
}
setContentView(R.layout.activity_create_collection);
if (info.type == CollectionInfo.Type.CALENDAR) {
setTitle(R.string.create_calendar);
final View colorSquare = findViewById(R.id.color);
colorSquare.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new AmbilWarnaDialog(CreateCollectionActivity.this, ((ColorDrawable) colorSquare.getBackground()).getColor(), true, new AmbilWarnaDialog.OnAmbilWarnaListener() {
@Override
public void onCancel(AmbilWarnaDialog dialog) {
}
@Override
public void onOk(AmbilWarnaDialog dialog, int color) {
colorSquare.setBackgroundColor(color);
}
}).show();
}
});
} else {
setTitle(R.string.create_addressbook);
final View colorGroup = findViewById(R.id.color_group);
colorGroup.setVisibility(View.GONE);
}
}
@ -104,18 +103,25 @@ public class CreateAddressBookActivity extends AppCompatActivity {
info = new CollectionInfo();
}
EditText edit = (EditText)findViewById(R.id.display_name);
EditText edit = (EditText) findViewById(R.id.display_name);
info.displayName = edit.getText().toString();
if (TextUtils.isEmpty(info.displayName)) {
edit.setError(getString(R.string.create_collection_display_name_required));
ok = false;
}
edit = (EditText)findViewById(R.id.description);
edit = (EditText) findViewById(R.id.description);
info.description = StringUtils.trimToNull(edit.getText().toString());
if (ok) {
info.type = CollectionInfo.Type.ADDRESS_BOOK;
if (info.type == CollectionInfo.Type.CALENDAR) {
View view = findViewById(R.id.color);
info.color = ((ColorDrawable) view.getBackground()).getColor();
info.supportsVEVENT = true;
}
info.selected = true;
CreateCollectionFragment.newInstance(account, info).show(getSupportFragmentManager(), null);
}

@ -84,7 +84,7 @@ public class DeleteCollectionFragment extends DialogFragment implements LoaderMa
Activity activity = getActivity();
if (activity instanceof AccountActivity)
((AccountActivity) activity).reload();
else if (activity instanceof CreateCalendarActivity)
else if (activity instanceof CreateCollectionActivity)
activity.finish();
}
}

@ -0,0 +1,84 @@
/*
* Copyright © 2013 2016 Ricki Hirner (bitfire web engineering).
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*/
package com.etesync.syncadapter.ui;
import android.accounts.Account;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import com.etesync.syncadapter.R;
import com.etesync.syncadapter.model.CollectionInfo;
import com.etesync.syncadapter.resource.LocalCalendar;
public class EditCollectionActivity extends CreateCollectionActivity {
private final static String EXTRA_ALLOW_DELETE = "allowDelete";
protected boolean allowDelete;
public static Intent newIntent(Context context, Account account, CollectionInfo info, boolean allowDelete) {
Intent intent = new Intent(context, EditCollectionActivity.class);
intent.putExtra(CreateCollectionActivity.EXTRA_ACCOUNT, account);
intent.putExtra(CreateCollectionActivity.EXTRA_COLLECTION_INFO, info);
intent.putExtra(EXTRA_ALLOW_DELETE, allowDelete);
return intent;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
allowDelete = getIntent().getExtras().getBoolean(EXTRA_ALLOW_DELETE, false);
setTitle(R.string.edit_collection);
if (info.type == CollectionInfo.Type.CALENDAR) {
final View colorSquare = findViewById(R.id.color);
if (info.color != null) {
colorSquare.setBackgroundColor(info.color);
} else {
colorSquare.setBackgroundColor(LocalCalendar.defaultColor);
}
}
final EditText edit = (EditText) findViewById(R.id.display_name);
edit.setText(info.displayName);
final EditText desc = (EditText) findViewById(R.id.description);
desc.setText(info.description);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (info.type == CollectionInfo.Type.ADDRESS_BOOK) {
getMenuInflater().inflate(R.menu.activity_create_collection, menu);
} else {
getMenuInflater().inflate(R.menu.activity_edit_collection, menu);
}
return true;
}
public void onDeleteCollection(MenuItem item) {
if (!allowDelete) {
new AlertDialog.Builder(this)
.setIcon(R.drawable.ic_error_dark)
.setTitle(R.string.account_delete_collection_last_title)
.setMessage(R.string.account_delete_collection_last_text)
.setPositiveButton(android.R.string.ok, null)
.show();
} else {
DeleteCollectionFragment.ConfirmDeleteCollectionFragment.newInstance(account, info).show(getSupportFragmentManager(), null);
}
}
}

@ -1,64 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright © 2013 2016 Ricki Hirner (bitfire web engineering).
~ All rights reserved. This program and the accompanying materials
~ are made available under the terms of the GNU Public License v3.0
~ which accompanies this distribution, and is available at
~ http://www.gnu.org/licenses/gpl.html
-->
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent">
<LinearLayout android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/activity_margin">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/create_collection_display_name"/>
<EditText
android:id="@+id/display_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:hint="@string/create_addressbook_display_name_hint"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/create_collection_description"/>
<EditText
android:id="@+id/description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:inputType="textAutoCorrect"/>
<LinearLayout
android:id="@+id/stats_group"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"
android:text="@string/collection_stats_title"/>
<TextView
android:id="@+id/stats"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="6dp" />
</LinearLayout>
</LinearLayout>
</ScrollView>

@ -39,6 +39,7 @@
android:inputType="textAutoCorrect"/>
<LinearLayout
android:id="@+id/color_group"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
@ -59,27 +60,5 @@
android:text="@string/create_collection_color"/>
</LinearLayout>
<LinearLayout
android:id="@+id/stats_group"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"
android:text="@string/collection_stats_title"/>
<TextView
android:id="@+id/stats"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="6dp" />
</LinearLayout>
</LinearLayout>
</ScrollView>

@ -181,6 +181,7 @@
<string name="create_addressbook_display_name_hint">My Address Book</string>
<string name="create_calendar">Create calendar</string>
<string name="create_calendar_display_name_hint">My Calendar</string>
<string name="edit_collection">Edit collection</string>
<string name="create_collection_color">Set the calendar\'s color</string>
<string name="create_collection_creating">Creating collection</string>
<string name="create_collection_display_name">Display name (title) of this collection:</string>

Loading…
Cancel
Save