From 515969c4b846f6580ab25d9c4050b4d2cf7415ff Mon Sep 17 00:00:00 2001 From: Ricki Hirner Date: Fri, 15 Jan 2016 01:07:56 +0100 Subject: [PATCH] Initial changes for new GUI --- app/build.gradle | 10 +- app/src/main/AndroidManifest.xml | 116 ++++++---- .../AccountAuthenticatorService.java | 2 +- .../davdroid/ui/AccountListFragment.java | 81 +++++++ .../bitfire/davdroid/ui/AccountsActivity.java | 82 +++++++ .../davdroid/ui/AddAccountActivity.java | 25 ++ .../at/bitfire/davdroid/ui/EditPassword.java | 45 ++++ .../at/bitfire/davdroid/ui/MainActivity.java | 134 ----------- .../ui/setup/AccountDetailsFragment.java | 193 ---------------- .../davdroid/ui/setup/AddAccountActivity.java | 60 ----- .../ui/setup/InstallAppsFragment.java | 63 ----- .../davdroid/ui/setup/LoginEmailFragment.java | 130 ----------- .../davdroid/ui/setup/LoginTypeFragment.java | 57 ----- .../davdroid/ui/setup/LoginURLFragment.java | 168 -------------- .../ui/setup/QueryServerDialogFragment.java | 184 --------------- .../ui/setup/SelectCollectionsAdapter.java | 217 ------------------ .../ui/setup/SelectCollectionsFragment.java | 125 ---------- app/src/main/res/color/buttontext.xml | 13 ++ .../main/res/drawable-nodpi/gletschersee.jpg | Bin 0 -> 70680 bytes app/src/main/res/drawable/ic_add_light.xml | 17 ++ .../res/drawable/ic_attach_money_dark.xml | 13 ++ app/src/main/res/drawable/ic_home_dark.xml | 5 + app/src/main/res/drawable/ic_info_dark.xml | 5 + .../main/res/drawable/ic_settings_dark.xml | 5 + .../main/res/drawable/ic_visibility_dark.xml | 5 + .../res/drawable/ic_visibility_off_dark.xml | 5 + .../main/res/drawable/password_eye_button.xml | 15 ++ app/src/main/res/drawable/side_nav_bar.xml | 17 ++ .../res/layout-large/content_accounts.xml | 23 ++ .../res/layout-sw720dp/settings_activity.xml | 2 +- app/src/main/res/layout/account_list.xml | 45 ++++ app/src/main/res/layout/account_list_item.xml | 33 +++ app/src/main/res/layout/activity_accounts.xml | 34 +++ .../main/res/layout/activity_add_account.xml | 125 ++++++++++ app/src/main/res/layout/app_bar_accounts.xml | 42 ++++ app/src/main/res/layout/content_accounts.xml | 23 ++ app/src/main/res/layout/edit_password.xml | 29 +++ .../main/res/layout/nav_header_accounts.xml | 42 ++++ .../res/menu/activity_accounts_drawer.xml | 29 +++ app/src/main/res/values-v21/styles.xml | 18 ++ app/src/main/res/values/dimen.xml | 13 +- app/src/main/res/values/drawables.xml | 16 ++ app/src/main/res/values/strings.xml | 18 +- app/src/main/res/values/styles.xml | 60 +++-- build.gradle | 2 +- ical4android | 2 +- 46 files changed, 944 insertions(+), 1404 deletions(-) create mode 100644 app/src/main/java/at/bitfire/davdroid/ui/AccountListFragment.java create mode 100644 app/src/main/java/at/bitfire/davdroid/ui/AccountsActivity.java create mode 100644 app/src/main/java/at/bitfire/davdroid/ui/AddAccountActivity.java create mode 100644 app/src/main/java/at/bitfire/davdroid/ui/EditPassword.java delete mode 100644 app/src/main/java/at/bitfire/davdroid/ui/MainActivity.java delete mode 100644 app/src/main/java/at/bitfire/davdroid/ui/setup/AccountDetailsFragment.java delete mode 100644 app/src/main/java/at/bitfire/davdroid/ui/setup/AddAccountActivity.java delete mode 100644 app/src/main/java/at/bitfire/davdroid/ui/setup/InstallAppsFragment.java delete mode 100644 app/src/main/java/at/bitfire/davdroid/ui/setup/LoginEmailFragment.java delete mode 100644 app/src/main/java/at/bitfire/davdroid/ui/setup/LoginTypeFragment.java delete mode 100644 app/src/main/java/at/bitfire/davdroid/ui/setup/LoginURLFragment.java delete mode 100644 app/src/main/java/at/bitfire/davdroid/ui/setup/QueryServerDialogFragment.java delete mode 100644 app/src/main/java/at/bitfire/davdroid/ui/setup/SelectCollectionsAdapter.java delete mode 100644 app/src/main/java/at/bitfire/davdroid/ui/setup/SelectCollectionsFragment.java create mode 100644 app/src/main/res/color/buttontext.xml create mode 100644 app/src/main/res/drawable-nodpi/gletschersee.jpg create mode 100644 app/src/main/res/drawable/ic_add_light.xml create mode 100644 app/src/main/res/drawable/ic_attach_money_dark.xml create mode 100644 app/src/main/res/drawable/ic_home_dark.xml create mode 100644 app/src/main/res/drawable/ic_info_dark.xml create mode 100644 app/src/main/res/drawable/ic_settings_dark.xml create mode 100644 app/src/main/res/drawable/ic_visibility_dark.xml create mode 100644 app/src/main/res/drawable/ic_visibility_off_dark.xml create mode 100644 app/src/main/res/drawable/password_eye_button.xml create mode 100644 app/src/main/res/drawable/side_nav_bar.xml create mode 100644 app/src/main/res/layout-large/content_accounts.xml create mode 100644 app/src/main/res/layout/account_list.xml create mode 100644 app/src/main/res/layout/account_list_item.xml create mode 100644 app/src/main/res/layout/activity_accounts.xml create mode 100644 app/src/main/res/layout/activity_add_account.xml create mode 100644 app/src/main/res/layout/app_bar_accounts.xml create mode 100644 app/src/main/res/layout/content_accounts.xml create mode 100644 app/src/main/res/layout/edit_password.xml create mode 100644 app/src/main/res/layout/nav_header_accounts.xml create mode 100644 app/src/main/res/menu/activity_accounts_drawer.xml create mode 100644 app/src/main/res/values-v21/styles.xml create mode 100644 app/src/main/res/values/drawables.xml diff --git a/app/build.gradle b/app/build.gradle index 68f49f7c..f1d627f3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -55,16 +55,20 @@ configurations.all { } dependencies { - compile 'dnsjava:dnsjava:2.1.7' - compile 'org.apache.commons:commons-lang3:3.4' provided 'org.projectlombok:lombok:1.16.6' - compile 'org.slf4j:slf4j-android:1.7.13' compile project(':dav4android') compile project(':ical4android') compile project(':vcard4android') + compile 'com.android.support:appcompat-v7:23.+' + compile 'com.android.support:cardview-v7:23.+' + compile 'com.android.support:design:23.+' + compile project(':MemorizingTrustManager') androidTestCompile 'com.squareup.okhttp:mockwebserver:2.7.2' + compile 'dnsjava:dnsjava:2.1.7' + compile 'org.apache.commons:commons-lang3:3.4' + compile 'org.slf4j:slf4j-android:1.7.13' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 37d7820e..e99a0f1d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,64 +5,75 @@ ~ 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 - --> - - +--> + - - - - + + + + - - - + + + - - - - - + + + + + + + - - + android:theme="@style/AppTheme" + tools:ignore="UnusedAttribute"> - + + + android:resource="@xml/account_authenticator"/> - - + + + android:resource="@xml/sync_contacts"/> + android:resource="@xml/contacts"/> - + + + android:resource="@xml/sync_calendars"/> - + + + android:resource="@xml/sync_tasks"/> + android:name=".ui.AccountsActivity" + android:label="@string/app_name" + android:theme="@style/AppTheme.NoActionBar"> - - + + + android:name=".ui.AddAccountActivity" + android:label="@string/login_title" + android:parentActivityName=".ui.AccountsActivity" + android:noHistory="true"> + + + + android:name=".ui.DebugInfoActivity" + android:exported="true" + android:label="@string/debug_info_title"> + android:label="@string/settings_title"> - - + + + + android:parentActivityName=".ui.settings.SettingsActivity" + tools:ignore="UnusedAttribute"> - + diff --git a/app/src/main/java/at/bitfire/davdroid/syncadapter/AccountAuthenticatorService.java b/app/src/main/java/at/bitfire/davdroid/syncadapter/AccountAuthenticatorService.java index c20ea722..4ca038f6 100644 --- a/app/src/main/java/at/bitfire/davdroid/syncadapter/AccountAuthenticatorService.java +++ b/app/src/main/java/at/bitfire/davdroid/syncadapter/AccountAuthenticatorService.java @@ -18,7 +18,7 @@ import android.content.Intent; import android.os.Bundle; import android.os.IBinder; -import at.bitfire.davdroid.ui.setup.AddAccountActivity; +import at.bitfire.davdroid.ui.AddAccountActivity; public class AccountAuthenticatorService extends Service { private static AccountAuthenticator accountAuthenticator; diff --git a/app/src/main/java/at/bitfire/davdroid/ui/AccountListFragment.java b/app/src/main/java/at/bitfire/davdroid/ui/AccountListFragment.java new file mode 100644 index 00000000..d517240b --- /dev/null +++ b/app/src/main/java/at/bitfire/davdroid/ui/AccountListFragment.java @@ -0,0 +1,81 @@ +/* + * 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.OnAccountsUpdateListener; +import android.content.Context; +import android.os.Bundle; +import android.support.v4.app.ListFragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.TextView; + +import at.bitfire.davdroid.Constants; +import at.bitfire.davdroid.R; + +public class AccountListFragment extends ListFragment implements OnAccountsUpdateListener { + + protected AccountManager accountManager; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + setListAdapter(new AccountListAdapter(getContext())); + + accountManager = AccountManager.get(getContext()); + accountManager.addOnAccountsUpdatedListener(this, null, true); + + return inflater.inflate(R.layout.account_list, container, false); + } + + @Override + public void onDestroyView() { + accountManager.removeOnAccountsUpdatedListener(this); + super.onDestroyView(); + } + + @Override + public void onAccountsUpdated(Account[] accounts) { + AccountListAdapter adapter = (AccountListAdapter)getListAdapter(); + if (adapter != null) { + adapter.clear(); + for (Account account : accounts) + if (Constants.ACCOUNT_TYPE.equals(account.type)) + adapter.add(account); + } + } + + + class AccountListAdapter extends ArrayAdapter { + + public AccountListAdapter(Context context) { + super(context, R.layout.account_list_item); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + View v = convertView; + + if (v == null) { + LayoutInflater inflater = LayoutInflater.from(getContext()); + v = inflater.inflate(R.layout.account_list_item, parent, false); + } + + Account account = getItem(position); + + TextView tvName = (TextView)v.findViewById(R.id.account_name); + tvName.setText(account.name); + + return v; + } + } +} diff --git a/app/src/main/java/at/bitfire/davdroid/ui/AccountsActivity.java b/app/src/main/java/at/bitfire/davdroid/ui/AccountsActivity.java new file mode 100644 index 00000000..9656862c --- /dev/null +++ b/app/src/main/java/at/bitfire/davdroid/ui/AccountsActivity.java @@ -0,0 +1,82 @@ +/* + * 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.content.Intent; +import android.os.Bundle; +import android.support.design.widget.FloatingActionButton; +import android.support.design.widget.NavigationView; +import android.support.v4.view.GravityCompat; +import android.support.v4.widget.DrawerLayout; +import android.support.v7.app.ActionBarDrawerToggle; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.view.MenuItem; +import android.view.View; + +import at.bitfire.davdroid.Constants; +import at.bitfire.davdroid.R; + +public class AccountsActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_accounts); + + Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + FloatingActionButton fab = (FloatingActionButton)findViewById(R.id.fab); + fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + startActivity(new Intent(AccountsActivity.this, AddAccountActivity.class)); + } + }); + + DrawerLayout drawer = (DrawerLayout)findViewById(R.id.drawer_layout); + ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( + this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); + drawer.setDrawerListener(toggle); + toggle.syncState(); + + NavigationView navigationView = (NavigationView)findViewById(R.id.nav_view); + navigationView.setNavigationItemSelectedListener(this); + } + + @Override + public void onBackPressed() { + DrawerLayout drawer = (DrawerLayout)findViewById(R.id.drawer_layout); + if (drawer.isDrawerOpen(GravityCompat.START)) + drawer.closeDrawer(GravityCompat.START); + else + super.onBackPressed(); + } + + @Override + public boolean onNavigationItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.nav_about: + break; + case R.id.nav_website: + startActivity(new Intent(Intent.ACTION_VIEW, Constants.webUri)); + break; + case R.id.nav_donate: + startActivity(new Intent(Intent.ACTION_VIEW, Constants.webUri.buildUpon().appendEncodedPath("donate/").build())); + break; + case R.id.nav_preferences: + break; + } + + DrawerLayout drawer = (DrawerLayout)findViewById(R.id.drawer_layout); + drawer.closeDrawer(GravityCompat.START); + return true; + } +} diff --git a/app/src/main/java/at/bitfire/davdroid/ui/AddAccountActivity.java b/app/src/main/java/at/bitfire/davdroid/ui/AddAccountActivity.java new file mode 100644 index 00000000..b3c8fcc4 --- /dev/null +++ b/app/src/main/java/at/bitfire/davdroid/ui/AddAccountActivity.java @@ -0,0 +1,25 @@ +/* + * 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.os.Bundle; +import android.support.v7.app.AppCompatActivity; + +import at.bitfire.davdroid.R; + +public class AddAccountActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(R.layout.activity_add_account); + } + +} diff --git a/app/src/main/java/at/bitfire/davdroid/ui/EditPassword.java b/app/src/main/java/at/bitfire/davdroid/ui/EditPassword.java new file mode 100644 index 00000000..419bd83c --- /dev/null +++ b/app/src/main/java/at/bitfire/davdroid/ui/EditPassword.java @@ -0,0 +1,45 @@ +/* + * 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.content.Context; +import android.support.v7.widget.AppCompatCheckBox; +import android.util.AttributeSet; +import android.view.inputmethod.EditorInfo; +import android.widget.CompoundButton; +import android.widget.EditText; +import android.widget.LinearLayout; + +import at.bitfire.davdroid.R; + +public class EditPassword extends LinearLayout { + + public EditPassword(Context context) { + super(context, null); + } + + public EditPassword(Context context, AttributeSet attrs) { + super(context, attrs); + + inflate(context, R.layout.edit_password, this); + + final EditText editPassword = (EditText)findViewById(R.id.password); + + AppCompatCheckBox checkShowPassword = (AppCompatCheckBox)findViewById(R.id.show_password); + checkShowPassword.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + int inputType = editPassword.getInputType() & ~EditorInfo.TYPE_MASK_VARIATION; + inputType |= isChecked ? EditorInfo.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD : EditorInfo.TYPE_TEXT_VARIATION_PASSWORD; + editPassword.setInputType(inputType); + } + }); + } + +} diff --git a/app/src/main/java/at/bitfire/davdroid/ui/MainActivity.java b/app/src/main/java/at/bitfire/davdroid/ui/MainActivity.java deleted file mode 100644 index 8e4b3395..00000000 --- a/app/src/main/java/at/bitfire/davdroid/ui/MainActivity.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright © 2013 – 2015 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.app.Activity; -import android.content.Intent; -import android.net.Uri; -import android.os.Build; -import android.os.Bundle; -import android.provider.Settings; -import android.text.Html; -import android.text.method.LinkMovementMethod; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.widget.TextView; - -import at.bitfire.davdroid.BuildConfig; -import at.bitfire.davdroid.Constants; -import at.bitfire.davdroid.R; -import at.bitfire.davdroid.ui.settings.SettingsActivity; -import at.bitfire.davdroid.ui.setup.AddAccountActivity; -import lombok.Getter; - -public class MainActivity extends Activity { - - private static final String libraries = - "· Apache CommonsApache License, Version 2.0
" + - "· dnsjavaBSD License
" + - "· ez-vcardNew BSD License
" + - "· iCal4jNew BSD License
" + - "· MemorizingTrustManagerMIT License
" + - "· okhttpApache License, Version 2.0
" + - "· Project LombokMIT License
" + - "· SLF4j (Simple Logging Facade for Java) – MIT License"; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - setContentView(R.layout.main_activity); - - TextView tv = (TextView)findViewById(R.id.text_store_specific); - final String installedFrom = installedFrom(); - if (installedFrom == null || installedFrom.startsWith("org.fdroid")) { - if (savedInstanceState == null) - new DonateDialogFragment().show(getFragmentManager(), "donate"); - } else if ("com.android.vending".equals(installedFrom)) - setHtmlText(R.id.text_store_specific, R.string.main_play_workaround_html); - - setPlainText(R.id.text_welcome, R.string.main_welcome, BuildConfig.VERSION_NAME); - setHtmlText(R.id.text_what_is_davdroid, R.string.main_what_is_davdroid_html); - setHtmlText(R.id.text_how_to_setup, R.string.main_how_to_setup_html); - setHtmlText(R.id.text_support, R.string.main_support_html); - setHtmlText(R.id.text_open_source_disclaimer, R.string.main_open_source_disclaimer_html); - setHtmlText(R.id.text_license, R.string.main_license_html); - setPlainText(R.id.text_libraries_heading, R.string.main_used_libraries_heading); - setHtmlText(R.id.text_libraries_list, libraries); - } - - private void setPlainText(int viewId, int stringId, Object... args) { - TextView tv = (TextView)findViewById(viewId); - tv.setVisibility(View.VISIBLE); - tv.setText(getString(stringId, args)); - } - - private void setHtmlText(int viewId, int stringId, Object... args) { - TextView tv = (TextView)findViewById(viewId); - tv.setVisibility(View.VISIBLE); - tv.setText(trim(Html.fromHtml(getString(stringId, args)))); - tv.setMovementMethod(LinkMovementMethod.getInstance()); - } - - private void setHtmlText(int viewId, String html) { - TextView tv = (TextView)findViewById(viewId); - tv.setVisibility(View.VISIBLE); - tv.setText(trim(Html.fromHtml(html))); - tv.setMovementMethod(LinkMovementMethod.getInstance()); - } - - private CharSequence trim(CharSequence text) { - while (text.charAt(text.length() - 1) == '\n') { - text = text.subSequence(0, text.length() - 1); - } - return text; - } - - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.main_activity, menu); - return true; - } - - - public void addAccount(MenuItem item) { - startActivity(new Intent(this, AddAccountActivity.class)); - } - - public void showDebugInfo(MenuItem item) { - startActivity(new Intent(this, DebugInfoActivity.class)); - } - - public void showSettings(MenuItem item) { - startActivity(new Intent(this, SettingsActivity.class)); - } - - public void showSyncSettings(MenuItem item) { - Intent intent = new Intent(Settings.ACTION_SYNC_SETTINGS); - startActivity(intent); - } - - public void showWebsite(MenuItem item) { - Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setData(Constants.webUri); - startActivity(intent); - } - - - private String installedFrom() { - try { - return getPackageManager().getInstallerPackageName("at.bitfire.davdroid"); - } catch(IllegalArgumentException e) { - return null; - } - } -} diff --git a/app/src/main/java/at/bitfire/davdroid/ui/setup/AccountDetailsFragment.java b/app/src/main/java/at/bitfire/davdroid/ui/setup/AccountDetailsFragment.java deleted file mode 100644 index 3d7a678f..00000000 --- a/app/src/main/java/at/bitfire/davdroid/ui/setup/AccountDetailsFragment.java +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Copyright © 2013 – 2015 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.setup; - -import android.accounts.Account; -import android.accounts.AccountManager; -import android.app.Fragment; -import android.content.ContentProviderClient; -import android.content.ContentResolver; -import android.content.ContentValues; -import android.os.Bundle; -import android.provider.CalendarContract; -import android.provider.ContactsContract; -import android.text.Editable; -import android.text.TextWatcher; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.EditText; -import android.widget.TextView; -import android.widget.Toast; - -import at.bitfire.davdroid.Constants; -import at.bitfire.davdroid.R; -import at.bitfire.davdroid.resource.LocalAddressBook; -import at.bitfire.davdroid.resource.LocalCalendar; -import at.bitfire.davdroid.resource.LocalTaskList; -import at.bitfire.davdroid.resource.ServerInfo; -import at.bitfire.davdroid.syncadapter.AccountSettings; -import at.bitfire.ical4android.CalendarStorageException; -import at.bitfire.ical4android.TaskProvider; -import at.bitfire.vcard4android.ContactsStorageException; -import lombok.Cleanup; - -public class AccountDetailsFragment extends Fragment implements TextWatcher { - public static final String TAG = "davdroid.AccountDetails"; - - ServerInfo serverInfo; - - EditText editAccountName; - - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View v = inflater.inflate(R.layout.setup_account_details, container, false); - - serverInfo = ((AddAccountActivity)getActivity()).serverInfo; - - editAccountName = (EditText)v.findViewById(R.id.account_name); - editAccountName.addTextChangedListener(this); - editAccountName.setText(serverInfo.getUserName()); - - TextView textAccountNameInfo = (TextView)v.findViewById(R.id.account_name_info); - if (!serverInfo.hasEnabledCalendars()) - textAccountNameInfo.setVisibility(View.GONE); - - setHasOptionsMenu(true); - return v; - } - - - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - inflater.inflate(R.menu.setup_account_details, menu); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.add_account: - addAccount(); - break; - default: - return false; - } - return true; - } - - - // actions - - @SuppressWarnings("Recycle") - void addAccount() { - String accountName = editAccountName.getText().toString(); - - AccountManager accountManager = AccountManager.get(getActivity()); - Account account = new Account(accountName, Constants.ACCOUNT_TYPE); - Bundle userData = AccountSettings.createBundle(serverInfo); - - if (accountManager.addAccountExplicitly(account, serverInfo.getPassword(), userData)) { - addSync(account, ContactsContract.AUTHORITY, serverInfo.getAddressBooks(), new AddSyncCallback() { - @Override - public void createLocalCollection(Account account, ServerInfo.ResourceInfo resource) throws ContactsStorageException { - @Cleanup("release") ContentProviderClient provider = getActivity().getContentResolver().acquireContentProviderClient(ContactsContract.AUTHORITY); - if (provider != null) { - LocalAddressBook addressBook = new LocalAddressBook(account, provider); - - // set URL - addressBook.setURL(resource.getUrl()); - - // set Settings - ContentValues settings = new ContentValues(2); - settings.put(ContactsContract.Settings.SHOULD_SYNC, 1); - settings.put(ContactsContract.Settings.UNGROUPED_VISIBLE, 1); - addressBook.updateSettings(settings); - } else - Constants.log.error("Couldn't access Contacts Provider"); - } - }); - - addSync(account, CalendarContract.AUTHORITY, serverInfo.getCalendars(), new AddSyncCallback() { - @Override - public void createLocalCollection(Account account, ServerInfo.ResourceInfo calendar) { - try { - LocalCalendar.create(account, getActivity().getContentResolver(), calendar); - } catch(CalendarStorageException e) { - Constants.log.error("Couldn't create local calendar", e); - } - } - }); - - addSync(account, TaskProvider.ProviderName.OpenTasks.authority, serverInfo.getTaskLists(), new AddSyncCallback() { - @Override - public void createLocalCollection(Account account, ServerInfo.ResourceInfo todoList) { - try { - LocalTaskList.create(account, getActivity().getContentResolver(), todoList); - } catch (CalendarStorageException e) { - Constants.log.error("Couldn't create local task list", e); - } - } - }); - - getActivity().finish(); - } else - Toast.makeText(getActivity(), "Couldn't create account (account with this name already existing?)", Toast.LENGTH_LONG).show(); - } - - protected interface AddSyncCallback { - void createLocalCollection(Account account, ServerInfo.ResourceInfo resource) throws ContactsStorageException; - } - - protected void addSync(Account account, String authority, ServerInfo.ResourceInfo[] resourceList, AddSyncCallback callback) { - boolean sync = false; - for (ServerInfo.ResourceInfo resource : resourceList) - if (resource.isEnabled()) { - sync = true; - if (callback != null) - try { - callback.createLocalCollection(account, resource); - } catch(ContactsStorageException e) { - Log.e(TAG, "Couldn't add sync collection", e); - Toast.makeText(getActivity(), "Couldn't set up synchronization for " + authority, Toast.LENGTH_LONG).show(); - } - } - if (sync) { - ContentResolver.setIsSyncable(account, authority, 1); - ContentResolver.setSyncAutomatically(account, authority, true); - } else - ContentResolver.setIsSyncable(account, authority, 0); - } - - - // input validation - - @Override - public void onPrepareOptionsMenu(Menu menu) { - boolean ok = editAccountName.getText().length() > 0; - MenuItem item = menu.findItem(R.id.add_account); - item.setEnabled(ok); - } - - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - getActivity().invalidateOptionsMenu(); - } - - @Override - public void afterTextChanged(Editable s) { - } -} diff --git a/app/src/main/java/at/bitfire/davdroid/ui/setup/AddAccountActivity.java b/app/src/main/java/at/bitfire/davdroid/ui/setup/AddAccountActivity.java deleted file mode 100644 index 23934f9a..00000000 --- a/app/src/main/java/at/bitfire/davdroid/ui/setup/AddAccountActivity.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright © 2013 – 2015 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.setup; - -import android.app.Activity; -import android.content.Intent; -import android.net.Uri; -import android.os.Bundle; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; - -import at.bitfire.davdroid.Constants; -import at.bitfire.davdroid.R; -import at.bitfire.davdroid.resource.ServerInfo; - -public class AddAccountActivity extends Activity { - final private static String KEY_SERVER_INFO = "serverInfo"; - - protected ServerInfo serverInfo; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - if (savedInstanceState != null) - serverInfo = (ServerInfo)savedInstanceState.getSerializable(KEY_SERVER_INFO); - - setContentView(R.layout.setup_add_account); - - if (savedInstanceState == null) { // first call - getFragmentManager().beginTransaction() - .add(R.id.right_pane, new LoginTypeFragment()) - .commit(); - } - } - - @Override - protected void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - outState.putSerializable(KEY_SERVER_INFO, serverInfo); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.setup_add_account, menu); - return true; - } - - public void showHelp(MenuItem item) { - startActivityForResult(new Intent(Intent.ACTION_VIEW, Constants.webUri.buildUpon().appendEncodedPath("configuration/").build()), 0); - } - -} diff --git a/app/src/main/java/at/bitfire/davdroid/ui/setup/InstallAppsFragment.java b/app/src/main/java/at/bitfire/davdroid/ui/setup/InstallAppsFragment.java deleted file mode 100644 index 423fc353..00000000 --- a/app/src/main/java/at/bitfire/davdroid/ui/setup/InstallAppsFragment.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright © 2013 – 2015 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.setup; - -import android.app.Fragment; -import android.os.Bundle; -import android.text.Html; -import android.text.method.LinkMovementMethod; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import at.bitfire.davdroid.R; - -public class InstallAppsFragment extends Fragment { - // https://code.google.com/p/android/issues/detail?id=25906 - - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View v = inflater.inflate(R.layout.setup_install_apps, container, false); - setHasOptionsMenu(true); - - TextView tvInfo = (TextView)v.findViewById(R.id.setup_install_tasks_app); - tvInfo.setText(Html.fromHtml(getString(R.string.setup_install_tasks_app_html))); - tvInfo.setMovementMethod(LinkMovementMethod.getInstance()); - - return v; - } - - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - inflater.inflate(R.menu.only_skip, menu); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.skip: - skip(); - break; - default: - return false; - } - return true; - } - - protected void skip() { - getFragmentManager().beginTransaction() - .replace(R.id.right_pane, new SelectCollectionsFragment()) - .addToBackStack(null) - .commit(); - } - -} diff --git a/app/src/main/java/at/bitfire/davdroid/ui/setup/LoginEmailFragment.java b/app/src/main/java/at/bitfire/davdroid/ui/setup/LoginEmailFragment.java deleted file mode 100644 index da3e0621..00000000 --- a/app/src/main/java/at/bitfire/davdroid/ui/setup/LoginEmailFragment.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright © 2013 – 2015 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.setup; - -import android.app.DialogFragment; -import android.app.Fragment; -import android.content.Context; -import android.os.Bundle; -import android.text.Editable; -import android.text.TextWatcher; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.view.inputmethod.InputMethodManager; -import android.widget.EditText; - -import java.net.URI; -import java.net.URISyntaxException; - -import at.bitfire.davdroid.Constants; -import at.bitfire.davdroid.R; -import at.bitfire.davdroid.resource.ServerInfo; - -public class LoginEmailFragment extends Fragment implements TextWatcher { - - protected EditText editEmail, editPassword; - - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View v = inflater.inflate(R.layout.setup_login_email, container, false); - - editEmail = (EditText)v.findViewById(R.id.email_address); - editEmail.addTextChangedListener(this); - - editPassword = (EditText)v.findViewById(R.id.password); - editPassword.addTextChangedListener(this); - - setHasOptionsMenu(true); - return v; - } - - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - inflater.inflate(R.menu.only_next, menu); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.next: - try { - String email = editEmail.getText().toString(); - Bundle args = new Bundle(); - args.putSerializable(QueryServerDialogFragment.KEY_SERVER_INFO, new ServerInfo( - new URI("mailto:" + email), - email, - editPassword.getText().toString(), - true - )); - - DialogFragment dialog = new QueryServerDialogFragment(); - dialog.setArguments(args); - dialog.show(getFragmentManager(), QueryServerDialogFragment.class.getName()); - } catch (URISyntaxException e) { - Constants.log.debug("Invalid email address", e); - } - break; - default: - return false; - } - return true; - } - - @Override - public void onResume() { - super.onResume(); - // set focus and show soft keyboard - if (editEmail.requestFocus()) { - InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); - imm.showSoftInput(editEmail, InputMethodManager.SHOW_IMPLICIT); - } - } - - - // input validation - - @Override - public void onPrepareOptionsMenu(Menu menu) { - boolean emailOk = false, - passwordOk = editPassword.getText().length() > 0; - - String email = editEmail.getText().toString(); - try { - URI uri = new URI("mailto:" + email); - if (uri.isOpaque()) { - int pos = email.lastIndexOf("@"); - if (pos != -1) - emailOk = !email.substring(pos + 1).isEmpty(); - } - } catch (URISyntaxException e) { - // invalid mailto: URI - } - - MenuItem item = menu.findItem(R.id.next); - item.setEnabled(emailOk && passwordOk); - } - - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - getActivity().invalidateOptionsMenu(); - } - - @Override - public void afterTextChanged(Editable s) { - } - -} diff --git a/app/src/main/java/at/bitfire/davdroid/ui/setup/LoginTypeFragment.java b/app/src/main/java/at/bitfire/davdroid/ui/setup/LoginTypeFragment.java deleted file mode 100644 index 0945321b..00000000 --- a/app/src/main/java/at/bitfire/davdroid/ui/setup/LoginTypeFragment.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright © 2013 – 2015 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.setup; - -import android.app.Fragment; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.RadioButton; - -import at.bitfire.davdroid.R; - -public class LoginTypeFragment extends Fragment { - - protected RadioButton btnTypeEmail; - - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View v = inflater.inflate(R.layout.setup_login_type, container, false); - - btnTypeEmail = (RadioButton)v.findViewById(R.id.login_type_email); - - setHasOptionsMenu(true); - - return v; - } - - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - inflater.inflate(R.menu.only_next, menu); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.next: - Fragment loginFragment = btnTypeEmail.isChecked() ? new LoginEmailFragment() : new LoginURLFragment(); - getFragmentManager().beginTransaction() - .replace(R.id.right_pane, loginFragment) - .addToBackStack(null) - .commitAllowingStateLoss(); - return true; - default: - return false; - } - } -} diff --git a/app/src/main/java/at/bitfire/davdroid/ui/setup/LoginURLFragment.java b/app/src/main/java/at/bitfire/davdroid/ui/setup/LoginURLFragment.java deleted file mode 100644 index 348a4513..00000000 --- a/app/src/main/java/at/bitfire/davdroid/ui/setup/LoginURLFragment.java +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright © 2013 – 2015 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.setup; - -import android.app.Activity; -import android.app.DialogFragment; -import android.app.Fragment; -import android.content.Context; -import android.os.Bundle; -import android.text.Editable; -import android.text.TextUtils; -import android.text.TextWatcher; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.view.inputmethod.InputMethodManager; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemSelectedListener; -import android.widget.CheckBox; -import android.widget.EditText; -import android.widget.Spinner; -import android.widget.TextView; - -import java.net.URI; -import java.net.URISyntaxException; - -import at.bitfire.davdroid.Constants; -import at.bitfire.davdroid.R; -import at.bitfire.davdroid.resource.ServerInfo; - -public class LoginURLFragment extends Fragment implements TextWatcher { - - protected Spinner spnrScheme; - protected TextView textHttpWarning; - protected EditText editBaseURI, editUserName, editPassword; - protected CheckBox checkboxPreemptive; - - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View v = inflater.inflate(R.layout.setup_login_url, container, false); - - // protocol selection spinner - textHttpWarning = (TextView)v.findViewById(R.id.http_warning); - - spnrScheme = (Spinner)v.findViewById(R.id.login_scheme); - spnrScheme.setOnItemSelectedListener(new OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - String scheme = parent.getAdapter().getItem(position).toString(); - textHttpWarning.setVisibility(scheme.equals("https://") ? View.GONE : View.VISIBLE); - } - - @Override - public void onNothingSelected(AdapterView parent) { - } - }); - spnrScheme.setSelection(1); // HTTPS - - // other input fields - editBaseURI = (EditText)v.findViewById(R.id.login_host_path); - editBaseURI.addTextChangedListener(this); - - editUserName = (EditText)v.findViewById(R.id.userName); - editUserName.addTextChangedListener(this); - - editPassword = (EditText)v.findViewById(R.id.password); - editPassword.addTextChangedListener(this); - - checkboxPreemptive = (CheckBox)v.findViewById(R.id.auth_preemptive); - - // hook into action bar - setHasOptionsMenu(true); - - return v; - } - - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - inflater.inflate(R.menu.only_next, menu); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.next: - try { - ServerInfo serverInfo = new ServerInfo( - getBaseURI(), - editUserName.getText().toString(), - editPassword.getText().toString(), - checkboxPreemptive.isChecked() - ); - Bundle args = new Bundle(); - args.putSerializable(QueryServerDialogFragment.KEY_SERVER_INFO, serverInfo); - DialogFragment dialog = new QueryServerDialogFragment(); - dialog.setArguments(args); - dialog.show(getFragmentManager(), null); - } catch (URISyntaxException e) { - Constants.log.debug("Invalid URI", e); - } - break; - default: - return false; - } - return true; - } - - @Override - public void onResume() { - super.onResume(); - // set focus and show soft keyboard - if (editBaseURI.requestFocus()) { - InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); - imm.showSoftInput(editBaseURI, InputMethodManager.SHOW_IMPLICIT); - } - } - - - private URI getBaseURI() throws URISyntaxException { - String scheme = spnrScheme.getSelectedItem().toString(), - host_path = editBaseURI.getText().toString(); - return new URI(scheme + host_path); - } - - - // input validation - - @Override - public void onPrepareOptionsMenu(Menu menu) { - boolean usernameOk = editUserName.getText().length() > 0, - passwordOk = editPassword.getText().length() > 0, - urlOk = false; - - // check host name - try { - if (!TextUtils.isEmpty(getBaseURI().getHost())) - urlOk = true; - } catch (Exception e) { - } - - MenuItem item = menu.findItem(R.id.next); - item.setEnabled(usernameOk && passwordOk && urlOk); - } - - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - Activity activity = getActivity(); - if (activity != null) - activity.invalidateOptionsMenu(); - } - - @Override - public void afterTextChanged(Editable s) { - } -} diff --git a/app/src/main/java/at/bitfire/davdroid/ui/setup/QueryServerDialogFragment.java b/app/src/main/java/at/bitfire/davdroid/ui/setup/QueryServerDialogFragment.java deleted file mode 100644 index 2c17207e..00000000 --- a/app/src/main/java/at/bitfire/davdroid/ui/setup/QueryServerDialogFragment.java +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Copyright © 2013 – 2015 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.setup; - -import android.annotation.SuppressLint; -import android.app.AlertDialog; -import android.app.Dialog; -import android.app.DialogFragment; -import android.app.Fragment; -import android.app.LoaderManager.LoaderCallbacks; -import android.app.ProgressDialog; -import android.content.AsyncTaskLoader; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.Loader; -import android.os.Bundle; -import android.view.WindowManager; -import android.view.inputmethod.InputMethodManager; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.StringReader; - -import at.bitfire.davdroid.Constants; -import at.bitfire.davdroid.R; -import at.bitfire.davdroid.log.StringLogger; -import at.bitfire.davdroid.resource.DavResourceFinder; -import at.bitfire.davdroid.resource.LocalTaskList; -import at.bitfire.davdroid.resource.ServerInfo; -import at.bitfire.davdroid.ui.DebugInfoActivity; -import lombok.Cleanup; - -public class QueryServerDialogFragment extends DialogFragment implements LoaderCallbacks { - public static final String KEY_SERVER_INFO = "server_info"; - - public static QueryServerDialogFragment newInstance(ServerInfo serverInfo) { - Bundle args = new Bundle(); - args.putSerializable(KEY_SERVER_INFO, serverInfo); - QueryServerDialogFragment fragment = new QueryServerDialogFragment(); - fragment.setArguments(args); - return fragment; - } - - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - ProgressDialog dialog = new ProgressDialog(getActivity()); - dialog.setCanceledOnTouchOutside(false); - setCancelable(false); - - dialog.setTitle(R.string.setup_resource_detection); - dialog.setIndeterminate(true); - dialog.setMessage(getString(R.string.setup_querying_server)); - return dialog; - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - Loader loader = getLoaderManager().initLoader(0, getArguments(), this); - } - - @Override - public Loader onCreateLoader(int id, Bundle args) { - return new ServerInfoLoader(getActivity(), args); - } - - @Override - @SuppressLint("CommitTransaction") - public void onLoadFinished(Loader loader, ServerInfo serverInfo) { - if (serverInfo.isEmpty()) { - // resource detection didn't find anything - getFragmentManager().beginTransaction() - .add(NothingDetectedFragment.newInstance(serverInfo.getLogs()), null) - .commitAllowingStateLoss(); - - } else { - ((AddAccountActivity)getActivity()).serverInfo = serverInfo; - - // resource detection brought some results - Fragment nextFragment; - if (serverInfo.getTaskLists().length > 0 && !LocalTaskList.tasksProviderAvailable(getActivity().getContentResolver())) - nextFragment = new InstallAppsFragment(); - else - nextFragment = new SelectCollectionsFragment(); - - getFragmentManager().beginTransaction() - .replace(R.id.right_pane, nextFragment) - .addToBackStack(null) - .commitAllowingStateLoss(); - } - - getDialog().dismiss(); - } - - @Override - public void onLoaderReset(Loader arg0) { - } - - - public static class NothingDetectedFragment extends DialogFragment { - private static String KEY_LOGS = "logs"; - - public static NothingDetectedFragment newInstance(String logs) { - Bundle args = new Bundle(); - args.putString(KEY_LOGS, logs); - NothingDetectedFragment fragment = new NothingDetectedFragment(); - fragment.setArguments(args); - return fragment; - } - - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - return new AlertDialog.Builder(getActivity()) - .setTitle(R.string.setup_resource_detection) - .setIcon(android.R.drawable.ic_dialog_info) - .setMessage(R.string.setup_no_collections_found) - .setNeutralButton(R.string.setup_view_logs, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - Intent intent = new Intent(getActivity(), DebugInfoActivity.class); - intent.putExtra(DebugInfoActivity.KEY_LOGS, getArguments().getString(KEY_LOGS)); - startActivity(intent); - } - }) - .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - // dismiss - } - }) - .create(); - } - } - - static class ServerInfoLoader extends AsyncTaskLoader { - private static final String TAG = "davdroid.ServerInfoLoader"; - final Bundle args; - final Context context; - - public ServerInfoLoader(Context context, Bundle args) { - super(context); - this.context = context; - this.args = args; - } - - @Override - protected void onStartLoading() { - forceLoad(); - } - - @Override - public ServerInfo loadInBackground() { - ServerInfo serverInfo = (ServerInfo)args.getSerializable(KEY_SERVER_INFO); - - StringLogger logger = new StringLogger("DavResourceFinder", true); - DavResourceFinder finder = new DavResourceFinder(logger, context, serverInfo); - finder.findResources(); - - // duplicate logs to ADB - String logs = logger.toString(); - try { - @Cleanup BufferedReader logStream = new BufferedReader(new StringReader(logs)); - Constants.log.info("Successful resource detection:"); - String line; - while ((line = logStream.readLine()) != null) - Constants.log.debug(line); - } catch (IOException e) { - Constants.log.error("Couldn't read resource detection logs", e); - } - - serverInfo.setLogs(logger.toString()); - - return serverInfo; - } - } - -} diff --git a/app/src/main/java/at/bitfire/davdroid/ui/setup/SelectCollectionsAdapter.java b/app/src/main/java/at/bitfire/davdroid/ui/setup/SelectCollectionsAdapter.java deleted file mode 100644 index 3187ed59..00000000 --- a/app/src/main/java/at/bitfire/davdroid/ui/setup/SelectCollectionsAdapter.java +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright © 2013 – 2015 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.setup; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.text.Html; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.CheckedTextView; -import android.widget.ListAdapter; - -import at.bitfire.davdroid.R; -import at.bitfire.davdroid.resource.LocalTaskList; -import at.bitfire.davdroid.resource.ServerInfo; -import lombok.Getter; - -/** - * Order of display: - * - * number of rows type - * nAddressBookHeadings (0 or 1) heading: "address books" - * nAddressBooks address book info - * nCalendarHeadings (0 or 1) heading: "calendars" - * nCalendars calendar info - * nNotebookHeadings (0 or 1) heading: "notebooks" - * nNotebooks notebook info - * nTaskListHeadings (0 or 1) heading: "task lists" - * nTaskLists task list info - */ -public class SelectCollectionsAdapter extends BaseAdapter implements ListAdapter { - final static int - TYPE_ADDRESS_BOOKS_HEADING = 0, - TYPE_ADDRESS_BOOKS_ROW = 1, - TYPE_CALENDARS_HEADING = 2, - TYPE_CALENDARS_ROW = 3, - TYPE_TASK_LISTS_HEADING = 4, - TYPE_TASK_LISTS_ROW = 5; - - final protected Context context; - final protected ServerInfo serverInfo; - @Getter protected int - nAddressBooks, nAddressBookHeadings, - nCalendars, nCalendarHeadings, - nTaskLists, nTaskListHeadings; - - - public SelectCollectionsAdapter(Context context, ServerInfo serverInfo) { - this.context = context; - - this.serverInfo = serverInfo; - nAddressBooks = serverInfo.getAddressBooks().length; - nAddressBookHeadings = nAddressBooks == 0 ? 0 : 1; - nCalendars = serverInfo.getCalendars().length; - nCalendarHeadings = nCalendars == 0 ? 0 : 1; - nTaskLists = serverInfo.getTaskLists().length; - nTaskListHeadings = nTaskLists == 0 ? 0 : 1; - } - - - // item data - - @Override - public int getCount() { - return nAddressBookHeadings + nAddressBooks + nCalendarHeadings + nCalendars + nTaskListHeadings + nTaskLists; - } - - @Override - public Object getItem(int position) { - if (position >= nAddressBookHeadings && - position < (nAddressBookHeadings + nAddressBooks)) - return serverInfo.getAddressBooks()[position - nAddressBookHeadings]; - - else if (position >= (nAddressBookHeadings + nAddressBooks + nCalendarHeadings) && - (position < (nAddressBookHeadings + nAddressBooks + nCalendarHeadings + nCalendars))) - return serverInfo.getCalendars()[position - (nAddressBookHeadings + nAddressBooks + nCalendarHeadings)]; - - else if (position >= (nAddressBookHeadings + nAddressBooks + nCalendarHeadings + nCalendars + nTaskListHeadings) && - (position < (nAddressBookHeadings + nAddressBooks + nCalendarHeadings + nCalendars + nTaskListHeadings + nTaskLists))) - return serverInfo.getTaskLists()[position - (nAddressBookHeadings + nAddressBooks + nCalendarHeadings + nCalendars + nTaskListHeadings)]; - - return null; - } - - @Override - public boolean hasStableIds() { - return true; - } - - @Override - public long getItemId(int position) { - return position; - } - - - // item views - - @Override - public int getViewTypeCount() { - return TYPE_TASK_LISTS_ROW + 1; - } - - @Override - public int getItemViewType(int position) { - if ((nAddressBookHeadings != 0) && (position == 0)) - return TYPE_ADDRESS_BOOKS_HEADING; - else if ((nAddressBooks != 0) && (position > 0) && (position < nAddressBookHeadings + nAddressBooks)) - return TYPE_ADDRESS_BOOKS_ROW; - - else if ((nCalendarHeadings != 0) && (position == nAddressBookHeadings + nAddressBooks)) - return TYPE_CALENDARS_HEADING; - else if ((nCalendars != 0) && (position > nAddressBookHeadings + nAddressBooks) && (position < nAddressBookHeadings + nAddressBooks + nCalendarHeadings + nCalendars)) - return TYPE_CALENDARS_ROW; - - else if ((nTaskListHeadings != 0) && (position == nAddressBookHeadings + nAddressBooks + nCalendarHeadings + nCalendars)) - return TYPE_TASK_LISTS_HEADING; - else if ((nTaskLists != 0) && (position > nAddressBookHeadings + nAddressBooks + nCalendarHeadings + nCalendars) && (position < nAddressBookHeadings + nAddressBooks + nCalendarHeadings + nCalendars + nTaskListHeadings + nTaskLists)) - return TYPE_TASK_LISTS_ROW; - - else - return IGNORE_ITEM_VIEW_TYPE; - } - - @Override - @SuppressLint("InflateParams") - public View getView(int position, View convertView, ViewGroup parent) { - View v = convertView; - - int viewType = getItemViewType(position); - - // step 1: get view (either by creating or recycling) - if (v == null) { - LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - switch (viewType) { - case TYPE_ADDRESS_BOOKS_HEADING: - v = inflater.inflate(R.layout.setup_address_books_heading, parent, false); - break; - case TYPE_ADDRESS_BOOKS_ROW: - v = inflater.inflate(android.R.layout.simple_list_item_single_choice, null); - v.setPadding(0, 8, 0, 8); - break; - case TYPE_CALENDARS_HEADING: - v = inflater.inflate(R.layout.setup_calendars_heading, parent, false); - break; - case TYPE_TASK_LISTS_HEADING: - v = inflater.inflate(R.layout.setup_task_lists_heading, parent, false); - break; - case TYPE_CALENDARS_ROW: - case TYPE_TASK_LISTS_ROW: - v = inflater.inflate(android.R.layout.simple_list_item_multiple_choice, null); - v.setPadding(0, 8, 0, 8); - } - } - - // step 2: fill view with content - switch (viewType) { - case TYPE_ADDRESS_BOOKS_ROW: - setContent((CheckedTextView)v, R.drawable.addressbook, (ServerInfo.ResourceInfo)getItem(position)); - break; - case TYPE_CALENDARS_ROW: - setContent((CheckedTextView)v, R.drawable.calendar, (ServerInfo.ResourceInfo)getItem(position)); - break; - case TYPE_TASK_LISTS_ROW: - setContent((CheckedTextView)v, R.drawable.tasks, (ServerInfo.ResourceInfo)getItem(position)); - } - - // disable task list selection if there's no local task provider - if (viewType == TYPE_TASK_LISTS_ROW && !LocalTaskList.tasksProviderAvailable(context.getContentResolver())) { - final CheckedTextView check = (CheckedTextView)v; - check.setEnabled(false); - check.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - check.setChecked(false); - } - }); - } - - return v; - } - - protected void setContent(CheckedTextView view, int collectionIcon, ServerInfo.ResourceInfo info) { - // set layout and icons - view.setCompoundDrawablesWithIntrinsicBounds(collectionIcon, 0, info.isReadOnly() ? R.drawable.ic_read_only : 0, 0); - view.setCompoundDrawablePadding(10); - - // set text - String title = "" + info.getTitle() + ""; - if (info.isReadOnly()) - title = title + " (" + context.getString(R.string.setup_read_only) + ")"; - - String description = info.getDescription(); - if (description == null) - description = info.getUrl(); - - // FIXME escape HTML - view.setText(Html.fromHtml(title + "
" + description)); - } - - @Override - public boolean areAllItemsEnabled() { - return false; - } - - @Override - public boolean isEnabled(int position) { - int type = getItemViewType(position); - return (type == TYPE_ADDRESS_BOOKS_ROW || type == TYPE_CALENDARS_ROW || type == TYPE_TASK_LISTS_ROW); - } -} diff --git a/app/src/main/java/at/bitfire/davdroid/ui/setup/SelectCollectionsFragment.java b/app/src/main/java/at/bitfire/davdroid/ui/setup/SelectCollectionsFragment.java deleted file mode 100644 index 85a439cb..00000000 --- a/app/src/main/java/at/bitfire/davdroid/ui/setup/SelectCollectionsFragment.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright © 2013 – 2015 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.setup; - -import android.app.ListFragment; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemClickListener; -import android.widget.ListAdapter; -import android.widget.ListView; - -import at.bitfire.davdroid.R; -import at.bitfire.davdroid.resource.ServerInfo; - -public class SelectCollectionsFragment extends ListFragment { - - protected ServerInfo serverInfo; - - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - serverInfo = ((AddAccountActivity)getActivity()).serverInfo; - - View v = super.onCreateView(inflater, container, savedInstanceState); - setHasOptionsMenu(true); - - return v; - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - setListAdapter(null); - } - - @Override - public void onViewCreated(View view, Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - - final ListView listView = getListView(); - listView.setPadding(20, 30, 20, 30); - - View header = getActivity().getLayoutInflater().inflate(R.layout.setup_select_collections_header, getListView(), false); - listView.addHeaderView(header, getListView(), false); - - final SelectCollectionsAdapter adapter = new SelectCollectionsAdapter(view.getContext(), serverInfo); - setListAdapter(adapter); - - listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); - listView.setOnItemClickListener(new OnItemClickListener() { - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - int itemPosition = position - 1; // one list header view at pos. 0 - if (adapter.getItemViewType(itemPosition) == SelectCollectionsAdapter.TYPE_ADDRESS_BOOKS_ROW) { - // unselect all other address books - for (int pos = 1; pos <= adapter.getNAddressBooks(); pos++) - if (pos != itemPosition) - listView.setItemChecked(pos + 1, false); - } - - getActivity().invalidateOptionsMenu(); - } - }); - } - - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - inflater.inflate(R.menu.only_next, menu); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.next: - // synchronize only selected collections - for (ServerInfo.ResourceInfo addressBook : serverInfo.getAddressBooks()) - addressBook.setEnabled(false); - for (ServerInfo.ResourceInfo calendar : serverInfo.getCalendars()) - calendar.setEnabled(false); - for (ServerInfo.ResourceInfo todoList : serverInfo.getTaskLists()) - todoList.setEnabled(false); - - ListAdapter adapter = getListView().getAdapter(); - for (long id : getListView().getCheckedItemIds()) { - int position = (int)id + 1; // +1 because header view is inserted at pos. 0 - ServerInfo.ResourceInfo info = (ServerInfo.ResourceInfo)adapter.getItem(position); - info.setEnabled(true); - } - - getFragmentManager().beginTransaction() - .replace(R.id.right_pane, new AccountDetailsFragment()) - .addToBackStack(null) - .commitAllowingStateLoss(); - break; - default: - return false; - } - return true; - } - - - // input validation - - @Override - public void onPrepareOptionsMenu(Menu menu) { - boolean ok = false; - try { - ok = getListView().getCheckedItemCount() > 0; - } catch (IllegalStateException e) { - } - MenuItem item = menu.findItem(R.id.next); - item.setEnabled(ok); - } -} diff --git a/app/src/main/res/color/buttontext.xml b/app/src/main/res/color/buttontext.xml new file mode 100644 index 00000000..1ec931b0 --- /dev/null +++ b/app/src/main/res/color/buttontext.xml @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-nodpi/gletschersee.jpg b/app/src/main/res/drawable-nodpi/gletschersee.jpg new file mode 100644 index 0000000000000000000000000000000000000000..04e9aaf3ed64beacf0ee3590b39614ed9b3025a0 GIT binary patch literal 70680 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 X3}TaFpy<7hnS|g}*Q6_D_-Fsw*}gQ2 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_add_light.xml b/app/src/main/res/drawable/ic_add_light.xml new file mode 100644 index 00000000..c9fd7462 --- /dev/null +++ b/app/src/main/res/drawable/ic_add_light.xml @@ -0,0 +1,17 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_attach_money_dark.xml b/app/src/main/res/drawable/ic_attach_money_dark.xml new file mode 100644 index 00000000..9db797f0 --- /dev/null +++ b/app/src/main/res/drawable/ic_attach_money_dark.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_home_dark.xml b/app/src/main/res/drawable/ic_home_dark.xml new file mode 100644 index 00000000..2452758f --- /dev/null +++ b/app/src/main/res/drawable/ic_home_dark.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_info_dark.xml b/app/src/main/res/drawable/ic_info_dark.xml new file mode 100644 index 00000000..814d75df --- /dev/null +++ b/app/src/main/res/drawable/ic_info_dark.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_settings_dark.xml b/app/src/main/res/drawable/ic_settings_dark.xml new file mode 100644 index 00000000..a270cf87 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings_dark.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_visibility_dark.xml b/app/src/main/res/drawable/ic_visibility_dark.xml new file mode 100644 index 00000000..def11add --- /dev/null +++ b/app/src/main/res/drawable/ic_visibility_dark.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_visibility_off_dark.xml b/app/src/main/res/drawable/ic_visibility_off_dark.xml new file mode 100644 index 00000000..a73d6154 --- /dev/null +++ b/app/src/main/res/drawable/ic_visibility_off_dark.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/password_eye_button.xml b/app/src/main/res/drawable/password_eye_button.xml new file mode 100644 index 00000000..24e23ca7 --- /dev/null +++ b/app/src/main/res/drawable/password_eye_button.xml @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/side_nav_bar.xml b/app/src/main/res/drawable/side_nav_bar.xml new file mode 100644 index 00000000..e99a6188 --- /dev/null +++ b/app/src/main/res/drawable/side_nav_bar.xml @@ -0,0 +1,17 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-large/content_accounts.xml b/app/src/main/res/layout-large/content_accounts.xml new file mode 100644 index 00000000..10290a32 --- /dev/null +++ b/app/src/main/res/layout-large/content_accounts.xml @@ -0,0 +1,23 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-sw720dp/settings_activity.xml b/app/src/main/res/layout-sw720dp/settings_activity.xml index d1f63173..092203f6 100644 --- a/app/src/main/res/layout-sw720dp/settings_activity.xml +++ b/app/src/main/res/layout-sw720dp/settings_activity.xml @@ -14,7 +14,7 @@ android:layout_height="match_parent"> diff --git a/app/src/main/res/layout/account_list.xml b/app/src/main/res/layout/account_list.xml new file mode 100644 index 00000000..c31d6015 --- /dev/null +++ b/app/src/main/res/layout/account_list.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/account_list_item.xml b/app/src/main/res/layout/account_list_item.xml new file mode 100644 index 00000000..24f58c9e --- /dev/null +++ b/app/src/main/res/layout/account_list_item.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_accounts.xml b/app/src/main/res/layout/activity_accounts.xml new file mode 100644 index 00000000..1c0d86ad --- /dev/null +++ b/app/src/main/res/layout/activity_accounts.xml @@ -0,0 +1,34 @@ + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_add_account.xml b/app/src/main/res/layout/activity_add_account.xml new file mode 100644 index 00000000..1faf72a1 --- /dev/null +++ b/app/src/main/res/layout/activity_add_account.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +