at.bitfire.davdroid.ui.CreateAddressBookActivity.java Source code

Java tutorial

Introduction

Here is the source code for at.bitfire.davdroid.ui.CreateAddressBookActivity.java

Source

/*
 * 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.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v4.app.LoaderManager;
import android.support.v4.app.NavUtils;
import android.support.v4.content.AsyncTaskLoader;
import android.support.v4.content.Loader;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Spinner;

import org.apache.commons.lang3.StringUtils;

import java.util.LinkedList;
import java.util.List;
import java.util.UUID;

import at.bitfire.davdroid.R;
import at.bitfire.davdroid.model.CollectionInfo;
import at.bitfire.davdroid.model.ServiceDB;
import lombok.Cleanup;
import okhttp3.HttpUrl;

public class CreateAddressBookActivity extends AppCompatActivity
        implements LoaderManager.LoaderCallbacks<CreateAddressBookActivity.AccountInfo> {
    public static final String EXTRA_ACCOUNT = "account";

    protected Account account;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        account = getIntent().getParcelableExtra(EXTRA_ACCOUNT);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        setContentView(R.layout.activity_create_address_book);

        getSupportLoaderManager().initLoader(0, getIntent().getExtras(), this);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_create_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 onCreateCollection(MenuItem item) {
        boolean ok = true;
        CollectionInfo info = new CollectionInfo();

        Spinner spinner = (Spinner) findViewById(R.id.home_sets);
        String homeSet = (String) spinner.getSelectedItem();

        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());

        if (ok) {
            info.type = CollectionInfo.Type.ADDRESS_BOOK;
            info.url = HttpUrl.parse(homeSet).resolve(UUID.randomUUID().toString() + "/").toString();
            CreateCollectionFragment.newInstance(account, info).show(getSupportFragmentManager(), null);
        }
    }

    @Override
    public Loader<AccountInfo> onCreateLoader(int id, Bundle args) {
        return new AccountInfoLoader(this, account);
    }

    @Override
    public void onLoadFinished(Loader<AccountInfo> loader, AccountInfo info) {
        if (info != null) {
            Spinner spinner = (Spinner) findViewById(R.id.home_sets);
            spinner.setAdapter(
                    new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, info.homeSets));
        }
    }

    @Override
    public void onLoaderReset(Loader<AccountInfo> loader) {
    }

    protected static class AccountInfo {
        List<String> homeSets = new LinkedList<>();
    }

    protected static class AccountInfoLoader extends AsyncTaskLoader<AccountInfo> {
        private final Account account;
        private final ServiceDB.OpenHelper dbHelper;

        public AccountInfoLoader(Context context, Account account) {
            super(context);
            this.account = account;
            dbHelper = new ServiceDB.OpenHelper(context);
        }

        @Override
        protected void onStartLoading() {
            forceLoad();
        }

        @Override
        public AccountInfo loadInBackground() {
            final AccountInfo info = new AccountInfo();

            // find DAV service and home sets
            SQLiteDatabase db = dbHelper.getReadableDatabase();
            try {
                @Cleanup
                Cursor cursorService = db.query(ServiceDB.Services._TABLE, new String[] { ServiceDB.Services.ID },
                        ServiceDB.Services.ACCOUNT_NAME + "=? AND " + ServiceDB.Services.SERVICE + "=?",
                        new String[] { account.name, ServiceDB.Services.SERVICE_CARDDAV }, null, null, null);
                if (!cursorService.moveToNext())
                    return null;
                String strServiceID = cursorService.getString(0);

                @Cleanup
                Cursor cursorHomeSets = db.query(ServiceDB.HomeSets._TABLE, new String[] { ServiceDB.HomeSets.URL },
                        ServiceDB.HomeSets.SERVICE_ID + "=?", new String[] { strServiceID }, null, null, null);
                while (cursorHomeSets.moveToNext())
                    info.homeSets.add(cursorHomeSets.getString(0));
            } finally {
                dbHelper.close();
            }

            return info;
        }
    }
}