package com.james.status.activities; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.StringRes; import android.support.design.widget.AppBarLayout; import android.support.design.widget.BottomSheetBehavior; import android.support.design.widget.TabLayout; import android.support.v4.view.MenuItemCompat; import android.support.v4.view.ViewCompat; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.SearchView; import android.support.v7.widget.SwitchCompat; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.CompoundButton; import android.widget.TextView; import com.james.status.R; import com.james.status.Status; import com.james.status.adapters.SimplePagerAdapter; import com.james.status.fragments.AppPreferenceFragment; import com.james.status.fragments.GeneralPreferenceFragment; import com.james.status.fragments.HelpFragment; import com.james.status.fragments.IconPreferenceFragment; import com.james.status.services.StatusService; import com.james.status.utils.PreferenceUtils; import com.james.status.utils.StaticUtils; public class MainActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener { private Status status; private SwitchCompat service; private SearchView searchView; private AppBarLayout appbar; private TabLayout tabLayout; private ViewPager viewPager; private SimplePagerAdapter adapter; private View bottomSheet, expand; private TextView title, content; private BottomSheetBehavior behavior; private MenuItem resetItem, notificationItem; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); status = (Status) getApplicationContext(); if (!StaticUtils.isAccessibilityGranted(this) || !StaticUtils.isNotificationGranted(this) || !StaticUtils.isPermissionsGranted(this) || !StaticUtils.isIgnoringOptimizations(this) || !StaticUtils.canDrawOverlays(this)) startActivity(new Intent(this, StartActivity.class)); setSupportActionBar((Toolbar) findViewById(R.id.toolbar)); appbar = (AppBarLayout) findViewById(R.id.appbar); tabLayout = (TabLayout) findViewById(R.id.tabLayout); service = (SwitchCompat) findViewById(R.id.serviceEnabled); viewPager = (ViewPager) findViewById(R.id.viewPager); bottomSheet = findViewById(R.id.bottomSheet); expand = findViewById(R.id.expand); title = (TextView) findViewById(R.id.title); content = (TextView) findViewById(R.id.content); ViewCompat.setElevation(bottomSheet, StaticUtils.getPixelsFromDp(10)); behavior = BottomSheetBehavior.from(bottomSheet); behavior.setState(BottomSheetBehavior.STATE_HIDDEN); behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() { @Override public void onStateChanged(@NonNull View bottomSheet, int newState) { if (newState == BottomSheetBehavior.STATE_EXPANDED) { content.animate().alpha(1).start(); expand.animate().alpha(0).start(); } else { content.animate().alpha(0).start(); expand.animate().alpha(1).start(); } } @Override public void onSlide(@NonNull View bottomSheet, float slideOffset) { } }); bottomSheet.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (behavior.getState() == BottomSheetBehavior.STATE_COLLAPSED) behavior.setState(BottomSheetBehavior.STATE_EXPANDED); else if (behavior.getState() == BottomSheetBehavior.STATE_EXPANDED) { OnTutorialClickListener listener = (OnTutorialClickListener) v.getTag(); if (listener != null) listener.onClick(); behavior.setState(BottomSheetBehavior.STATE_HIDDEN); } } }); expand.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { behavior.setState(BottomSheetBehavior.STATE_EXPANDED); } }); appbar.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { @Override public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { if (verticalOffset != 0 && behavior != null && behavior.getState() == BottomSheetBehavior.STATE_EXPANDED) behavior.setState(BottomSheetBehavior.STATE_COLLAPSED); } }); Boolean enabled = PreferenceUtils.getBooleanPreference(this, PreferenceUtils.PreferenceIdentifier.STATUS_ENABLED); service.setChecked((enabled != null && enabled) || StaticUtils.isStatusServiceRunning(this)); service.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { if (b) { PreferenceUtils.putPreference(MainActivity.this, PreferenceUtils.PreferenceIdentifier.STATUS_ENABLED, true); Intent intent = new Intent(StatusService.ACTION_START); intent.setClass(MainActivity.this, StatusService.class); startService(intent); } else { PreferenceUtils.putPreference(MainActivity.this, PreferenceUtils.PreferenceIdentifier.STATUS_ENABLED, false); Intent intent = new Intent(StatusService.ACTION_STOP); intent.setClass(MainActivity.this, StatusService.class); stopService(intent); } } }); adapter = new SimplePagerAdapter(this, getSupportFragmentManager(), viewPager, new GeneralPreferenceFragment(), new IconPreferenceFragment(), new AppPreferenceFragment(), new HelpFragment()); viewPager.setAdapter(adapter); viewPager.addOnPageChangeListener(this); tabLayout.setupWithViewPager(viewPager); } public void setTutorial(@StringRes int titleRes, @StringRes int contentRes, OnTutorialClickListener listener) { title.setText(titleRes); content.setText(contentRes); behavior.setState(BottomSheetBehavior.STATE_COLLAPSED); appbar.setExpanded(true, true); bottomSheet.setTag(listener); } @Override protected void onResume() { super.onResume(); if (behavior.getState() == BottomSheetBehavior.STATE_HIDDEN) { if (StaticUtils.isAccessibilityGranted(this) && StaticUtils.isNotificationGranted(this) && StaticUtils.isPermissionsGranted(this) && !StaticUtils.isStatusServiceRunning(this) && StaticUtils.shouldShowTutorial(this, "enable")) { setTutorial(R.string.tutorial_enable, R.string.tutorial_enable_desc, new OnTutorialClickListener() { @Override public void onClick() { if (service != null) service.setChecked(true); } }); } else if (searchView != null && StaticUtils.shouldShowTutorial(MainActivity.this, "search", 1)) { setTutorial(R.string.tutorial_search, R.string.tutorial_search_desc, new OnTutorialClickListener() { @Override public void onClick() { if (searchView != null) searchView.setIconified(false); } }); } else if (tabLayout != null && viewPager != null && viewPager.getCurrentItem() != 3 && StaticUtils.shouldShowTutorial(MainActivity.this, "faqs", 2)) { setTutorial(R.string.tutorial_help, R.string.tutorial_help_desc, new OnTutorialClickListener() { @Override public void onClick() { if (viewPager != null) viewPager.setCurrentItem(3); } }); } else if (StaticUtils.shouldShowTutorial(MainActivity.this, "donate", 3)) { setTutorial(R.string.tutorial_donate, R.string.tutorial_donate_desc, new OnTutorialClickListener() { @Override public void onClick() { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=james.donate"))); } }); } } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); resetItem = menu.findItem(R.id.action_reset); notificationItem = menu.findItem(R.id.action_toggle_notifications); searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_search)); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { adapter.filter(viewPager.getCurrentItem(), query.toLowerCase()); appbar.setExpanded(true); return true; } @Override public boolean onQueryTextChange(String newText) { adapter.filter(viewPager.getCurrentItem(), newText.toLowerCase()); appbar.setExpanded(true); return true; } }); searchView.setOnCloseListener(new SearchView.OnCloseListener() { @Override public boolean onClose() { adapter.filter(viewPager.getCurrentItem(), null); return false; } }); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_setup: startActivity(new Intent(this, StartActivity.class)); break; case R.id.action_tutorial: SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); SharedPreferences.Editor editor = prefs.edit(); for (String key : prefs.getAll().keySet()) { if (key.startsWith("tutorial")) editor.remove(key); } editor.apply(); break; case R.id.action_about: startActivity(new Intent(this, AboutActivity.class)); break; case R.id.action_reset: if (adapter.getItem(viewPager.getCurrentItem()) instanceof AppPreferenceFragment) ((AppPreferenceFragment) adapter.getItem(viewPager.getCurrentItem())).reset(); break; case R.id.action_toggle_notifications: if (adapter.getItem(viewPager.getCurrentItem()) instanceof AppPreferenceFragment) { boolean isNotifications = ((AppPreferenceFragment) adapter.getItem(viewPager.getCurrentItem())).isNotifications(); ((AppPreferenceFragment) adapter.getItem(viewPager.getCurrentItem())).setNotifications(!isNotifications); item.setTitle(!isNotifications ? R.string.notifications_disable : R.string.notifications_enable); } break; } return super.onOptionsItemSelected(item); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); status.onActivityResult(requestCode, resultCode, data); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { if (resetItem != null && notificationItem != null) { if (adapter.getItem(position) instanceof AppPreferenceFragment) { resetItem.setVisible(true); notificationItem.setVisible(true); notificationItem.setTitle(((AppPreferenceFragment) adapter.getItem(position)).isNotifications() ? R.string.notifications_disable : R.string.notifications_enable); } else { resetItem.setVisible(false); notificationItem.setVisible(false); } } if (behavior != null && behavior.getState() == BottomSheetBehavior.STATE_HIDDEN) { switch (position) { case 1: if (StaticUtils.shouldShowTutorial(this, "disableicon")) { setTutorial(R.string.tutorial_icon_switch, R.string.tutorial_icon_switch_desc, null); } else if (StaticUtils.shouldShowTutorial(this, "moveicon", 1)) { setTutorial(R.string.tutorial_icon_order, R.string.tutorial_icon_order_desc, null); } break; case 2: if (StaticUtils.shouldShowTutorial(this, "activities")) { setTutorial(R.string.tutorial_activities, R.string.tutorial_activities_desc, null); } break; } } } @Override public void onPageScrollStateChanged(int state) { } public interface OnTutorialClickListener { void onClick(); } }