/* * Firetweet - Twitter client for Android * * Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com> * * 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.getlantern.firetweet.activity; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.DialogFragment; import android.app.FragmentManager; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; import android.preference.Preference; import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceScreen; import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import org.getlantern.firetweet.Constants; import org.getlantern.firetweet.R; import org.getlantern.firetweet.activity.support.DataImportActivity; import org.getlantern.firetweet.activity.support.HomeActivity; import org.getlantern.firetweet.adapter.TabsAdapter; import org.getlantern.firetweet.fragment.BaseDialogFragment; import org.getlantern.firetweet.fragment.BaseFragment; import org.getlantern.firetweet.fragment.BasePreferenceFragment; import org.getlantern.firetweet.fragment.ProgressDialogFragment; import org.getlantern.firetweet.fragment.support.DirectMessagesFragment; import org.getlantern.firetweet.fragment.support.HomeTimelineFragment; import org.getlantern.firetweet.fragment.support.MentionsTimelineFragment; import org.getlantern.firetweet.model.CustomTabConfiguration; import org.getlantern.firetweet.model.SupportTabSpec; import org.getlantern.firetweet.preference.WizardPageHeaderPreference; import org.getlantern.firetweet.preference.WizardPageNavPreference; import org.getlantern.firetweet.provider.FiretweetDataStore.Tabs; import org.getlantern.firetweet.util.AsyncTaskUtils; import org.getlantern.firetweet.util.CustomTabUtils; import org.getlantern.firetweet.util.MathUtils; import org.getlantern.firetweet.util.ParseUtils; import org.getlantern.firetweet.view.LinePageIndicator; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.List; import android.os.Handler; import java.lang.Runnable; import static org.getlantern.firetweet.util.CompareUtils.classEquals; public class SettingsWizardActivity extends Activity implements Constants { public static final String WIZARD_PREFERENCE_KEY_NEXT_PAGE = "next_page"; public static final String WIZARD_PREFERENCE_KEY_USE_DEFAULTS = "use_defaults"; public static final String WIZARD_PREFERENCE_KEY_EDIT_CUSTOM_TABS = "edit_custom_tabs"; public static final String WIZARD_PREFERENCE_KEY_IMPORT_SETTINGS = "import_settings"; private static final int REQUEST_IMPORT_SETTINGS = 201; private ViewPager mViewPager; private LinePageIndicator mIndicator; private TabsAdapter mAdapter; private AbsInitialSettingsTask mTask; private AbsInitialSettingsTask mTabTask; public void applyInitialSettings() { if (mTask != null && mTask.getStatus() == AsyncTask.Status.RUNNING) return; mTask = new InitialSettingsTask(this); AsyncTaskUtils.executeTask(mTask); } public void applyInitialTabSettings() { if (mTabTask != null && mTabTask.getStatus() == AsyncTask.Status.RUNNING) return; mTabTask = new InitialTabSettingsTask(this); AsyncTaskUtils.executeTask(mTabTask); } public void exitWizard() { final SharedPreferences prefs = getSharedPreferences(SHARED_PREFERENCES_NAME, MODE_PRIVATE); prefs.edit().putBoolean(KEY_SETTINGS_WIZARD_COMPLETED, true).apply(); final Intent intent = new Intent(this, HomeActivity.class); intent.putExtra(EXTRA_OPEN_ACCOUNTS_DRAWER, true); startActivity(intent); finish(); } public void gotoFinishPage() { if (mViewPager == null || mAdapter == null) return; final int last = mAdapter.getCount() - 1; mViewPager.setCurrentItem(Math.max(last, 0)); } public void gotoLastPage() { if (mViewPager == null || mAdapter == null) return; final int last = mAdapter.getCount() - 2; mViewPager.setCurrentItem(Math.max(last, 0)); } public void gotoNextPage() { if (mViewPager == null || mAdapter == null) return; final int current = mViewPager.getCurrentItem(); mViewPager.setCurrentItem(MathUtils.clamp(current + 1, mAdapter.getCount() - 1, 0)); } @Override public void onBackPressed() { super.onBackPressed(); } @Override public void onContentChanged() { super.onContentChanged(); mViewPager = (ViewPager) findViewById(R.id.pager); mIndicator = (LinePageIndicator) findViewById(R.id.indicator); } @Override protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { switch (requestCode) { case REQUEST_IMPORT_SETTINGS: { if (resultCode == RESULT_OK) { gotoLastPage(); } else { gotoNextPage(); } break; } default: { break; } } super.onActivityResult(requestCode, resultCode, data); } @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); /*setContentView(R.layout.activity_settings_wizard);*/ mAdapter = new TabsAdapter(this, getFragmentManager(), null); /*mViewPager.setAdapter(mAdapter); mViewPager.setEnabled(false);*/ /*mIndicator.setViewPager(mViewPager); initPages();*/ applyInitialSettings(); Handler handler = new Handler(); handler.postDelayed(new Runnable() { public void run() { exitWizard(); } }, 1000); } private void initPages() { mAdapter.addTab(WizardPageWelcomeFragment.class, null, getString(R.string.wizard_page_welcome_title), null, 0); mAdapter.addTab(WizardPageThemeFragment.class, null, getString(R.string.theme), null, 0); mAdapter.addTab(WizardPageTabsFragment.class, null, getString(R.string.tabs), null, 0); mAdapter.addTab(WizardPageCardsFragment.class, null, getString(R.string.cards), null, 0); mAdapter.addTab(WizardPageUsageStatisticsFragment.class, null, getString(R.string.usage_statistics), null, 0); mAdapter.addTab(WizardPageHintsFragment.class, null, getString(R.string.hints), null, 0); mAdapter.addTab(WizardPageFinishedFragment.class, null, getString(R.string.wizard_page_finished_title), null, 0); } private void openImportSettingsDialog() { final Intent intent = new Intent(this, DataImportActivity.class); startActivityForResult(intent, REQUEST_IMPORT_SETTINGS); } public static abstract class BaseWizardPageFragment extends BasePreferenceFragment implements OnPreferenceClickListener { public void gotoFinishPage() { final Activity a = getActivity(); if (a instanceof SettingsWizardActivity) { ((SettingsWizardActivity) a).gotoFinishPage(); } } public void gotoLastPage() { final Activity a = getActivity(); if (a instanceof SettingsWizardActivity) { ((SettingsWizardActivity) a).gotoLastPage(); } } public void gotoNextPage() { final Activity a = getActivity(); if (a instanceof SettingsWizardActivity) { ((SettingsWizardActivity) a).gotoNextPage(); } } @Override public void onActivityCreated(final Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); addPreferencesFromResource(getPreferenceResource()); final Context context = getActivity(); final Preference wizardHeader = new WizardPageHeaderPreference(context); wizardHeader.setTitle(getHeaderTitle()); wizardHeader.setSummary(getHeaderSummary()); wizardHeader.setOrder(0); final PreferenceScreen screen = getPreferenceScreen(); screen.addPreference(wizardHeader); final int nextPageTitle = getNextPageTitle(); if (nextPageTitle != 0) { final Preference nextPage = new WizardPageNavPreference(context); nextPage.setOrder(999); nextPage.setKey(WIZARD_PREFERENCE_KEY_NEXT_PAGE); nextPage.setTitle(nextPageTitle); nextPage.setOnPreferenceClickListener(this); screen.addPreference(nextPage); } } @Override public boolean onPreferenceClick(final Preference preference) { if (WIZARD_PREFERENCE_KEY_NEXT_PAGE.equals(preference.getKey())) { gotoNextPage(); } return true; } protected abstract int getHeaderSummary(); protected abstract int getHeaderTitle(); protected int getNextPageTitle() { return R.string.next; } protected abstract int getPreferenceResource(); } public static class WizardPageCardsFragment extends BaseWizardPageFragment { @Override protected int getHeaderSummary() { return R.string.wizard_page_cards_text; } @Override protected int getHeaderTitle() { return R.string.cards; } @Override protected int getPreferenceResource() { return R.xml.preferences_cards; } } public static class WizardPageFinishedFragment extends BaseFragment implements OnClickListener { @Override public void onClick(final View v) { final Activity a = getActivity(); if (a instanceof SettingsWizardActivity) { ((SettingsWizardActivity) a).exitWizard(); } } @Override public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { final View view = inflater.inflate(R.layout.fragment_wizard_page_finished, container, false); view.findViewById(R.id.exit_wizard).setOnClickListener(this); return view; } } public static class WizardPageUsageStatisticsFragment extends BaseWizardPageFragment { @Override protected int getHeaderSummary() { return R.string.wizard_page_usage_statistics_text; } @Override protected int getHeaderTitle() { return R.string.usage_statistics; } @Override protected int getNextPageTitle() { return R.string.next; } @Override protected int getPreferenceResource() { return R.xml.settings_wizard_page_usage_statistics; } } public static class WizardPageHintsFragment extends BaseWizardPageFragment { @Override protected int getHeaderSummary() { return R.string.wizard_page_hints_text; } @Override protected int getHeaderTitle() { return R.string.hints; } @Override protected int getNextPageTitle() { return R.string.finish; } @Override protected int getPreferenceResource() { return R.xml.settings_wizard_page_hints; } } public static class WizardPageTabsFragment extends BaseWizardPageFragment { private static final int REQUEST_CUSTOM_TABS = 1; public void applyInitialTabSettings() { final Activity a = getActivity(); if (a instanceof SettingsWizardActivity) { ((SettingsWizardActivity) a).applyInitialTabSettings(); } } @Override public void onActivityCreated(final Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); findPreference(WIZARD_PREFERENCE_KEY_EDIT_CUSTOM_TABS).setOnPreferenceClickListener(this); findPreference(WIZARD_PREFERENCE_KEY_USE_DEFAULTS).setOnPreferenceClickListener(this); } @Override public void onActivityResult(final int requestCode, final int resultCode, final Intent data) { switch (requestCode) { case REQUEST_CUSTOM_TABS: if (resultCode != RESULT_OK) { new TabsUnchangedDialogFragment().show(getFragmentManager(), "tabs_unchanged"); } else { gotoNextPage(); } break; } super.onActivityResult(requestCode, resultCode, data); } @Override public boolean onPreferenceClick(final Preference preference) { final String key = preference.getKey(); if (WIZARD_PREFERENCE_KEY_EDIT_CUSTOM_TABS.equals(key)) { startActivityForResult(new Intent(getActivity(), CustomTabsActivity.class), REQUEST_CUSTOM_TABS); } else if (WIZARD_PREFERENCE_KEY_USE_DEFAULTS.equals(key)) { applyInitialTabSettings(); } return true; } @Override protected int getHeaderSummary() { return R.string.wizard_page_tabs_text; } @Override protected int getHeaderTitle() { return R.string.tabs; } @Override protected int getNextPageTitle() { return 0; } @Override protected int getPreferenceResource() { return R.xml.settings_wizard_page_tab; } public static class TabsUnchangedDialogFragment extends BaseDialogFragment implements DialogInterface.OnClickListener { @Override public void onCancel(final DialogInterface dialog) { gotoNextPage(); } @Override public void onClick(final DialogInterface dialog, final int which) { gotoNextPage(); } @Override public Dialog onCreateDialog(final Bundle savedInstanceState) { final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setMessage(R.string.wizard_page_tabs_unchanged_message); builder.setPositiveButton(android.R.string.ok, this); return builder.create(); } private void gotoNextPage() { final Activity a = getActivity(); if (a instanceof SettingsWizardActivity) { ((SettingsWizardActivity) a).gotoNextPage(); } } } } public static class WizardPageThemeFragment extends BaseWizardPageFragment implements OnPreferenceClickListener { @Override protected int getHeaderSummary() { return R.string.wizard_page_theme_text; } @Override protected int getHeaderTitle() { return R.string.theme; } @Override protected int getPreferenceResource() { return R.xml.preferences_theme; } } public static class WizardPageWelcomeFragment extends BaseWizardPageFragment implements OnPreferenceClickListener { public void applyInitialSettings() { final Activity a = getActivity(); if (a instanceof SettingsWizardActivity) { ((SettingsWizardActivity) a).applyInitialSettings(); } } @Override public void onActivityCreated(final Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); findPreference(WIZARD_PREFERENCE_KEY_NEXT_PAGE).setOnPreferenceClickListener(this); findPreference(WIZARD_PREFERENCE_KEY_USE_DEFAULTS).setOnPreferenceClickListener(this); findPreference(WIZARD_PREFERENCE_KEY_IMPORT_SETTINGS).setOnPreferenceClickListener(this); } @Override public boolean onPreferenceClick(final Preference preference) { final String key = preference.getKey(); if (WIZARD_PREFERENCE_KEY_NEXT_PAGE.equals(key)) { gotoNextPage(); } else if (WIZARD_PREFERENCE_KEY_USE_DEFAULTS.equals(key)) { applyInitialSettings(); } else if (WIZARD_PREFERENCE_KEY_IMPORT_SETTINGS.equals(key)) { openImportSettingsDialog(); } return true; } @Override protected int getHeaderSummary() { return R.string.wizard_page_welcome_text; } @Override protected int getHeaderTitle() { return R.string.wizard_page_welcome_title; } @Override protected int getNextPageTitle() { return 0; } @Override protected int getPreferenceResource() { return R.xml.settings_wizard_page_welcome; } private void openImportSettingsDialog() { final Activity a = getActivity(); if (a instanceof SettingsWizardActivity) { ((SettingsWizardActivity) a).openImportSettingsDialog(); } } } static abstract class AbsInitialSettingsTask extends AsyncTask<Object, Object, Boolean> { private static final String FRAGMENT_TAG = "initial_settings_dialog"; private static final String[] DEFAULT_TAB_TYPES = {TAB_TYPE_HOME_TIMELINE, TAB_TYPE_MENTIONS_TIMELINE, TAB_TYPE_TRENDS_SUGGESTIONS, TAB_TYPE_DIRECT_MESSAGES}; private final SettingsWizardActivity mActivity; AbsInitialSettingsTask(final SettingsWizardActivity activity) { mActivity = activity; } @Override protected Boolean doInBackground(final Object... params) { final ContentResolver resolver = mActivity.getContentResolver(); final List<SupportTabSpec> tabs = CustomTabUtils.getHomeTabs(mActivity); if (wasConfigured(tabs)) return true; Collections.sort(tabs); int i = 0; final List<ContentValues> values_list = new ArrayList<ContentValues>(); for (final String type : DEFAULT_TAB_TYPES) { final ContentValues values = new ContentValues(); final CustomTabConfiguration conf = CustomTabUtils.getTabConfiguration(type); values.put(Tabs.TYPE, type); values.put(Tabs.ICON, CustomTabUtils.findTabIconKey(conf.getDefaultIcon())); values.put(Tabs.POSITION, i++); values_list.add(values); } for (final SupportTabSpec spec : tabs) { final String type = CustomTabUtils.findTabType(spec.cls); if (type != null) { final ContentValues values = new ContentValues(); values.put(Tabs.TYPE, type); values.put(Tabs.ARGUMENTS, ParseUtils.bundleToJSON(spec.args)); values.put(Tabs.NAME, spec.name); if (spec.icon instanceof Integer) { values.put(Tabs.ICON, CustomTabUtils.findTabIconKey((Integer) spec.icon)); } else if (spec.icon instanceof File) { values.put(Tabs.ICON, ((File) spec.icon).getPath()); } values.put(Tabs.POSITION, i++); } } resolver.delete(Tabs.CONTENT_URI, null, null); resolver.bulkInsert(Tabs.CONTENT_URI, values_list.toArray(new ContentValues[values_list.size()])); return true; } protected SettingsWizardActivity getActivity() { return mActivity; } protected abstract void nextStep(); @Override protected void onPostExecute(final Boolean result) { final FragmentManager fm = mActivity.getFragmentManager(); final DialogFragment f = (DialogFragment) fm.findFragmentByTag(FRAGMENT_TAG); if (f != null) { f.dismiss(); } nextStep(); } @Override protected void onPreExecute() { ProgressDialogFragment.show(mActivity, FRAGMENT_TAG).setCancelable(false); } private boolean wasConfigured(final List<SupportTabSpec> tabs) { for (final SupportTabSpec spec : tabs) { if (classEquals(spec.cls, HomeTimelineFragment.class) || classEquals(spec.cls, MentionsTimelineFragment.class) || classEquals(spec.cls, DirectMessagesFragment.class)) return true; } return false; } } static class InitialSettingsTask extends AbsInitialSettingsTask { InitialSettingsTask(final SettingsWizardActivity activity) { super(activity); } @Override protected void nextStep() { getActivity().gotoLastPage(); } } static class InitialTabSettingsTask extends AbsInitialSettingsTask { InitialTabSettingsTask(final SettingsWizardActivity activity) { super(activity); } @Override protected void nextStep() { getActivity().gotoNextPage(); } } }