/* * Copyright (C) 2013 - 2014 Alexander "Evisceration" Martinz * * 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.namelessrom.devicecontrol.modules.wizard; import android.graphics.Color; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.Button; import android.widget.Toast; import com.balysv.materialmenu.MaterialMenuDrawable; import com.balysv.materialmenu.extras.toolbar.MaterialMenuIconToolbar; import org.namelessrom.devicecontrol.R; import org.namelessrom.devicecontrol.activities.BaseActivity; import org.namelessrom.devicecontrol.models.TaskerConfig; import org.namelessrom.devicecontrol.modules.tasker.TaskerItem; import org.namelessrom.devicecontrol.modules.wizard.setup.AbstractSetupData; import org.namelessrom.devicecontrol.modules.wizard.setup.Page; import org.namelessrom.devicecontrol.modules.wizard.setup.PageList; import org.namelessrom.devicecontrol.modules.wizard.setup.SetupDataCallbacks; import org.namelessrom.devicecontrol.modules.wizard.setup.TaskerSetupWizardData; import org.namelessrom.devicecontrol.modules.wizard.ui.StepPagerStrip; import timber.log.Timber; public class AddTaskActivity extends BaseActivity implements SetupDataCallbacks { public static final String ARG_ITEM = "arg_item"; private ViewPager mViewPager; private StepPagerStrip mStepPagerStrip; private CustomPagerAdapter mPagerAdapter; private Button mNextButton; private Button mPrevButton; private PageList mPageList; private AbstractSetupData mSetupData; private final Handler mHandler = new Handler(); private static long mBackPressed; private Toast mToast; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.wizard_activity); // setup action bar final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); // setup material menu icon final MaterialMenuIconToolbar materialMenu = new MaterialMenuIconToolbar(this, Color.WHITE, MaterialMenuDrawable.Stroke.THIN) { @Override public int getToolbarViewId() { return R.id.toolbar; } }; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { materialMenu.setNeverDrawTouch(true); } materialMenu.animateState(MaterialMenuDrawable.IconState.ARROW); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onBackPressed(); } }); mSetupData = (AbstractSetupData) getLastNonConfigurationInstance(); if (mSetupData == null) { mSetupData = new TaskerSetupWizardData(this); } if (savedInstanceState != null) { mSetupData.load(savedInstanceState.getBundle("data")); } final TaskerItem item = (TaskerItem) getIntent().getSerializableExtra(ARG_ITEM); Timber.v("TaskerItem: %s", item == null ? "null" : item.toString()); if (item != null) { mSetupData.setSetupData(item); toolbar.setTitle(R.string.edit_task); } if (mSetupData.getSetupData() == null) { mSetupData.setSetupData(new TaskerItem()); } mNextButton = (Button) findViewById(R.id.next_button); mPrevButton = (Button) findViewById(R.id.prev_button); mSetupData.registerListener(this); mPagerAdapter = new CustomPagerAdapter(getSupportFragmentManager()); mViewPager = (ViewPager) findViewById(R.id.pager); mViewPager.setAdapter(mPagerAdapter); mViewPager.setPageMargin(getResources().getDimensionPixelOffset(R.dimen.app_margin)); mViewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { mStepPagerStrip.setCurrentPage(position); if (position < mPageList.size()) { onPageLoaded(mPageList.get(position)); } } }); mStepPagerStrip = (StepPagerStrip) findViewById(R.id.strip); mStepPagerStrip.setOnPageSelectedListener(new StepPagerStrip.OnPageSelectedListener() { @Override public void onPageStripSelected(int position) { position = Math.min(mPagerAdapter.getCount() - 1, position); if (mViewPager.getCurrentItem() != position) { mViewPager.setCurrentItem(position); } } }); mNextButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { doNext(); } }); mPrevButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { doPrevious(); } }); onPageTreeChanged(); } @Override protected void onResume() { super.onResume(); onPageTreeChanged(); } @Override protected void onDestroy() { mSetupData.unregisterListener(this); super.onDestroy(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putBundle("data", mSetupData.save()); } @Override public void onBackPressed() { doPrevious(); } public void doNext() { mHandler.post(new Runnable() { @Override public void run() { final int currentItem = mViewPager.getCurrentItem(); final Page currentPage = mPageList.get(currentItem); if (currentPage.getId() == R.string.setup_complete) { final TaskerItem item = mSetupData.getSetupData(); TaskerConfig.get().deleteItem(item).addItem(item).save(); finishSetup(); } else { mViewPager.setCurrentItem(currentItem + 1, true); } } }); } public void doPrevious() { mHandler.post(new Runnable() { @Override public void run() { final int currentItem = mViewPager.getCurrentItem(); if (currentItem > 0) { mViewPager.setCurrentItem(currentItem - 1, true); } else { shouldExit(); } } }); } private void shouldExit() { if (mBackPressed + 2000 > System.currentTimeMillis()) { if (mToast != null) { mToast.cancel(); } finish(); } else { mToast = Toast.makeText(getBaseContext(), getString(R.string.action_press_again), Toast.LENGTH_SHORT); mToast.show(); } mBackPressed = System.currentTimeMillis(); } private void updateNextPreviousState() { final int position = mViewPager.getCurrentItem(); mNextButton.setEnabled(position != mPagerAdapter.getCutOffPage()); mPrevButton.setVisibility(position <= 0 ? View.INVISIBLE : View.VISIBLE); } @Override public void onPageLoaded(Page page) { mNextButton.setText(page.getNextButtonResId()); if (page.isRequired()) { if (recalculateCutOffPage()) { mPagerAdapter.notifyDataSetChanged(); } } page.refresh(); updateNextPreviousState(); } @Override public void onPageTreeChanged() { mPageList = mSetupData.getPageList(); recalculateCutOffPage(); mPagerAdapter.notifyDataSetChanged(); updateNextPreviousState(); mStepPagerStrip.setPageCount(mPageList.size()); } @Override public Page getPage(String key) { return mSetupData.findPage(key); } @Override public TaskerItem getSetupData() { return mSetupData.getSetupData(); } @Override public void setSetupData(final TaskerItem item) { mSetupData.setSetupData(item); } @Override public void onPageFinished(final Page page) { mHandler.post(new Runnable() { @Override public void run() { doNext(); onPageTreeChanged(); } }); } private boolean recalculateCutOffPage() { // Cut off the pager adapter at first required page that isn't completed int cutOffPage = mPageList.size(); Page page; for (int i = 0; i < mPageList.size(); i++) { page = mPageList.get(i); if (page.isRequired() && !page.isCompleted()) { cutOffPage = i; break; } } if (mPagerAdapter.getCutOffPage() != cutOffPage) { mPagerAdapter.setCutOffPage(cutOffPage); return true; } return false; } private void finishSetup() { finish(); } private class CustomPagerAdapter extends FragmentStatePagerAdapter { private int mCutOffPage; private CustomPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int i) { return mPageList.get(i).createFragment(); } @Override public int getItemPosition(Object object) { return POSITION_NONE; } @Override public int getCount() { if (mPageList == null) { return 0; } return Math.min(mCutOffPage + 1, mPageList.size()); } public void setCutOffPage(int cutOffPage) { if (cutOffPage < 0) { cutOffPage = Integer.MAX_VALUE; } mCutOffPage = cutOffPage; } public int getCutOffPage() { return mCutOffPage; } } }