package com.kenny.openimgur.activities; import android.app.Activity; import android.app.Fragment; import android.app.FragmentManager; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.ColorStateList; import android.net.Uri; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.annotation.Nullable; import android.support.design.widget.AppBarLayout; import android.support.design.widget.CoordinatorLayout; import android.support.design.widget.FloatingActionButton; 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.ActionBar; import android.support.v7.app.AlertDialog; import android.support.v7.widget.Toolbar; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.CheckBox; import android.widget.ImageView; import android.widget.Spinner; import android.widget.TextView; import com.amulyakhare.textdrawable.TextDrawable; import com.kenny.openimgur.R; import com.kenny.openimgur.classes.FragmentListener; import com.kenny.openimgur.classes.ImgurTheme; import com.kenny.openimgur.classes.ImgurTopic; import com.kenny.openimgur.classes.ImgurUser; import com.kenny.openimgur.classes.OpengurApp; import com.kenny.openimgur.fragments.BaseGridFragment; import com.kenny.openimgur.fragments.GalleryFragment; import com.kenny.openimgur.fragments.MemeFragment; import com.kenny.openimgur.fragments.RandomFragment; import com.kenny.openimgur.fragments.RedditFragment; import com.kenny.openimgur.fragments.TopicsFragment; import com.kenny.openimgur.fragments.UploadedPhotosFragment; import com.kenny.openimgur.ui.adapters.TopicsAdapter; import com.kenny.openimgur.util.LogUtil; import com.kenny.openimgur.util.RequestCodes; import com.kenny.openimgur.util.SqlHelper; import java.util.List; import butterknife.BindView; import butterknife.OnClick; /** * Created by kcampagna on 10/19/14. */ public class MainActivity extends BaseActivity implements FragmentListener, NavigationView.OnNavigationItemSelectedListener, View.OnClickListener { private static final String KEY_CURRENT_PAGE = "current_page"; public static final int PAGE_PROFILE = 0; public static final int PAGE_GALLERY = 1; public static final int PAGE_TOPICS = 2; public static final int PAGE_MEME = 3; public static final int PAGE_SUBREDDIT = 4; public static final int PAGE_RANDOM = 5; public static final int PAGE_UPLOADS = 6; public static final int PAGE_SETTINGS = 7; public static final int PAGE_BETA = 8; public static final int PAGE_FEEDBACK = 9; @BindView(R.id.drawerLayout) DrawerLayout mDrawer; @BindView(R.id.fab) FloatingActionButton mUploadButton; @BindView(R.id.toolBar) Toolbar mToolBar; @BindView(R.id.navigationView) NavigationView mNavigationView; @BindView(R.id.topicsSpinner) Spinner mTopicsSpinner; @BindView(R.id.appbar) AppBarLayout mAppBar; @BindView(R.id.coordinatorLayout) CoordinatorLayout mCoordinatorLayout; ImageView mAvatar; TextView mName; TextView mRep; TextView mBadge; View mBadgeContainer; private int mCurrentPage = -1; private ImgurTheme mSavedTheme; private boolean mIsDarkTheme; private boolean mNagOnExit; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); View headerView = mNavigationView.getHeaderView(0); mAvatar = (ImageView) headerView.findViewById(R.id.profileImg); mName = (TextView) headerView.findViewById(R.id.profileName); mRep = (TextView) headerView.findViewById(R.id.reputation); mBadge = (TextView) headerView.findViewById(R.id.badgeCount); mBadgeContainer = headerView.findViewById(R.id.badgeContainer); mBadgeContainer.setOnClickListener(this); headerView.setOnClickListener(this); mNavigationView.setNavigationItemSelectedListener(this); ColorStateList selector = theme.getNavigationColors(getResources()); mNavigationView.setItemTextColor(selector); mNavigationView.setItemIconTintList(selector); setupToolBar(); mNagOnExit = app.getPreferences().getBoolean(SettingsActivity.KEY_CONFIRM_EXIT, true); mTopicsSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { Fragment fragment = getFragmentManager().findFragmentById(R.id.container); // Should always be the case if the spinner is visible if (fragment instanceof TopicsFragment) { ImgurTopic topic = (ImgurTopic) mTopicsSpinner.getAdapter().getItem(mTopicsSpinner.getSelectedItemPosition()); ((TopicsFragment) fragment).onTopicChanged(topic); } } @Override public void onNothingSelected(AdapterView<?> parent) { // NOOP } }); } /** * Sets up the tool bar to take the place of the action bar */ private void setupToolBar() { setSupportActionBar(mToolBar); ActionBar ab = getSupportActionBar(); ab.setDisplayHomeAsUpEnabled(true); ab.setHomeAsUpIndicator(R.drawable.ic_action_navigation_menu_24dp); ab.setHomeButtonEnabled(true); } @Override public boolean onNavigationItemSelected(MenuItem menuItem) { if (menuItem.getGroupId() != R.id.nonCheckableGroup) menuItem.setChecked(true); changePage(menuItem.getItemId()); mDrawer.closeDrawers(); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: mDrawer.openDrawer(GravityCompat.START); return true; } return super.onOptionsItemSelected(item); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); // Dismiss any filter fragments that might be left behind if (getFragmentManager().findFragmentByTag("filter") != null) { FragmentManager fm = getFragmentManager(); fm.beginTransaction().remove(fm.findFragmentByTag("filter")).commitAllowingStateLoss(); } int fragmentPage; int menuItemId = R.id.nav_gallery; if (savedInstanceState == null) { fragmentPage = app.getPreferences().getInt(KEY_CURRENT_PAGE, PAGE_GALLERY); } else { fragmentPage = savedInstanceState.getInt(KEY_CURRENT_PAGE, PAGE_GALLERY); } if (mNavigationView.getMenu() != null) { switch (fragmentPage) { case PAGE_TOPICS: menuItemId = R.id.nav_topics; break; case PAGE_SUBREDDIT: menuItemId = R.id.nav_reddit; break; case PAGE_MEME: menuItemId = R.id.nav_meme; break; case PAGE_RANDOM: menuItemId = R.id.nav_random; break; case PAGE_UPLOADS: menuItemId = R.id.nav_uploads; break; case PAGE_GALLERY: default: menuItemId = R.id.nav_gallery; break; } MenuItem item = mNavigationView.getMenu().findItem(menuItemId); if (item != null) item.setChecked(true); } if (getFragmentManager().findFragmentById(R.id.container) == null) changePage(menuItemId); updateUserHeader(user); checkForImgurNag(); } private void updateUserHeader(@Nullable ImgurUser user) { if (user != null) { int size = getResources().getDimensionPixelSize(R.dimen.avatar_size); String firstLetter = user.getUsername().substring(0, 1).toUpperCase(); mAvatar.setImageDrawable(new TextDrawable.Builder() .setWidth(size) .setHeight(size) .setShape(TextDrawable.DRAWABLE_SHAPE_OVAL) .setColor(getResources().getColor(theme.accentColor)) .setText(firstLetter) .build()); mName.setText(user.getUsername()); mRep.setText(user.getNotoriety().getStringId()); mBadgeContainer.setVisibility(View.VISIBLE); int notificationCount = SqlHelper.getInstance(getApplicationContext()).getNotifications(true).size(); updateNotificationBadge(notificationCount); } else { mAvatar.setImageResource(R.drawable.ic_account_circle_24dp); mName.setText(R.string.profile); mRep.setText(R.string.login_msg); mBadge.setVisibility(View.GONE); mBadgeContainer.setVisibility(View.GONE); } } private void updateNotificationBadge(int notificationCount) { mBadge.setVisibility(notificationCount > 0 ? View.VISIBLE : View.GONE); String badgeText = null; if (notificationCount > 0) { badgeText = notificationCount > 9 ? "9+" : String.valueOf(notificationCount); } mBadge.setText(badgeText); } /** * Changes the fragment * * @param menuItemId The menu item id of the page selected */ private void changePage(int menuItemId) { Fragment fragment = null; switch (menuItemId) { case R.id.nav_gallery: if (mCurrentPage == PAGE_GALLERY) return; fragment = GalleryFragment.newInstance(); mCurrentPage = PAGE_GALLERY; break; case R.id.nav_reddit: if (mCurrentPage == PAGE_SUBREDDIT) return; fragment = RedditFragment.newInstance(); mCurrentPage = PAGE_SUBREDDIT; break; case R.id.nav_random: if (mCurrentPage == PAGE_RANDOM) return; fragment = RandomFragment.newInstance(); mCurrentPage = PAGE_RANDOM; break; case R.id.nav_uploads: if (mCurrentPage == PAGE_UPLOADS) return; fragment = UploadedPhotosFragment.createInstance(); mCurrentPage = PAGE_UPLOADS; break; case R.id.nav_settings: mSavedTheme = ImgurTheme.copy(theme); mIsDarkTheme = app.getPreferences().getBoolean(SettingsActivity.KEY_DARK_THEME, mSavedTheme.isDarkTheme); startActivityForResult(SettingsActivity.createIntent(getApplicationContext()), RequestCodes.SETTINGS); break; case R.id.nav_feedback: Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts( "mailto", "kennyc.developer@gmail.com", null)); emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Opengur Feedback"); share(emailIntent, R.string.send_feedback); break; case R.id.nav_topics: if (mCurrentPage == PAGE_TOPICS) return; fragment = new TopicsFragment(); mCurrentPage = PAGE_TOPICS; break; case R.id.nav_meme: if (mCurrentPage == PAGE_MEME) return; fragment = new MemeFragment(); mCurrentPage = PAGE_MEME; break; case R.id.nav_beta: new AlertDialog.Builder(this, theme.getAlertDialogTheme()) .setTitle(R.string.beta_test) .setMessage(R.string.beta_message) .setNegativeButton(R.string.beta_no, null) .setPositiveButton(R.string.beta_confirm, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/apps/testing/com.kennyc.open.imgur")); if (browserIntent.resolveActivity(getPackageManager()) != null) { startActivity(browserIntent); } else { Snackbar.make(mCoordinatorLayout, R.string.cant_launch_intent, Snackbar.LENGTH_LONG).show(); } } }).show(); break; } if (fragment != null) { getFragmentManager().beginTransaction().replace(R.id.container, fragment).commit(); boolean hasSpinner = fragment instanceof TopicsFragment; mTopicsSpinner.setVisibility(hasSpinner ? View.VISIBLE : View.GONE); getSupportActionBar().setDisplayShowTitleEnabled(!hasSpinner); mAppBar.setExpanded(true); app.getPreferences().edit().putInt(KEY_CURRENT_PAGE, mCurrentPage).apply(); } } @Override protected void onSaveInstanceState(Bundle outState) { outState.putInt(KEY_CURRENT_PAGE, mCurrentPage); super.onSaveInstanceState(outState); } @Override public void onFragmentStateChange(@FragmentState int state) { switch (state) { case FragmentListener.STATE_LOADING_COMPLETE: mUploadButton.show(); break; case FragmentListener.STATE_LOADING_STARTED: case FragmentListener.STATE_ERROR: mUploadButton.hide(); break; } } @Override public void onUpdateActionBarTitle(String title) { ActionBar ab = getSupportActionBar(); if (ab != null) ab.setTitle(title); } @Override public void onUpdateActionBarSpinner(List<ImgurTopic> topics, @Nullable ImgurTopic currentTopic) { int selectedPosition = 0; if (currentTopic != null) { for (int i = 0; i < topics.size(); i++) { if (topics.get(i).equals(currentTopic)) { selectedPosition = i; break; } } } mTopicsSpinner.setAdapter(new TopicsAdapter(this, topics)); mTopicsSpinner.setSelection(selectedPosition); } @Override public View getSnackbarView() { return mCoordinatorLayout; } @OnClick(R.id.fab) @Override public void onClick(View view) { switch (view.getId()) { case R.id.fab: startActivity(UploadActivity.createIntent(getApplicationContext())); break; case R.id.header: mDrawer.closeDrawers(); startActivityForResult(ProfileActivity.createIntent(getApplicationContext(), null), RequestCodes.PROFILE); break; case R.id.badgeContainer: mDrawer.closeDrawers(); startActivityForResult(NotificationActivity.createIntent(getApplicationContext()), RequestCodes.NOTIFICATIONS); break; } } @Override public void onBackPressed() { if (mDrawer.isDrawerOpen(GravityCompat.START)) { mDrawer.closeDrawers(); return; } else if (mNagOnExit) { showExitNag(); return; } super.onBackPressed(); } private void showExitNag() { new AlertDialog.Builder(this, theme.getAlertDialogTheme()) .setTitle(R.string.exit) .setView(R.layout.exit_nag) .setNegativeButton(R.string.cancel, null) .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (dialog instanceof AlertDialog) { CheckBox cb = (CheckBox) ((AlertDialog) dialog).findViewById(R.id.askAgainCB); if (cb != null && cb.isChecked()) { app.getPreferences().edit().putBoolean(SettingsActivity.KEY_CONFIRM_EXIT, false).apply(); } } else { LogUtil.w(TAG, "Dialog was not an alert dialog... but how?"); } finish(); } }).show(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { // Set the theme if coming from the settings activity case RequestCodes.SETTINGS: ImgurTheme theme = OpengurApp.getInstance(getApplicationContext()).getImgurTheme(); mNagOnExit = app.getPreferences().getBoolean(SettingsActivity.KEY_CONFIRM_EXIT, true); if (mSavedTheme == null || theme != mSavedTheme || mIsDarkTheme != theme.isDarkTheme) { Intent intent = getIntent(); overridePendingTransition(0, 0); intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); finish(); overridePendingTransition(0, 0); startActivity(intent); } Fragment fragment = getFragmentManager().findFragmentById(R.id.container); if (fragment instanceof BaseGridFragment) { fragment.onActivityResult(requestCode, resultCode, data); } break; case RequestCodes.PROFILE: if (resultCode == Activity.RESULT_OK && data != null) { if (data.getBooleanExtra(ProfileActivity.KEY_LOGGED_IN, false)) { app = OpengurApp.getInstance(getApplicationContext()); updateUserHeader(app.getUser()); } else if (data.getBooleanExtra(ProfileActivity.KEY_LOGGED_OUT, false)) { updateUserHeader(null); } } break; case RequestCodes.NOTIFICATIONS: // Notifications will clear when going into the activity updateNotificationBadge(0); if (data != null && data.getBooleanExtra(NotificationActivity.KEY_USER_NOT_LOGGED_IN, false)) { updateUserHeader(null); } break; } super.onActivityResult(requestCode, resultCode, data); } private void checkForImgurNag() { SharedPreferences pf = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); if (pf.getBoolean("showImgurNag", true)) { new AlertDialog.Builder(this, theme.getAlertDialogTheme()) .setTitle(R.string.unsupported) .setMessage(R.string.unsupported_msg) .setNegativeButton(R.string.close, null) .setPositiveButton(R.string.install, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { String imgurPackage = "com.imgur.mobile"; try { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + imgurPackage))); } catch (android.content.ActivityNotFoundException anfe) { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=" + imgurPackage))); } } }).show(); pf.edit().putBoolean("showImgurNag", false).apply(); } } @Override protected int getStyleRes() { return theme.isDarkTheme ? R.style.Theme_Opengur_Dark_Main_Dark : R.style.Theme_Opengur_Light_Main_Light; } }