Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 27ca8e9d authored by Ricki Hirner's avatar Ricki Hirner
Browse files

Reorganize fragments

parent 3dcedc07
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -47,7 +47,7 @@
        </activity>
        <activity
            android:name=".ui.AddCalendarActivity"
            android:label="@string/activity_add_account"
            android:label="@string/activity_add_calendar"
            android:parentActivityName=".ui.CalendarListActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
+1 −0
Original line number Diff line number Diff line
@@ -45,4 +45,5 @@ public class AddCalendarActivity extends AppCompatActivity {
        outState.putString(STATE_USERNAME, username);
        outState.putString(STATE_PASSWORD, password);
    }

}
+41 −72
Original line number Diff line number Diff line
package at.bitfire.icsdroid.ui;

import android.accounts.AccountManager;
import android.content.ContentValues;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
@@ -13,11 +11,9 @@ import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;

import org.apache.commons.lang3.StringUtils;
import android.provider.CalendarContract.Calendars;
import android.widget.TextView;
import android.widget.Toast;

import at.bitfire.ical4android.AndroidCalendar;
@@ -25,73 +21,63 @@ import at.bitfire.ical4android.CalendarStorageException;
import at.bitfire.icsdroid.AppAccount;
import at.bitfire.icsdroid.R;
import at.bitfire.icsdroid.db.LocalCalendar;
import yuku.ambilwarna.AmbilWarnaDialog;

public class AddCalendarDetailsFragment extends Fragment implements TextWatcher {
    private static final String TAG = "ICSdroid.CreateCalendar";
public class AddCalendarDetailsFragment extends Fragment implements TitleColorFragment.OnChangeListener {
    private static final String
            TAG = "ICSdroid.CreateCalendar",
            STATE_TITLE = "title",
            STATE_COLOR = "color";

    private static final String STATE_COLOR = "color";
    String title;
    int color = 0xff2F80C7;

    AddCalendarActivity activity;
    TitleColorFragment fragTitleColor;

    TextView textURL;
    EditText editTitle;
    ColorButton colorButton;

    String title;
    int color = 0xffFF0000;
    @Override
    public void onAttach(Context context)
    {
        super.onAttach(context);
        activity = (AddCalendarActivity)context;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle inState) {
        View v = inflater.inflate(R.layout.add_calendar_details, container, false);
        setHasOptionsMenu(true);

        textURL = (TextView)v.findViewById(R.id.url);

        editTitle = (EditText)v.findViewById(R.id.title);
        editTitle.addTextChangedListener(this);

        colorButton = (ColorButton)v.findViewById(R.id.color);
        if (inState != null)
            colorButton.setColor(color = inState.getInt(STATE_COLOR));
        colorButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new AmbilWarnaDialog(getActivity(), color, new AmbilWarnaDialog.OnAmbilWarnaListener() {
                    @Override
                    public void onCancel(AmbilWarnaDialog ambilWarnaDialog) {
                    }

                    @Override
                    public void onOk(AmbilWarnaDialog ambilWarnaDialog, int newColor) {
                        colorButton.setColor(color = 0xff000000 | newColor);
                    }
                }).show();
            }
        });

        return v;
    }

    @Override
    public void onActivityCreated(Bundle inState) {
        super.onActivityCreated(inState);
        activity = (AddCalendarActivity)getActivity();

        textURL.setText(activity.url.toString());

        if (inState == null) {
        if (inState != null) {
            title = inState.getString(STATE_TITLE);
            color = inState.getInt(STATE_COLOR);
        } else {
            String path = activity.url.getPath();
            editTitle.setText(path.substring(path.lastIndexOf('/') + 1));
        }
            title = path.substring(path.lastIndexOf('/') + 1);
        }

        fragTitleColor = new TitleColorFragment();
        Bundle args = new Bundle(3);
        args.putString(TitleColorFragment.ARG_URL, activity.url.toString());
        args.putString(TitleColorFragment.ARG_TITLE, title);
        args.putInt(TitleColorFragment.ARG_COLOR, color);
        fragTitleColor.setArguments(args);
        fragTitleColor.setOnChangeListener(this);
        getChildFragmentManager().beginTransaction()
                .add(R.id.title_color, fragTitleColor)
                .commit();
        return v;
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString(STATE_TITLE, title);
        outState.putInt(STATE_COLOR, color);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.menu_create_calendar, menu);
    }

    @Override
    public void onPrepareOptionsMenu(Menu menu) {
@@ -99,11 +85,6 @@ public class AddCalendarDetailsFragment extends Fragment implements TextWatcher
        itemGo.setEnabled(StringUtils.isNotBlank(title));
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.menu_create_calendar, menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == R.id.create_calendar) {
@@ -115,25 +96,14 @@ public class AddCalendarDetailsFragment extends Fragment implements TextWatcher
    }


    /* dynamic changes */

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
    }

    @Override
    public void afterTextChanged(Editable s) {
        title = editTitle.getText().toString();
        activity.invalidateOptionsMenu();
    public void onChangeTitleColor(String title, int color) {
        this.title = title;
        this.color = color;
        getActivity().invalidateOptionsMenu();
    }


    /* actions */

    private boolean createCalendar() {
        AppAccount.makeAvailable(getContext());

@@ -160,5 +130,4 @@ public class AddCalendarDetailsFragment extends Fragment implements TextWatcher
            return false;
        }
    }

}
+45 −67
Original line number Diff line number Diff line
package at.bitfire.icsdroid.ui;

import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
@@ -12,9 +13,7 @@ import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.Switch;
import android.widget.TextView;

import org.apache.commons.lang3.StringUtils;
@@ -24,46 +23,41 @@ import java.net.URL;

import at.bitfire.icsdroid.R;

public class AddCalendarEnterUrlFragment extends Fragment implements CompoundButton.OnCheckedChangeListener, TextWatcher {
public class AddCalendarEnterUrlFragment extends Fragment implements TextWatcher, CredentialsFragment.OnCredentialsChangeListener {
    private static final String TAG = "ICSdroid.EnterUrl";

    AddCalendarActivity activity;
    CredentialsFragment credentials;

    EditText editURL;
    TextView insecureAuthWarning;

    EditText editURL, editUsername, editPassword;
    TextView insecureAuthWarning, textUsername, textPassword;
    Switch switchAuthRequired;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Log.i(TAG, "Create fragment view");
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        this.activity = (AddCalendarActivity)activity;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.add_calendar_enter_url, container, false);
        setHasOptionsMenu(true);

        editURL = (EditText)v.findViewById(R.id.url);
        switchAuthRequired = (Switch)v.findViewById(R.id.requires_authentication);
        insecureAuthWarning = (TextView)v.findViewById(R.id.insecure_authentication_warning);
        textUsername = (TextView)v.findViewById(R.id.user_name_label);
        editUsername = (EditText)v.findViewById(R.id.user_name);
        textPassword = (TextView)v.findViewById(R.id.password_label);
        editPassword = (EditText)v.findViewById(R.id.password);

        switchAuthRequired.setOnCheckedChangeListener(this);
        Uri createUri = getActivity().getIntent().getData();
        editURL.addTextChangedListener(this);
        editUsername.addTextChangedListener(this);
        editPassword.addTextChangedListener(this);

        return v;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        activity = (AddCalendarActivity)getActivity();

        Uri createUri = activity.getIntent().getData();
        if (createUri != null)
            editURL.setText(createUri.toString());

        credentials = new CredentialsFragment();
        credentials.setOnChangeListener(this);
        getChildFragmentManager().beginTransaction()
                .add(R.id.credentials, credentials)
                .commit();

        insecureAuthWarning = (TextView)v.findViewById(R.id.insecure_authentication_warning);
        return v;
    }

    @Override
@@ -74,33 +68,21 @@ public class AddCalendarEnterUrlFragment extends Fragment implements CompoundBut
    @Override
    public void onPrepareOptionsMenu(Menu menu) {
        MenuItem itemNext = menu.findItem(R.id.next);
        itemNext.setEnabled(
                activity.url != null &&
                        (!activity.authRequired || (StringUtils.isNotBlank(activity.username) && StringUtils.isNotBlank(activity.password)))
        );
        boolean urlOK = StringUtils.isNotBlank(editURL.getText().toString()),
                authOK = !credentials.authRequired || (StringUtils.isNotBlank(credentials.username) && StringUtils.isNotBlank(credentials.password));
        itemNext.setEnabled(urlOK && authOK);
    }


    /* dynamic changes */

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (isChecked) {
            activity.authRequired = true;
            textUsername.setVisibility(View.VISIBLE);
            editUsername.setVisibility(View.VISIBLE);
            textPassword.setVisibility(View.VISIBLE);
            editPassword.setVisibility(View.VISIBLE);
        } else {
            activity.authRequired = false;
            textUsername.setVisibility(View.GONE);
            editUsername.setVisibility(View.GONE);
            textPassword.setVisibility(View.GONE);
            editPassword.setVisibility(View.GONE);
        }

        updateAuthFields();
        activity.invalidateOptionsMenu();
    public void onChangeCredentials(boolean authRequired, String username, String password) {
        activity.authRequired = authRequired;
        activity.username = username;
        activity.password = password;
        updateHttpWarning();
        getActivity().invalidateOptionsMenu();
    }

    @Override
@@ -117,35 +99,31 @@ public class AddCalendarEnterUrlFragment extends Fragment implements CompoundBut

        activity.url = null;
        try {
            activity.url = new URL(urlString);
            String protocol = activity.url.getProtocol();
            if ((!"http".equals(protocol) && !"https".equals(protocol) || StringUtils.isBlank(activity.url.getAuthority())))
                activity.url = null;
            URL url = new URL(urlString);
            String protocol = url.getProtocol();
            if ((("http".equals(protocol) || "https".equals(protocol)) && StringUtils.isNotBlank(url.getAuthority())))
                activity.url = url;
        } catch (MalformedURLException e) {
            Log.d(TAG, "Invalid URL", e);
        }
    }

    @Override
    public void afterTextChanged(Editable s) {
        editURL.setTextColor(getResources().getColor(activity.url != null ?
                R.color.secondary_text_default_material_light :
                R.color.redorange));
    }

        updateAuthFields();
        activity.invalidateOptionsMenu();
    @Override
    public void afterTextChanged(Editable s) {
        updateHttpWarning();
        getActivity().invalidateOptionsMenu();
    }

    void updateAuthFields() {
        if (activity.authRequired) {
            insecureAuthWarning.setVisibility(activity.url != null && "https".equals(activity.url.getProtocol()) ? View.GONE : View.VISIBLE);
            activity.username = editUsername.getText().toString();
            activity.password = editPassword.getText().toString();
        } else {
    void updateHttpWarning() {
        // warn if auth. required and not using HTTPS
        if (credentials.authRequired && activity.url != null)
            insecureAuthWarning.setVisibility("https".equals(activity.url.getProtocol()) ? View.GONE : View.VISIBLE);
        else
            insecureAuthWarning.setVisibility(View.GONE);
            activity.username = null;
            activity.password = null;
        }
    }


+20 −16
Original line number Diff line number Diff line
package at.bitfire.icsdroid.ui;

import android.app.Activity;
import android.app.Dialog;
import android.app.FragmentTransaction;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.AsyncTaskLoader;
import android.support.v4.content.Loader;
import android.util.Base64;
import android.view.View;
import android.widget.Toast;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import at.bitfire.ical4android.Event;
import at.bitfire.ical4android.InvalidCalendarException;
@@ -23,26 +22,28 @@ import at.bitfire.icsdroid.R;
import lombok.Cleanup;

public class AddCalendarValidationFragment extends DialogFragment implements LoaderManager.LoaderCallbacks<ResourceInfo> {

    AddCalendarActivity activity;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        this.activity = (AddCalendarActivity)activity;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        activity = (AddCalendarActivity)getActivity();
        Loader<ResourceInfo> loader = getLoaderManager().initLoader(0, null, this);
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getLoaderManager().initLoader(0, null, this);
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        setCancelable(false);

        ProgressDialog progress = new ProgressDialog(getActivity());
        progress.setCancelable(false);
        progress.setMessage(getString(R.string.please_wait));
        progress.setMessage(getString(R.string.add_calendar_validating));
        return progress;
    }

@@ -84,7 +85,7 @@ public class AddCalendarValidationFragment extends DialogFragment implements Loa

    protected static class ResourceInfoLoader extends AsyncTaskLoader<ResourceInfo> {
        ResourceInfo info;
        boolean started;
        boolean loaded;

        public ResourceInfoLoader(AddCalendarActivity activity) {
            super(activity);
@@ -95,9 +96,10 @@ public class AddCalendarValidationFragment extends DialogFragment implements Loa
        @Override
        protected void onStartLoading() {
            synchronized(this) {
                if (started == false)
                    started = true;
                if (!loaded) {
                    forceLoad();
                    loaded = true;
                }
            }
        }

@@ -106,6 +108,8 @@ public class AddCalendarValidationFragment extends DialogFragment implements Loa
            HttpURLConnection conn;
            try {
                conn = (HttpURLConnection) info.url.openConnection();
                conn.setConnectTimeout(7000);
                conn.setReadTimeout(20000);
                if (info.authRequired) {
                    String basicCredentials = info.username + ":" + info.password;
                    conn.setRequestProperty("Authorization", "Basic " + Base64.encodeToString(basicCredentials.getBytes(), 0));
Loading