diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 818ffb40..f5dc2681 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,6 +14,7 @@ + @@ -111,6 +112,15 @@ + + + + - - - diff --git a/app/src/main/java/at/bitfire/davdroid/ui/AccountActivity.java b/app/src/main/java/at/bitfire/davdroid/ui/AccountActivity.java new file mode 100644 index 00000000..4c1e597b --- /dev/null +++ b/app/src/main/java/at/bitfire/davdroid/ui/AccountActivity.java @@ -0,0 +1,129 @@ +/* + * 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 at.bitfire.davdroid.ui; + +import android.accounts.Account; +import android.accounts.AccountManager; +import android.accounts.AccountManagerCallback; +import android.accounts.AccountManagerFuture; +import android.accounts.AuthenticatorException; +import android.accounts.OperationCanceledException; +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.DialogInterface; +import android.os.Build; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v4.app.DialogFragment; +import android.support.v4.content.res.ResourcesCompat; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.view.Menu; +import android.view.MenuItem; + +import java.io.IOException; + +import at.bitfire.davdroid.Constants; +import at.bitfire.davdroid.R; + +public class AccountActivity extends AppCompatActivity implements Toolbar.OnMenuItemClickListener { + + public static final String EXTRA_ACCOUNT_NAME = "account_name"; + + Account account; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + final String accountName = getIntent().getStringExtra(EXTRA_ACCOUNT_NAME); + if (accountName == null) + // invalid account name + finish(); + account = new Account(accountName, Constants.ACCOUNT_TYPE); + setTitle(accountName); + + setContentView(R.layout.activity_account); + + Toolbar toolbar = (Toolbar)findViewById(R.id.carddav_menu); + toolbar.inflateMenu(R.menu.carddav_actions); + toolbar.setOnMenuItemClickListener(this); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.activity_account, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.delete_account: + DialogFragment frag = new DialogFragment() { + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + return new AlertDialog.Builder(AccountActivity.this) + .setIcon(R.drawable.ic_error_dark) + .setTitle(R.string.account_delete_confirmation_title) + .setMessage(R.string.account_delete_confirmation_text) + .setNegativeButton(android.R.string.no, null) + .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + deleteAccount(); + } + }) + .create(); + } + }; + frag.show(getSupportFragmentManager(), null); + break; + default: + return super.onOptionsItemSelected(item); + } + return true; + } + + @Override + public boolean onMenuItemClick(MenuItem item) { + return false; + } + + + protected void deleteAccount() { + AccountManager accountManager = AccountManager.get(this); + + if (Build.VERSION.SDK_INT >= 22) + accountManager.removeAccount(account, this, new AccountManagerCallback() { + @Override + public void run(AccountManagerFuture future) { + try { + if (future.getResult().getBoolean(AccountManager.KEY_BOOLEAN_RESULT)) + finish(); + } catch(OperationCanceledException|IOException|AuthenticatorException e) { + Constants.log.error("Couldn't remove account", e); + } + } + }, null); + else + accountManager.removeAccount(account, new AccountManagerCallback() { + @Override + public void run(AccountManagerFuture future) { + try { + if (future.getResult()) + finish(); + } catch (OperationCanceledException|IOException|AuthenticatorException e) { + Constants.log.error("Couldn't remove account", e); + } + } + }, null); + } + +} diff --git a/app/src/main/java/at/bitfire/davdroid/ui/AccountListFragment.java b/app/src/main/java/at/bitfire/davdroid/ui/AccountListFragment.java index 43f5f81c..46513953 100644 --- a/app/src/main/java/at/bitfire/davdroid/ui/AccountListFragment.java +++ b/app/src/main/java/at/bitfire/davdroid/ui/AccountListFragment.java @@ -12,6 +12,7 @@ import android.accounts.Account; import android.accounts.AccountManager; import android.accounts.OnAccountsUpdateListener; import android.content.Context; +import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; @@ -22,7 +23,10 @@ import android.support.v4.content.Loader; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.AbsListView; +import android.widget.AdapterView; import android.widget.ArrayAdapter; +import android.widget.ListView; import android.widget.TextView; import java.util.LinkedList; @@ -35,7 +39,7 @@ import at.bitfire.davdroid.syncadapter.ServiceDB.*; import lombok.Cleanup; import lombok.RequiredArgsConstructor; -public class AccountListFragment extends ListFragment implements OnAccountsUpdateListener, LoaderManager.LoaderCallbacks> { +public class AccountListFragment extends ListFragment implements OnAccountsUpdateListener, LoaderManager.LoaderCallbacks>, AdapterView.OnItemClickListener { protected AccountManager accountManager; @@ -53,6 +57,10 @@ public class AccountListFragment extends ListFragment implements OnAccountsUpdat public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); getLoaderManager().initLoader(0, getArguments(), this); + + ListView list = getListView(); + list.setOnItemClickListener(this); + list.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE); } @Override @@ -61,6 +69,17 @@ public class AccountListFragment extends ListFragment implements OnAccountsUpdat super.onDestroyView(); } + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + AccountInfo info = (AccountInfo)getListAdapter().getItem(position); + + Intent intent = new Intent(getContext(), AccountActivity.class); + intent.putExtra(AccountActivity.EXTRA_ACCOUNT_NAME, info.account.name); + startActivity(intent); + } + + @Override public void onAccountsUpdated(Account[] accounts) { getLoaderManager().restartLoader(0, null, this); @@ -91,6 +110,7 @@ public class AccountListFragment extends ListFragment implements OnAccountsUpdat boolean hasCardDAV, hasCalDAV; } + static class AccountListAdapter extends ArrayAdapter { public AccountListAdapter(Context context) { @@ -119,6 +139,7 @@ public class AccountListFragment extends ListFragment implements OnAccountsUpdat return v; } + } static class AccountLoader extends AsyncTaskLoader> { diff --git a/app/src/main/java/at/bitfire/davdroid/ui/DebugInfoActivity.java b/app/src/main/java/at/bitfire/davdroid/ui/DebugInfoActivity.java index 76a1610f..91f7174a 100644 --- a/app/src/main/java/at/bitfire/davdroid/ui/DebugInfoActivity.java +++ b/app/src/main/java/at/bitfire/davdroid/ui/DebugInfoActivity.java @@ -59,7 +59,7 @@ public class DebugInfoActivity extends AppCompatActivity implements LoaderManage protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.debug_info_activity); + setContentView(R.layout.activity_debug_info); tvReport = (TextView)findViewById(R.id.text_report); getLoaderManager().initLoader(0, getIntent().getExtras(), this); diff --git a/app/src/main/java/at/bitfire/davdroid/ui/setup/LoginCredentialsFragment.java b/app/src/main/java/at/bitfire/davdroid/ui/setup/LoginCredentialsFragment.java index 300d4dcc..8b6824f8 100644 --- a/app/src/main/java/at/bitfire/davdroid/ui/setup/LoginCredentialsFragment.java +++ b/app/src/main/java/at/bitfire/davdroid/ui/setup/LoginCredentialsFragment.java @@ -28,7 +28,7 @@ import java.net.URI; import java.net.URISyntaxException; import at.bitfire.davdroid.R; -import at.bitfire.davdroid.ui.EditPassword; +import at.bitfire.davdroid.ui.widget.EditPassword; import lombok.Data; public class LoginCredentialsFragment extends Fragment implements CompoundButton.OnCheckedChangeListener { diff --git a/app/src/main/java/at/bitfire/davdroid/ui/EditPassword.java b/app/src/main/java/at/bitfire/davdroid/ui/widget/EditPassword.java similarity index 98% rename from app/src/main/java/at/bitfire/davdroid/ui/EditPassword.java rename to app/src/main/java/at/bitfire/davdroid/ui/widget/EditPassword.java index b3b505d2..f926febe 100644 --- a/app/src/main/java/at/bitfire/davdroid/ui/EditPassword.java +++ b/app/src/main/java/at/bitfire/davdroid/ui/widget/EditPassword.java @@ -6,7 +6,7 @@ * http://www.gnu.org/licenses/gpl.html */ -package at.bitfire.davdroid.ui; +package at.bitfire.davdroid.ui.widget; import android.content.Context; import android.support.v7.widget.AppCompatCheckBox; diff --git a/app/src/main/res/drawable-nodpi/gletschersee.jpg b/app/src/main/res/drawable-nodpi/gletschersee.jpg deleted file mode 100644 index 04e9aaf3..00000000 Binary files a/app/src/main/res/drawable-nodpi/gletschersee.jpg and /dev/null differ diff --git a/app/src/main/res/drawable/chip_bg.xml b/app/src/main/res/drawable/chip_bg.xml new file mode 100644 index 00000000..f33dda38 --- /dev/null +++ b/app/src/main/res/drawable/chip_bg.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_people_light.xml b/app/src/main/res/drawable/ic_people_light.xml new file mode 100644 index 00000000..7721a01c --- /dev/null +++ b/app/src/main/res/drawable/ic_people_light.xml @@ -0,0 +1,17 @@ + + + + + diff --git a/app/src/main/res/layout/account_list.xml b/app/src/main/res/layout/account_list.xml index 8aa5c336..92882e8a 100644 --- a/app/src/main/res/layout/account_list.xml +++ b/app/src/main/res/layout/account_list.xml @@ -12,8 +12,8 @@ android:layout_height="match_parent"> @@ -22,6 +22,7 @@ android:id="@id/android:list" android:layout_width="match_parent" android:layout_height="wrap_content" + android:padding="8dp" android:divider="@android:color/transparent" android:background="@android:color/transparent" android:cacheColorHint="@android:color/transparent"/> @@ -30,10 +31,8 @@ android:id="@id/android:empty" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_marginBottom="72dp" - android:layout_marginRight="64dp" + android:layout_margin="16dp" android:gravity="center" - android:textColor="@color/white" android:textAppearance="@style/TextAppearance.AppCompat.Large" android:text="@string/account_list_empty" /> diff --git a/app/src/main/res/layout/account_list_item.xml b/app/src/main/res/layout/account_list_item.xml index 8a52f295..f7616fda 100644 --- a/app/src/main/res/layout/account_list_item.xml +++ b/app/src/main/res/layout/account_list_item.xml @@ -5,13 +5,13 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:gravity="center_horizontal"> + android:gravity="center_horizontal" + android:descendantFocusability="blocksDescendants"> - - + android:gravity="right|center_vertical"> + + + + + + + + + diff --git a/app/src/main/res/layout/activity_account.xml b/app/src/main/res/layout/activity_account.xml new file mode 100644 index 00000000..625820dd --- /dev/null +++ b/app/src/main/res/layout/activity_account.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/debug_info_activity.xml b/app/src/main/res/layout/activity_debug_info.xml similarity index 100% rename from app/src/main/res/layout/debug_info_activity.xml rename to app/src/main/res/layout/activity_debug_info.xml diff --git a/app/src/main/res/layout/login_credentials_fragment.xml b/app/src/main/res/layout/login_credentials_fragment.xml index 56a15871..a5c2ccaa 100644 --- a/app/src/main/res/layout/login_credentials_fragment.xml +++ b/app/src/main/res/layout/login_credentials_fragment.xml @@ -56,7 +56,7 @@ android:layout_height="wrap_content" android:hint="@string/login_email_address" android:inputType="textEmailAddress"/> - - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/carddav_actions.xml b/app/src/main/res/menu/carddav_actions.xml new file mode 100644 index 00000000..1658a194 --- /dev/null +++ b/app/src/main/res/menu/carddav_actions.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e981b063..da0a596b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -27,6 +27,14 @@ Welcome to DAVdroid!\n\nYou can add a CalDAV/CardDAV account now. + + Delete account + Really delete account? + All local copies of address books, calendars and task lists will be deleted. + Refresh address book list + Add existing address book + Create new address book + Manage sync accounts Show debug info diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 34edf42d..6ded76dd 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -65,6 +65,22 @@ + + + + + + + +