/* * * * Copyright (C) 2014 Open Whisper Systems * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * / */ package org.anhonesteffort.flock; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentTransaction; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.Window; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import com.example.android.wizardpager.wizard.ui.StepPagerStrip; import org.anhonesteffort.flock.util.guava.Optional; import org.anhonesteffort.flock.sync.key.KeySyncScheduler; /** * Programmer: rhodey */ public class SetupActivity extends FragmentActivity { protected static final String KEY_SETUP_STATE = "SetupActivity.KEY_MANAGE_STATE"; protected static final String KEY_NAVIGATION_DISABLED = "SetupActivity.KEY_NAVIGATION_DISABLED"; protected static final String KEY_SERVICE_PROVIDER = "SetupActivity.KEY_SERVICE_PROVIDER"; protected static final String KEY_IS_NEW_ACCOUNT = "SetupActivity.KEY_IS_NEW_ACCOUNT"; protected static final String KEY_DAV_TEST_HOST = "SetupActivity.KEY_DAV_TEST_HOST"; protected static final String KEY_DAV_TEST_USERNAME = "KEY_DAV_TEST_USERNAME"; protected static final int STATE_INTRO = 0; protected static final int STATE_SELECT_SERVICE_PROVIDER = 1; protected static final int STATE_TEST_SERVICE_PROVIDER = 2; protected static final int STATE_CONFIGURE_SERVICE_PROVIDER = 3; protected static final int STATE_IMPORT_CONTACTS = 4; protected static final int STATE_IMPORT_CALENDARS = 5; protected static final int STATE_SELECT_REMOTE_ADDRESSBOOK = 6; protected static final int STATE_SELECT_REMOTE_CALENDARS = 7; protected static final int SERVICE_PROVIDER_OWS = 0; protected static final int SERVICE_PROVIDER_OTHER = 1; private int state = STATE_INTRO; private boolean navigationDisabled = false; private Optional<Integer> serviceProvider = Optional.absent(); private Optional<Boolean> isNewAccount = Optional.absent(); private Optional<String> davTestHost = Optional.absent(); private Optional<String> davTestUsername = Optional.absent(); private StepPagerStrip setupStepIndicator; private TextView setupStepTitle; private Button buttonPrevious; private Button buttonNext; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); requestWindowFeature(Window.FEATURE_PROGRESS); setContentView(R.layout.setup_activity); getActionBar().setDisplayHomeAsUpEnabled(false); getActionBar().setTitle(R.string.app_name); setupStepIndicator = (StepPagerStrip) findViewById(R.id.setup_step_indicator); setupStepTitle = (TextView) findViewById(R.id.setup_activity_large_text); buttonPrevious = (Button) findViewById(R.id.button_previous); buttonNext = (Button) findViewById(R.id.button_next); buttonPrevious.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { handleButtonPrevious(); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.setup_menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.button_send_debug_log: Intent nextIntent = new Intent(getBaseContext(), SendDebugLogActivity.class); startActivity(nextIntent); break; } return false; } protected void setNavigationDisabled(boolean navigationDisabled) { this.navigationDisabled = navigationDisabled; } @Override public void onBackPressed() { handleButtonPrevious(); } @Override protected void onResume() { super.onResume(); updateFragmentUsingState(state); } @Override public void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); if (savedInstanceState != null) { if (savedInstanceState.containsKey(KEY_SETUP_STATE)) state = savedInstanceState.getInt(KEY_SETUP_STATE); if (savedInstanceState.containsKey(KEY_NAVIGATION_DISABLED)) navigationDisabled = savedInstanceState.getBoolean(KEY_NAVIGATION_DISABLED); if (savedInstanceState.containsKey(KEY_SERVICE_PROVIDER)) serviceProvider = Optional.of(savedInstanceState.getInt(KEY_SERVICE_PROVIDER)); if (savedInstanceState.containsKey(KEY_IS_NEW_ACCOUNT)) isNewAccount = Optional.of(savedInstanceState.getBoolean(KEY_IS_NEW_ACCOUNT)); if (savedInstanceState.containsKey(KEY_DAV_TEST_HOST)) davTestHost = Optional.of(savedInstanceState.getString(KEY_DAV_TEST_HOST)); if (savedInstanceState.containsKey(KEY_DAV_TEST_USERNAME)) davTestUsername = Optional.of(savedInstanceState.getString(KEY_DAV_TEST_USERNAME)); } } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt(KEY_SETUP_STATE, state); outState.putBoolean(KEY_NAVIGATION_DISABLED, navigationDisabled); if (serviceProvider.isPresent()) outState.putInt(KEY_SERVICE_PROVIDER, serviceProvider.get()); if (isNewAccount.isPresent()) outState.putBoolean(KEY_IS_NEW_ACCOUNT, isNewAccount.get()); if (davTestHost.isPresent()) outState.putString(KEY_DAV_TEST_HOST, davTestHost.get()); if (davTestUsername.isPresent()) outState.putString(KEY_DAV_TEST_USERNAME, davTestUsername.get()); } protected void setServiceProvider(Integer provider) { this.serviceProvider = Optional.of(provider); } protected void setDavTestOptions(String davTestHost, String davTestUsername) { this.davTestHost = Optional.of(davTestHost); this.davTestUsername = Optional.of(davTestUsername); } protected void setIsNewAccount(Boolean isNew) { this.isNewAccount = Optional.of(isNew); } protected void handleSetupComplete() { new KeySyncScheduler(getBaseContext()).requestSync(); Toast.makeText(getBaseContext(), R.string.setup_complete, Toast.LENGTH_LONG).show(); Intent nextIntent = new Intent(getBaseContext(), PreferencesActivity.class); nextIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(nextIntent); finish(); } private void limitMultipleAccounts() { if (state == STATE_INTRO || state == STATE_SELECT_SERVICE_PROVIDER || state == STATE_TEST_SERVICE_PROVIDER || state == STATE_CONFIGURE_SERVICE_PROVIDER) { if (DavAccountHelper.isAccountRegistered(getBaseContext())) { Toast.makeText(this, R.string.error_multiple_accounts_not_allowed, Toast.LENGTH_SHORT).show(); finish(); } } } protected void updateFragmentUsingState(int newState) { FragmentTransaction fragmentTransaction; Fragment nextFragment; boolean replaceFragment = (newState != STATE_INTRO && state != newState); switch (newState) { case STATE_INTRO: setupStepIndicator.setVisibility(View.GONE); setupStepTitle.setVisibility(View.GONE); fragmentTransaction = getSupportFragmentManager().beginTransaction(); nextFragment = new IntroductionFragment(); fragmentTransaction.replace(R.id.fragment_view, nextFragment); fragmentTransaction.commit(); buttonPrevious.setVisibility(View.INVISIBLE); buttonNext.setText(R.string.begin); buttonNext.setVisibility(View.VISIBLE); break; case STATE_SELECT_SERVICE_PROVIDER: setupStepIndicator.setVisibility(View.GONE); setupStepIndicator.setCurrentPage(0); setupStepTitle.setVisibility(View.VISIBLE); setupStepTitle.setText(R.string.title_chose_sync_service); if (replaceFragment) { fragmentTransaction = getSupportFragmentManager().beginTransaction(); nextFragment = new SelectServiceProviderFragment(); fragmentTransaction.replace(R.id.fragment_view, nextFragment); fragmentTransaction.commit(); } buttonPrevious.setVisibility(View.VISIBLE); buttonNext.setText(R.string.next); buttonNext.setVisibility(View.VISIBLE); break; case STATE_TEST_SERVICE_PROVIDER: setupStepIndicator.setVisibility(View.VISIBLE); setupStepIndicator.setPageCount(7); setupStepIndicator.setCurrentPage(1); setupStepTitle.setText(R.string.title_server_tests); if (replaceFragment) { fragmentTransaction = getSupportFragmentManager().beginTransaction(); nextFragment = new ServerTestsFragment(); fragmentTransaction.replace(R.id.fragment_view, nextFragment); fragmentTransaction.commit(); } buttonPrevious.setVisibility(View.VISIBLE); buttonNext.setText(R.string.next); buttonNext.setVisibility(View.VISIBLE); break; case STATE_CONFIGURE_SERVICE_PROVIDER: setupStepIndicator.setVisibility(View.VISIBLE); setupStepTitle.setText(R.string.title_server_tests); if (serviceProvider.isPresent() && serviceProvider.get().equals(SERVICE_PROVIDER_OTHER)) { setupStepIndicator.setPageCount(7); setupStepIndicator.setCurrentPage(2); setupStepTitle.setText(R.string.title_import_account); ImportOtherAccountFragment hack = new ImportOtherAccountFragment(); if (davTestHost.isPresent() && davTestUsername.isPresent()) hack.setDavTestOptions(davTestHost.get(), davTestUsername.get()); nextFragment = hack; } else if (isNewAccount.isPresent() && isNewAccount.get()) { setupStepIndicator.setPageCount(4); setupStepIndicator.setCurrentPage(1); setupStepTitle.setText(R.string.title_register_account); nextFragment = new RegisterAccountFragment(); } else { setupStepIndicator.setPageCount(2); setupStepIndicator.setCurrentPage(1); setupStepTitle.setText(R.string.title_import_account); nextFragment = new ImportOwsAccountFragment(); } if (replaceFragment) { fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.replace(R.id.fragment_view, nextFragment); fragmentTransaction.commit(); } buttonPrevious.setVisibility(View.VISIBLE); buttonNext.setText(R.string.next); buttonNext.setVisibility(View.VISIBLE); break; case STATE_IMPORT_CONTACTS: if (serviceProvider.isPresent() && serviceProvider.get().equals(SERVICE_PROVIDER_OWS) && isNewAccount.isPresent() && !isNewAccount.get()) { handleSetupComplete(); break; } if (serviceProvider.isPresent() && !serviceProvider.get().equals(SERVICE_PROVIDER_OWS)) { setupStepIndicator.setPageCount(7); setupStepIndicator.setCurrentPage(3); } else { setupStepIndicator.setPageCount(4); setupStepIndicator.setCurrentPage(2); } setupStepTitle.setText(R.string.title_import_contacts); Toast.makeText(getBaseContext(), R.string.select_accounts_to_import_contacts_from, Toast.LENGTH_LONG).show(); if (replaceFragment) { fragmentTransaction = getSupportFragmentManager().beginTransaction(); nextFragment = new ImportContactsFragment(); fragmentTransaction.replace(R.id.fragment_view, nextFragment); fragmentTransaction.commit(); } buttonPrevious.setVisibility(View.INVISIBLE); buttonNext.setText(R.string.next); buttonNext.setVisibility(View.VISIBLE); break; case STATE_IMPORT_CALENDARS: if (serviceProvider.isPresent() && !serviceProvider.get().equals(SERVICE_PROVIDER_OWS)) { setupStepIndicator.setPageCount(7); setupStepIndicator.setCurrentPage(4); } else { setupStepIndicator.setPageCount(4); setupStepIndicator.setCurrentPage(3); } setupStepTitle.setText(R.string.title_import_calendars); Toast.makeText(getBaseContext(), R.string.select_calendars_to_import, Toast.LENGTH_SHORT).show(); if (replaceFragment) { fragmentTransaction = getSupportFragmentManager().beginTransaction(); nextFragment = new ImportCalendarsFragment(); fragmentTransaction.replace(R.id.fragment_view, nextFragment); fragmentTransaction.commit(); } buttonPrevious.setVisibility(View.VISIBLE); buttonNext.setText(R.string.next); buttonNext.setVisibility(View.VISIBLE); break; case STATE_SELECT_REMOTE_ADDRESSBOOK: if (serviceProvider.isPresent() && serviceProvider.get().equals(SERVICE_PROVIDER_OWS) && isNewAccount.isPresent() && isNewAccount.get()) { handleSetupComplete(); break; } setupStepIndicator.setPageCount(7); setupStepIndicator.setCurrentPage(5); setupStepTitle.setText(R.string.title_my_addressbooks); Toast.makeText(getBaseContext(), R.string.select_a_single_remote_addressbook_in_which_to_store, Toast.LENGTH_LONG).show(); if (replaceFragment) { fragmentTransaction = getSupportFragmentManager().beginTransaction(); nextFragment = new MyAddressbooksFragment(); fragmentTransaction.replace(R.id.fragment_view, nextFragment); fragmentTransaction.commit(); } buttonPrevious.setVisibility(View.VISIBLE); buttonNext.setText(R.string.next); buttonNext.setVisibility(View.VISIBLE); break; case STATE_SELECT_REMOTE_CALENDARS: setupStepIndicator.setPageCount(7); setupStepIndicator.setCurrentPage(6); setupStepTitle.setText(R.string.title_my_calendars); Toast.makeText(getBaseContext(), R.string.select_the_calendars_you_would_like_to_sync_with_this_device, Toast.LENGTH_LONG).show(); if (replaceFragment) { fragmentTransaction = getSupportFragmentManager().beginTransaction(); nextFragment = new MyCalendarsFragment(); fragmentTransaction.replace(R.id.fragment_view, nextFragment); fragmentTransaction.commit(); } buttonPrevious.setVisibility(View.VISIBLE); buttonNext.setText(R.string.next); buttonNext.setVisibility(View.VISIBLE); break; } state = newState; limitMultipleAccounts(); } private void handleButtonPrevious() { if (navigationDisabled) return; setupStepTitle.setTextColor(0xff0099cc); buttonNext.setBackgroundResource(R.drawable.selectable_item_background); buttonNext.setText(R.string.next); switch (state) { case STATE_INTRO: finish(); break; case STATE_SELECT_SERVICE_PROVIDER: updateFragmentUsingState(STATE_INTRO); break; case STATE_TEST_SERVICE_PROVIDER: updateFragmentUsingState(STATE_SELECT_SERVICE_PROVIDER); break; case STATE_CONFIGURE_SERVICE_PROVIDER: if (serviceProvider.isPresent() && serviceProvider.get().equals(SERVICE_PROVIDER_OTHER)) updateFragmentUsingState(STATE_TEST_SERVICE_PROVIDER); else updateFragmentUsingState(STATE_SELECT_SERVICE_PROVIDER); break; case STATE_IMPORT_CONTACTS: updateFragmentUsingState(STATE_IMPORT_CONTACTS); break; case STATE_IMPORT_CALENDARS: updateFragmentUsingState(STATE_IMPORT_CONTACTS); break; case STATE_SELECT_REMOTE_ADDRESSBOOK: updateFragmentUsingState(STATE_IMPORT_CALENDARS); break; case STATE_SELECT_REMOTE_CALENDARS: updateFragmentUsingState(STATE_SELECT_REMOTE_ADDRESSBOOK); break; } } }