package moe.feng.nhentai.ui; import android.Manifest; import android.animation.Animator; import android.app.Activity; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.support.annotation.DimenRes; import android.support.design.widget.NavigationView; import android.support.design.widget.Snackbar; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v4.view.ViewCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import android.util.TypedValue; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.animation.AccelerateDecelerateInterpolator; import android.widget.FrameLayout; import io.codetail.animation.ViewAnimationUtils; import moe.feng.nhentai.R; import moe.feng.nhentai.cache.file.FileCacheManager; import moe.feng.nhentai.dao.FavoriteCategoriesManager; import moe.feng.nhentai.model.BaseMessage; import moe.feng.nhentai.ui.fragment.main.DownloadManagerFragment; import moe.feng.nhentai.ui.fragment.main.FavoriteCategoryFragment; import moe.feng.nhentai.ui.fragment.main.FavoriteFragment; import moe.feng.nhentai.ui.fragment.main.HistoryFragment; import moe.feng.nhentai.ui.fragment.main.HomeFragment; import moe.feng.nhentai.util.AsyncTask; import moe.feng.nhentai.util.CrashHandler; import moe.feng.nhentai.util.FilesUtil; import moe.feng.nhentai.util.Settings; import moe.feng.nhentai.util.Updates; public class HomeActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { // View states private static final int SECTION_LATEST = 0, SECTION_FAV_TAB = 1, SECTION_FOLLOWING_ARTISTS = 2; public static Context myContext; // Drawer private DrawerLayout mDrawerLayout; private NavigationView mNavigationView; private ActionBarDrawerToggle mDrawerToggle; // Views private FrameLayout mFragmentLayout; private Toolbar mToolbar; private ActionBar mActionBar; // Fragments private DownloadManagerFragment mFragmentDownload; private HomeFragment mFragmentHome; private FavoriteFragment mFragmentFavBooks; private HistoryFragment mFragmentHistory; private FavoriteCategoryFragment mFragmentFavCategory; private Settings mSets; private Handler mHandler = new Handler(); public static final String TAG = HomeActivity.class.getSimpleName(); public FileCacheManager mFileCacheManager; private static final int REQUEST_CODE_PERMISSION_GET = 101; @Override protected void onCreate(Bundle savedInstanceState) { mSets = Settings.getInstance(getApplicationContext()); CrashHandler.init(getApplicationContext()); CrashHandler.register(); myContext = getApplicationContext(); /** Set up translucent status bar */ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN ); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { getWindow().setStatusBarColor(Color.TRANSPARENT); getWindow().setNavigationBarColor(ContextCompat.getColor(this,R.color.deep_purple_800)); } } super.onCreate(savedInstanceState); setContentView(R.layout.activity_new_home); initViews(); getWindow().setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.background_material_light))); if (PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { if (mSets.getBoolean(Settings.KEY_NO_MEDIA, true)) { FilesUtil.createNewFile(FilesUtil.NOMEDIA_FILE); } onLoadMain(); Updates.check(this); } else { new AlertDialog.Builder(this) .setTitle(R.string.dialog_permission_title) .setMessage(R.string.dialog_permission_msg) .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { ActivityCompat.requestPermissions(HomeActivity.this, new String[]{ Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE }, REQUEST_CODE_PERMISSION_GET); } }) .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { onLoadMain(); } }) .show(); } mFileCacheManager = FileCacheManager.getInstance(getApplicationContext()); if(!mFileCacheManager.checkUpdate()){ mFileCacheManager.deleteCache(); new UpdateData().execute(1); } } private void onLoadMain() { mActionBar.setTitle(R.string.app_name); if (mFragmentHome == null) mFragmentHome = new HomeFragment(); getFragmentManager().beginTransaction() .replace(R.id.fragment_layout, mFragmentHome) .commit(); mToolbar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mFragmentHome.scrollToTop(); } }); mToolbar.setTranslationY(getResources().getDimension(R.dimen.widget_fade_in_translation_y_s)); mToolbar.animate() .translationY(0f) .alpha(1.0f) .setDuration(0) .setStartDelay(0) .start(); mHandler.postDelayed(new Runnable() { @Override public void run() { if (mSets.getInt(Settings.KEY_CELEBRATE, -1) != 2) { Snackbar.make( mDrawerLayout, R.string.celebrate_2016, Snackbar.LENGTH_INDEFINITE ).setAction(R.string.snack_action_get_it, new View.OnClickListener() { @Override public void onClick(View view) { mSets.putInt(Settings.KEY_CELEBRATE, 2); } }).show(); } } }, 1000); } @Override protected void onStop() { super.onStop(); } @Override protected void onResume(){ super.onResume(); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); mDrawerToggle.syncState(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mDrawerToggle.onConfigurationChanged(newConfig); } @Override public boolean onCreateOptionsMenu(Menu menu) { return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (mDrawerToggle.onOptionsItemSelected(item)) { return true; } return super.onOptionsItemSelected(item); } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { if (requestCode == REQUEST_CODE_PERMISSION_GET) { if (grantResults.length > 0) { boolean b = true; for (int i : grantResults) { if (i == PackageManager.PERMISSION_DENIED) { showPermissionDeniedSnackbar(); b = false; break; } } if (b && mSets.getBoolean(Settings.KEY_NO_MEDIA, true)) { FilesUtil.createNewFile(FilesUtil.NOMEDIA_FILE); } } else { showPermissionDeniedSnackbar(); } onLoadMain(); } } private void showPermissionDeniedSnackbar() { Snackbar.make(mFragmentLayout, R.string.snack_permission_failed, Snackbar.LENGTH_INDEFINITE) .setAction(R.string.snack_action_try_again, new View.OnClickListener() { @Override public void onClick(View view) { ActivityCompat.requestPermissions(HomeActivity.this, new String[]{ Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE }, REQUEST_CODE_PERMISSION_GET); } }) .show(); } private void initViews() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { $(R.id.status_bar_header).setVisibility(View.VISIBLE); } mToolbar = $(R.id.toolbar); setSupportActionBar(mToolbar); mActionBar = getSupportActionBar(); mDrawerLayout = $(R.id.drawer_layout); mNavigationView = $(R.id.navigation_view); mDrawerToggle = new MyDrawerToggle(); mNavigationView.setNavigationItemSelectedListener(this); mNavigationView.setBackgroundResource(R.color.background_material_light); mDrawerLayout.addDrawerListener(new MyDrawerListener()); mDrawerLayout.post(new Runnable() { @Override public void run() { mDrawerToggle.syncState(); } }); mDrawerLayout.addDrawerListener(mDrawerToggle); mFragmentLayout = $(R.id.fragment_layout); } @Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); } @Override public boolean onNavigationItemSelected(MenuItem item) { mDrawerLayout.closeDrawers(); int id = item.getItemId(); switch (id) { case R.id.navigation_item_home: mActionBar.setTitle(R.string.app_name); ViewCompat.setElevation(mToolbar, calcDimens(R.dimen.appbar_elevation)); if (mFragmentHome == null) mFragmentHome = new HomeFragment(); getFragmentManager().beginTransaction() .replace(R.id.fragment_layout, mFragmentHome) .commit(); mToolbar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mFragmentHome.scrollToTop(); } }); return true; case R.id.navigation_item_download: mActionBar.setTitle(R.string.item_download); ViewCompat.setElevation(mToolbar, calcDimens(R.dimen.appbar_elevation)); if (mFragmentDownload == null) mFragmentDownload = new DownloadManagerFragment(); getFragmentManager().beginTransaction() .replace(R.id.fragment_layout, mFragmentDownload) .commit(); mToolbar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mFragmentDownload.scrollToTop(); } }); return true; case R.id.navigation_item_fav_books: mActionBar.setTitle(R.string.item_favorite_books); ViewCompat.setElevation(mToolbar, calcDimens(R.dimen.appbar_elevation)); if (mFragmentFavBooks == null) mFragmentFavBooks = new FavoriteFragment(); getFragmentManager().beginTransaction() .replace(R.id.fragment_layout, mFragmentFavBooks) .commit(); mToolbar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mFragmentFavBooks.scrollToTop(); } }); return true; case R.id.navigation_item_recent: mActionBar.setTitle(R.string.item_recent); mFragmentLayout.setVisibility(View.VISIBLE); ViewCompat.setElevation(mToolbar, calcDimens(R.dimen.appbar_elevation)); if (mFragmentHistory == null) mFragmentHistory = new HistoryFragment(); getFragmentManager().beginTransaction() .replace(R.id.fragment_layout, mFragmentHistory) .commit(); mToolbar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mFragmentHistory.scrollToTop(); } }); return true; case R.id.navigation_item_fav_categories: FavoriteCategoriesManager.getInstance(getApplicationContext()).reload(); mActionBar.setTitle(R.string.item_favorite_categories); mFragmentLayout.setVisibility(View.VISIBLE); ViewCompat.setElevation(mToolbar, calcDimens(R.dimen.appbar_elevation)); if (mFragmentFavCategory == null) mFragmentFavCategory = new FavoriteCategoryFragment(); getFragmentManager().beginTransaction() .replace(R.id.fragment_layout, mFragmentFavCategory) .commit(); mToolbar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mFragmentFavCategory.scrollToTop(); } }); return true; case R.id.navigation_item_settings: SettingsActivity.launchActivity(this, SettingsActivity.FLAG_MAIN); return true; case R.id.navigation_item_donate: new AlertDialog.Builder(this) .setTitle(R.string.dialog_donate_title) .setMessage(R.string.dialog_donate_message) .setNegativeButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { } }) .show(); return true; case R.id.navigation_item_open_nhentai: Uri uri = Uri.parse("https://nhentai.net"); startActivity(new Intent(Intent.ACTION_VIEW, uri)); return true; } return false; } private int calcDimens(@DimenRes int... dimenIds) { int result = 0; for (int dimenId : dimenIds) { result += getResources().getDimensionPixelSize(dimenId); } return result; } private <T extends View> T $(int id) { return (T) findViewById(id); } @Override public void onStart() { super.onStart(); } private class UpdateData extends AsyncTask<Integer, Void, BaseMessage> { @Override protected BaseMessage doInBackground(Integer... params) { mFileCacheManager.updateExternalBooks(); return null; } @Override protected void onPostExecute(BaseMessage msg) { Log.d(TAG, "Update Data Complete "); } } private class MyDrawerListener implements DrawerLayout.DrawerListener { @Override public void onDrawerOpened(View drawerView) { mDrawerToggle.onDrawerOpened(drawerView); } @Override public void onDrawerClosed(View drawerView) { mDrawerToggle.onDrawerClosed(drawerView); } @Override public void onDrawerSlide(View drawerView, float slideOffset) { mDrawerToggle.onDrawerSlide(drawerView, slideOffset); } @Override public void onDrawerStateChanged(int newState) { mDrawerToggle.onDrawerStateChanged(newState); } } private class MyDrawerToggle extends ActionBarDrawerToggle { public MyDrawerToggle() { super(HomeActivity.this, mDrawerLayout, mToolbar, R.string.abc_action_bar_home_description, R.string.abc_action_bar_home_description ); } public MyDrawerToggle(Activity activity, DrawerLayout drawerLayout, Toolbar toolbar, int openDrawerContentDescRes, int closeDrawerContentDescRes) { super(activity, drawerLayout, toolbar, openDrawerContentDescRes, closeDrawerContentDescRes); } @Override public void onDrawerClosed(View drawerView) { super.onDrawerClosed(drawerView); supportInvalidateOptionsMenu(); } @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); supportInvalidateOptionsMenu(); } } }