package de.robv.android.xposed.installer; import android.app.Fragment; import android.app.FragmentTransaction; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.os.Handler; import android.preference.PreferenceManager; import android.support.design.widget.NavigationView; import android.support.design.widget.Snackbar; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.widget.Toolbar; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.Transformation; import android.widget.LinearLayout; import de.robv.android.xposed.installer.installation.StatusInstallerFragment; import de.robv.android.xposed.installer.util.Loader; import de.robv.android.xposed.installer.util.ModuleUtil; import de.robv.android.xposed.installer.util.ModuleUtil.InstalledModule; import de.robv.android.xposed.installer.util.ModuleUtil.ModuleListener; import de.robv.android.xposed.installer.util.RepoLoader; import de.robv.android.xposed.installer.util.ThemeUtil; public class WelcomeActivity extends XposedBaseActivity implements NavigationView.OnNavigationItemSelectedListener, ModuleListener, Loader.Listener<RepoLoader> { private static final String SELECTED_ITEM_ID = "SELECTED_ITEM_ID"; private final Handler mDrawerHandler = new Handler(); private RepoLoader mRepoLoader; private DrawerLayout mDrawerLayout; private int mPrevSelectedId; private NavigationView mNavigationView; private int mSelectedId; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ThemeUtil.setTheme(this); setContentView(R.layout.activity_welcome); mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); mNavigationView = (NavigationView) findViewById(R.id.navigation_view); assert mNavigationView != null; mNavigationView.setNavigationItemSelectedListener(this); ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) { @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); super.onDrawerSlide(drawerView, 0); // this disables the arrow @ completed state } @Override public void onDrawerSlide(View drawerView, float slideOffset) { super.onDrawerSlide(drawerView, 0); // this disables the animation } }; mDrawerLayout.addDrawerListener(mDrawerToggle); mDrawerToggle.syncState(); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); mSelectedId = mNavigationView.getMenu().getItem(prefs.getInt("default_view", 0)).getItemId(); mSelectedId = savedInstanceState == null ? mSelectedId : savedInstanceState.getInt(SELECTED_ITEM_ID); mPrevSelectedId = mSelectedId; mNavigationView.getMenu().findItem(mSelectedId).setChecked(true); if (savedInstanceState == null) { mDrawerHandler.removeCallbacksAndMessages(null); mDrawerHandler.postDelayed(new Runnable() { @Override public void run() { navigate(mSelectedId); } }, 250); boolean openDrawer = prefs.getBoolean("open_drawer", false); if (openDrawer) mDrawerLayout.openDrawer(GravityCompat.START); else mDrawerLayout.closeDrawers(); } Bundle extras = getIntent().getExtras(); if (extras != null) { int value = extras.getInt("fragment", prefs.getInt("default_view", 0)); switchFragment(value); } mRepoLoader = RepoLoader.getInstance(); ModuleUtil.getInstance().addListener(this); mRepoLoader.addListener(this); notifyDataSetChanged(); } public void switchFragment(int itemId) { mSelectedId = mNavigationView.getMenu().getItem(itemId).getItemId(); mNavigationView.getMenu().findItem(mSelectedId).setChecked(true); mDrawerHandler.removeCallbacksAndMessages(null); mDrawerHandler.postDelayed(new Runnable() { @Override public void run() { navigate(mSelectedId); } }, 250); mDrawerLayout.closeDrawers(); } private void navigate(final int itemId) { final View elevation = findViewById(R.id.elevation); Fragment navFragment = null; switch (itemId) { case R.id.nav_item_framework: mPrevSelectedId = itemId; setTitle(R.string.app_name); navFragment = new StatusInstallerFragment(); break; case R.id.nav_item_modules: mPrevSelectedId = itemId; setTitle(R.string.nav_item_modules); navFragment = new ModulesFragment(); break; case R.id.nav_item_downloads: mPrevSelectedId = itemId; setTitle(R.string.nav_item_download); navFragment = new DownloadFragment(); break; case R.id.nav_item_logs: mPrevSelectedId = itemId; setTitle(R.string.nav_item_logs); navFragment = new LogsFragment(); break; case R.id.nav_item_settings: startActivity(new Intent(this, SettingsActivity.class)); mNavigationView.getMenu().findItem(mPrevSelectedId).setChecked(true); return; case R.id.nav_item_support: startActivity(new Intent(this, SupportActivity.class)); mNavigationView.getMenu().findItem(mPrevSelectedId).setChecked(true); return; case R.id.nav_item_about: startActivity(new Intent(this, AboutActivity.class)); mNavigationView.getMenu().findItem(mPrevSelectedId).setChecked(true); return; } final LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, dp(4)); if (navFragment != null) { FragmentTransaction transaction = getFragmentManager().beginTransaction(); transaction.setCustomAnimations(R.animator.fade_in, R.animator.fade_out); try { transaction.replace(R.id.content_frame, navFragment).commit(); if (elevation != null) { Animation a = new Animation() { @Override protected void applyTransformation(float interpolatedTime, Transformation t) { elevation.setLayoutParams(params); } }; a.setDuration(150); elevation.startAnimation(a); } } catch (IllegalStateException ignored) { } } } public int dp(float value) { float density = getApplicationContext().getResources().getDisplayMetrics().density; if (value == 0) { return 0; } return (int) Math.ceil(density * value); } @Override public boolean onNavigationItemSelected(MenuItem menuItem) { menuItem.setChecked(true); mSelectedId = menuItem.getItemId(); mDrawerHandler.removeCallbacksAndMessages(null); mDrawerHandler.postDelayed(new Runnable() { @Override public void run() { navigate(mSelectedId); } }, 250); mDrawerLayout.closeDrawers(); return true; } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt(SELECTED_ITEM_ID, mSelectedId); } @Override public void onBackPressed() { if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) { mDrawerLayout.closeDrawer(GravityCompat.START); } else { super.onBackPressed(); } } private void notifyDataSetChanged() { View parentLayout = findViewById(R.id.content_frame); String frameworkUpdateVersion = mRepoLoader.getFrameworkUpdateVersion(); boolean moduleUpdateAvailable = mRepoLoader.hasModuleUpdates(); Fragment currentFragment = getFragmentManager().findFragmentById(R.id.content_frame); if (currentFragment instanceof DownloadDetailsFragment) { if (frameworkUpdateVersion != null) { Snackbar.make(parentLayout, R.string.welcome_framework_update_available + " " + String.valueOf(frameworkUpdateVersion), Snackbar.LENGTH_LONG).show(); } } boolean snackBar = XposedApp.getPreferences().getBoolean("snack_bar", true); if (moduleUpdateAvailable && snackBar) { Snackbar.make(parentLayout, R.string.modules_updates_available, Snackbar.LENGTH_LONG).setAction(getString(R.string.view), new View.OnClickListener() { @Override public void onClick(View view) { switchFragment(2); } }).show(); } } @Override public void onInstalledModulesReloaded(ModuleUtil moduleUtil) { notifyDataSetChanged(); } @Override public void onSingleInstalledModuleReloaded(ModuleUtil moduleUtil, String packageName, InstalledModule module) { notifyDataSetChanged(); } @Override public void onReloadDone(RepoLoader loader) { notifyDataSetChanged(); } @Override protected void onDestroy() { super.onDestroy(); ModuleUtil.getInstance().removeListener(this); mRepoLoader.removeListener(this); } }