Android Open Source - hpush Main Activity






From Project

Back to project page hpush.

License

The source code is released under:

MIT License

If you think the Android project hpush listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package com.hpush.app.activities;
/*from   w w w .  jav a2s.  c  o  m*/
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentSender.SendIntentException;
import android.content.pm.ActivityInfo;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.os.AsyncTaskCompat;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.TextView;

import com.astuetz.PagerSlidingTabStrip;
import com.chopping.bus.CloseDrawerEvent;
import com.crashlytics.android.Crashlytics;
import com.facebook.FacebookException;
import com.facebook.widget.WebDialog;
import com.facebook.widget.WebDialog.OnCompleteListener;
import com.github.ksoichiro.android.observablescrollview.ObservableScrollViewCallbacks;
import com.github.ksoichiro.android.observablescrollview.ScrollState;
import com.github.ksoichiro.android.observablescrollview.Scrollable;
import com.github.mrengineer13.snackbar.SnackBar;
import com.google.android.gms.ads.AdListener;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.InterstitialAd;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.common.SignInButton;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.plus.Plus;
import com.google.android.gms.plus.Plus.PlusOptions;
import com.hpush.R;
import com.hpush.app.adapters.MainViewPagerAdapter;
import com.hpush.app.fragments.AboutDialogFragment;
import com.hpush.app.fragments.AboutDialogFragment.EulaConfirmationDialog;
import com.hpush.app.fragments.AppListImpFragment;
import com.hpush.app.fragments.GPlusFragment;
import com.hpush.bus.BookmarkAllEvent;
import com.hpush.bus.DeleteAccountEvent;
import com.hpush.bus.EULAConfirmedEvent;
import com.hpush.bus.EULARejectEvent;
import com.hpush.bus.EditSettingsEvent;
import com.hpush.bus.InsertAccountEvent;
import com.hpush.bus.LoginedGPlusEvent;
import com.hpush.bus.LogoutGPlusEvent;
import com.hpush.bus.RemoveAllEvent;
import com.hpush.bus.RemoveAllEvent.WhichPage;
import com.hpush.bus.SelectMessageEvent;
import com.hpush.bus.UpdateCurrentTotalMessagesEvent;
import com.hpush.data.FunctionType;
import com.hpush.data.Status;
import com.hpush.db.DB;
import com.hpush.db.DB.Sort;
import com.hpush.gcm.ChangeSettingsTask;
import com.hpush.gcm.RegGCMTask;
import com.hpush.gcm.UnregGCMTask;
import com.hpush.utils.Prefs;
import com.hpush.utils.Utils;
import com.hpush.views.OnViewAnimatedClickedListener;
import com.hpush.views.OnViewAnimatedClickedListener3;
import com.nineoldandroids.animation.Animator;
import com.nineoldandroids.animation.AnimatorListenerAdapter;
import com.nineoldandroids.animation.AnimatorSet;
import com.nineoldandroids.animation.ObjectAnimator;
import com.nineoldandroids.view.ViewHelper;
import com.nineoldandroids.view.ViewPropertyAnimator;

import de.greenrobot.event.EventBus;

/**
 * Main activity of the app.
 *
 * @author Xinyue Zhao
 */
public final class MainActivity extends BasicActivity implements  com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks  , com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener  ,
    ObservableScrollViewCallbacks {
  /**
   * Main layout for this component.
   */
  private static final int LAYOUT = R.layout.activity_main;
  /**
   * The pagers
   */
  private ViewPager mViewPager;
  /**
   * Adapter for {@link #mViewPager}.
   */
  private MainViewPagerAdapter mPagerAdapter;
  /**
   * Navigation drawer.
   */
  private DrawerLayout mDrawerLayout;
  /**
   * Use navigation-drawer for this fork.
   */
  private ActionBarDrawerToggle mDrawerToggle;
  /**
   * The new actionbar.
   */
  private Toolbar mToolbar;
  /**
   * Tabs.
   */
  private PagerSlidingTabStrip mTabs;
  /**
   * Click to remove all selected items.
   */
  private ImageButton mRemoveAllBtn;
  /**
   * Click to bookmark all selected items.
   */
  private ImageButton mBookmarkAllBtn;
  /**
   * Open/Close main float buttons.
   */
  private ImageButton mOpenBtn;
  /**
   * The interstitial ad.
   */
  private InterstitialAd mInterstitialAd;
  /**
   * Count of total messages saved.
   */
  private TextView mTotalTv;

  /**
   * Container for toolbar and viewpager.
   */
  private View mHeaderView;
  private SnackBar mSnackBar;
  private SignInButton mGPlusBtn;
  private GoogleApiClient mPlusClient;
  private ConnectionResult mConnectionResult;
  private ProgressDialog mProgressDialog;
  private static int REQUEST_CODE_RESOLVE_ERR = 0x98;
  //------------------------------------------------
  //Subscribes, event-handlers
  //------------------------------------------------

  /**
   * Handler for {@link  EULARejectEvent}.
   *
   * @param e
   *     Event {@link  EULARejectEvent}.
   */
  public void onEvent(EULARejectEvent e) {
    finish();
  }

  /**
   * Handler for {@link EULAConfirmedEvent}
   *
   * @param e
   *     Event {@link  EULAConfirmedEvent}.
   */
  public void onEvent(EULAConfirmedEvent e) {

  }

  /**
   * Handler for {@link }.
   *
   * @param e
   *     Event {@link}.
   */
  public void onEvent(CloseDrawerEvent e) {
    mDrawerLayout.closeDrawers();
  }





  /**
   * Handler for {@link SelectMessageEvent}.
   *
   * @param e
   *     Event {@link SelectMessageEvent}.
   */
  public void onEvent(SelectMessageEvent e) {
    openFloatButtons();
  }

  /**
   * Handler for {@link com.hpush.bus.LogoutGPlusEvent}.
   *
   * @param e
   *     Event {@link com.hpush.bus.LogoutGPlusEvent}.
   */
  public void onEvent(LogoutGPlusEvent e) {
    logoutGPlus();
  }

  /**
   * Handler for {@link UpdateCurrentTotalMessagesEvent}.
   *
   * @param e
   *     Event {@link UpdateCurrentTotalMessagesEvent}.
   */
  public void onEvent(UpdateCurrentTotalMessagesEvent e) {
    this.refreshCurrentTotalMessages();
  }

  /**
   * Handler for {@link EditSettingsEvent}.
   *
   * @param e
   *     Event {@link EditSettingsEvent}.
   */
  public void onEvent(EditSettingsEvent e) {
    saveSettings();
  }

  /**
   * Handler for {@link InsertAccountEvent}.
   *
   * @param e
   *     Event {@link InsertAccountEvent}.
   */
  public void onEvent(InsertAccountEvent e) {
    new ChangeSettingsTask(getApplication(), Prefs.getInstance(getApplication()).getPushBackendRegUrl()).execute();
  }


  /**
   * Handler for {@link DeleteAccountEvent}.
   *
   * @param e
   *     Event {@link DeleteAccountEvent}.
   */
  public void onEvent(DeleteAccountEvent e) {
    new ChangeSettingsTask(getApplication(), Prefs.getInstance(getApplication()).getPushBackendUnregUrl())
        .execute();
  }

  /**
   * Handler for {@link Status}.
   *
   * @param e
   *     Event {@link Status}.
   */
  public void onEvent(Status e) {
    dismissProgressDialog();
    switch (FunctionType.fromName(e.getFunction())) {
    case Edit:
      if (e.status()) {
        EventBus.getDefault().removeStickyEvent(EditSettingsEvent.class);
        mSnackBar.show(getString(R.string.msg_saved_settings_successfully));
      } else {
        saveSettings();
      }
      break;
    case Insert:
      if (e.status()) {
        EventBus.getDefault().removeStickyEvent(InsertAccountEvent.class);
        mSnackBar.show(getString(R.string.msg_saved_account_successfully));
        makeAds();
      } else {
        new ChangeSettingsTask(getApplication(), Prefs.getInstance(getApplication()).getPushBackendRegUrl())
            .execute();
      }
      break;
    case Delete:
      if (e.status()) {
        EventBus.getDefault().removeStickyEvent(DeleteAccountEvent.class);
        mSnackBar.show(getString(R.string.msg_deleted_account_successfully));
      } else {
        new ChangeSettingsTask(getApplication(), Prefs.getInstance(getApplication()).getPushBackendUnregUrl())
            .execute();
      }
      break;
    }
  }



  //------------------------------------------------

  /**
   * Show single instance of {@link com.hpush.app.activities.MainActivity}
   *
   * @param cxt
   *     {@link android.content.Context}.
   */
  public static void showInstance(Context cxt) {
    Intent intent = new Intent(cxt, MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    cxt.startActivity(intent);
  }
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Crashlytics.start(this);
    setContentView(LAYOUT);

    if (getResources().getBoolean(R.bool.landscape)) {
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    }

    getSupportFragmentManager().beginTransaction().replace(R.id.gplus_container, GPlusFragment.newInstance(
        getApplication())).commit();

    mHeaderView = findViewById(R.id.error_content);
    ViewCompat.setElevation(mHeaderView, getResources().getDimension(R.dimen.toolbar_elevation));
    mToolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(mToolbar);
    initDrawer();
    mViewPager = (ViewPager) findViewById(R.id.vp);
    mPagerAdapter = new MainViewPagerAdapter(this, getSupportFragmentManager());
    mViewPager.setAdapter(mPagerAdapter);
    calcActionBarHeight();
    mViewPager.setPadding(0, 2 * getActionBarHeight(), 0, 0);
    // Bind the tabs to the ViewPager
    mTabs = (PagerSlidingTabStrip) findViewById(R.id.tabs);
    mTabs.setViewPager(mViewPager);
    mTabs.setIndicatorColorResource(R.color.common_white);
    mTabs.setOnPageChangeListener(new OnPageChangeListener() {
      @Override
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        closeFloatButtons();
      }

      @Override
      public void onPageSelected(int position) {
        propagateToolbarState(toolbarIsShown());
      }

      @Override
      public void onPageScrollStateChanged(int state) {

      }
    });
    propagateToolbarState(toolbarIsShown());

    mRemoveAllBtn = (ImageButton) findViewById(R.id.remove_all_btn);
    mRemoveAllBtn.setOnClickListener(new OnViewAnimatedClickedListener() {
      @Override
      public void onClick() {
        EventBus.getDefault().post(new RemoveAllEvent(
            mViewPager.getCurrentItem() == 0 ? WhichPage.Messages : WhichPage.Bookmarks));
      }
    });
    mBookmarkAllBtn = (ImageButton) findViewById(R.id.bookmark_all_btn);
    mBookmarkAllBtn.setOnClickListener(new OnViewAnimatedClickedListener() {
      @Override
      public void onClick() {
        EventBus.getDefault().post(new BookmarkAllEvent());
      }
    });
    mOpenBtn = (ImageButton) findViewById(R.id.float_main_btn);
    mOpenBtn.setOnClickListener(mOpenListener);

    mSnackBar = new SnackBar(this);
    mPlusClient = new GoogleApiClient.Builder(this, this, this) .addApi(Plus.API, PlusOptions.builder().build())
        .addScope(Plus.SCOPE_PLUS_LOGIN).build();
    mGPlusBtn = (SignInButton) findViewById(R.id.sign_in_btn);
    mGPlusBtn.setSize(SignInButton.SIZE_WIDE);
    mGPlusBtn.setOnClickListener(new OnViewAnimatedClickedListener3() {
      @Override
      public void onClick() {
        loginGPlus();
      }
    });
    if (!TextUtils.isEmpty(Prefs.getInstance(getApplication()).getGoogleAccount())) {
      mPlusClient.connect();
    }
    mTotalTv = (TextView) findViewById(R.id.total_tv);
    this.refreshCurrentTotalMessages();
  }


  @Override
  protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
  }


  /**
   * Dismiss all float-buttons.
   */
  private void closeFloatButtons() {
    int vi = mRemoveAllBtn.getVisibility();
    if (vi == View.VISIBLE) {
      mOpenBtn.performClick();
    }
  }


  /**
   * Open all float-buttons.
   */
  private void openFloatButtons() {
    int vi = mRemoveAllBtn.getVisibility();
    if (vi != View.VISIBLE) {
      mOpenBtn.performClick();
    }
  }


  @Override
  public void onResume() {
    super.onResume();
    if (mDrawerToggle != null) {
      mDrawerToggle.syncState();
    }
    checkPlayService();
    handleGPlusLinkedUI();
  }


  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);


    menu.findItem(R.id.action_setting).setVisible(mPlusClient != null && mPlusClient.isConnected());
    if (!TextUtils.isEmpty(Prefs.getInstance(getApplication()).getGoogleAccount())) {
      menu.findItem(R.id.action_setting).setVisible(true);
    }
    return true;
  }

  @Override
  public boolean onPrepareOptionsMenu(Menu menu) {

    MenuItem menuShare = menu.findItem(R.id.action_share_app);
    //Getting the actionprovider associated with the menu item whose id is share.
    android.support.v7.widget.ShareActionProvider provider =
        (android.support.v7.widget.ShareActionProvider) MenuItemCompat.getActionProvider(menuShare);
    //Setting a share intent.
    String subject = getString(R.string.lbl_share_app_title, getString(R.string.application_name));
    String text = getString(R.string.lbl_share_app_content);
    provider.setShareIntent(Utils.getDefaultShareIntent(provider, subject, text));

    return super.onPrepareOptionsMenu(menu);
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    closeFloatButtons();
    if (mDrawerToggle != null && mDrawerToggle.onOptionsItemSelected(item)) {
      return true;
    }
    int id = item.getItemId();
    switch (id) {
    case R.id.action_about:
      showDialogFragment(AboutDialogFragment.newInstance(this), null);
      break;
    case R.id.action_setting:
      SettingActivity.showInstance(this, null);
      break;
    case R.id.action_facebook:
      Bundle postParams = new Bundle();
      final WebDialog fbDlg = new WebDialog.FeedDialogBuilder(this, getString(R.string.applicationId), postParams)
          .setCaption(String.format(getString(R.string.lbl_share_app_title), getString(
              R.string.lbl_share_item_title))).setName(getString(R.string.lbl_share_item_title))
          .setDescription(getString(R.string.lbl_share_app_content)).setLink(getString(R.string.lbl_app_link))
          .build();
      fbDlg.setOnCompleteListener(new OnCompleteListener() {
        @Override
        public void onComplete(Bundle bundle, FacebookException e) {
          fbDlg.dismiss();
        }
      });
      fbDlg.show();
      break;
    case R.id.action_tweet:
      break;
    }
    return super.onOptionsItemSelected(item);
  }

  @Override
  protected void onAppConfigLoaded() {
    super.onAppConfigLoaded();
    showAppList();
  }

  @Override
  protected void onAppConfigIgnored() {
    super.onAppConfigIgnored();
    showAppList();
  }

  /**
   * Show all external applications links.
   */
  private void showAppList() {
    getSupportFragmentManager().beginTransaction().replace(R.id.app_list_fl, AppListImpFragment.newInstance(this))
        .commit();
  }



  /**
   * Show main float button.
   */
  private void showOpenFloatButton() {
    mOpenBtn.setVisibility(View.VISIBLE);
  }

  /**
   * Dismiss main float button.
   */
  private void hideOpenFloatButton() {
    mOpenBtn.setVisibility(View.INVISIBLE);
  }

  /**
   * Show pagers.
   */
  private void showViewPager() {
    mViewPager.setVisibility(View.VISIBLE);
  }

  /**
   * Dismiss pagers.
   */
  private void hideViewPager() {
    mViewPager.setVisibility(View.INVISIBLE);
  }

  /**
   * Show tabs.
   */
  private void showTabs() {
    mTabs.setVisibility(View.VISIBLE);
  }

  /**
   * Dismiss tabs.
   */
  private void hideTabs() {
    mTabs.setVisibility(View.INVISIBLE);
  }

  /**
   * Show button for gplus.
   */
  private void showGPlusButton() {
    float initAplha = ViewHelper.getAlpha(mGPlusBtn);
    ObjectAnimator.ofFloat(mGPlusBtn, Utils.ALPHA, initAplha, 0.5f, 1).setDuration(0).start();
  }

  /**
   * Dismiss button for gplus.
   */
  private void hideGPlusButton() {
    float initAplha = ViewHelper.getAlpha(mGPlusBtn);
    ObjectAnimator.ofFloat(mGPlusBtn, Utils.ALPHA, initAplha, 0.5f, 0).setDuration(0).start();
  }

  private void handleGPlusLinkedUI() {
    if (mPlusClient != null && mPlusClient.isConnected()) {
      showTabs();
      showViewPager();
      showOpenFloatButton();
      hideGPlusButton();
      findViewById(R.id.open_hack_news_home_ll).setVisibility(View.VISIBLE);
      findViewById(R.id.open_setting_ll).setVisibility(View.VISIBLE);
    } else {
      if (!TextUtils.isEmpty(Prefs.getInstance(getApplication()).getGoogleAccount())) {
        showTabs();
        showViewPager();
        showOpenFloatButton();
        hideGPlusButton();
        findViewById(R.id.open_hack_news_home_ll).setVisibility(View.VISIBLE);
        findViewById(R.id.open_setting_ll).setVisibility(View.VISIBLE);
      } else {
        hideTabs();
        hideViewPager();
        hideOpenFloatButton();
        showGPlusButton();
        findViewById(R.id.open_hack_news_home_ll).setVisibility(View.GONE);
        findViewById(R.id.open_setting_ll).setVisibility(View.GONE);
      }
    }
    supportInvalidateOptionsMenu();
  }

  /**
   * Initialize the navigation drawer.
   */
  private void initDrawer() {
    ActionBar actionBar = getSupportActionBar();
    if (actionBar != null) {
      actionBar.setHomeButtonEnabled(true);
      actionBar.setDisplayHomeAsUpEnabled(true);
      mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
      mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.application_name,
          R.string.app_name) {
        @Override
        public void onDrawerOpened(View drawerView) {
          super.onDrawerOpened(drawerView);
          showToolbar();
        }
      };
      mDrawerLayout.setDrawerListener(mDrawerToggle);
      findViewById(R.id.open_hack_news_home_ll).setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
          WebViewActivity.showInstance(MainActivity.this, null, v, null);
          mDrawerLayout.closeDrawer(Gravity.LEFT);
        }
      });
      findViewById(R.id.open_recent_ll).setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
          DailiesActivity.showInstance(MainActivity.this);
          mDrawerLayout.closeDrawer(Gravity.LEFT);
        }
      });
      findViewById(R.id.open_setting_ll).setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
          SettingActivity.showInstance(MainActivity.this, v);
          mDrawerLayout.closeDrawer(Gravity.LEFT);
        }
      });
    }
  }

  /**
   * Listener for opening all float buttons.
   */
  private OnClickListener mOpenListener = new OnClickListener() {
    @Override
    public void onClick(View v) {
      if (mViewPager.getCurrentItem() == 0) {
        mBookmarkAllBtn.setVisibility(View.VISIBLE);
      }
      AnimatorSet animatorSet = new AnimatorSet();
      ObjectAnimator iiBtnAnim = ObjectAnimator.ofFloat(mBookmarkAllBtn, "translationY", 150f, 0).setDuration(
          100);
      iiBtnAnim.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
          super.onAnimationEnd(animation);
          mRemoveAllBtn.setVisibility(View.VISIBLE);
        }
      });
      ObjectAnimator iBtnAnim = ObjectAnimator.ofFloat(mRemoveAllBtn, "translationY", 200f, 0).setDuration(200);
      iBtnAnim.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
          super.onAnimationEnd(animation);
          mOpenBtn.setOnClickListener(mCloseListener);
        }
      });
      animatorSet.playSequentially(iiBtnAnim, iBtnAnim);
      animatorSet.start();
    }
  };

  /**
   * Listener for closing all float buttons.
   */
  private OnClickListener mCloseListener = new OnClickListener() {
    @Override
    public void onClick(View v) {
      AnimatorSet animatorSet = new AnimatorSet();
      ObjectAnimator iiBtnAnim = ObjectAnimator.ofFloat(mBookmarkAllBtn, "translationY", 0, 150f).setDuration(
          100);
      iiBtnAnim.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
          super.onAnimationEnd(animation);
          mBookmarkAllBtn.setVisibility(View.GONE);
        }
      });
      ObjectAnimator iBtnAnim = ObjectAnimator.ofFloat(mRemoveAllBtn, "translationY", 0, 200f).setDuration(200);
      iBtnAnim.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
          super.onAnimationEnd(animation);
          mRemoveAllBtn.setVisibility(View.GONE);
          mOpenBtn.setOnClickListener(mOpenListener);

        }
      });
      animatorSet.playSequentially(iiBtnAnim, iBtnAnim);
      animatorSet.start();
    }
  };

  /**
   * Make an Admob.
   */
  private void makeAds() {
    // Create an ad.
    mInterstitialAd = new InterstitialAd(this);
    mInterstitialAd.setAdUnitId(getString(R.string.ad_inters_unit_id));
    // Create ad request.
    AdRequest adRequest = new AdRequest.Builder().build();
    // Begin loading your interstitial.
    mInterstitialAd.setAdListener(new AdListener() {
      @Override
      public void onAdLoaded() {
        super.onAdLoaded();
        displayInterstitial();
      }
    });
    mInterstitialAd.loadAd(adRequest);
  }


  /**
   * Invoke displayInterstitial() when you are ready to display an interstitial.
   */
  public void displayInterstitial() {
    if (mInterstitialAd.isLoaded()) {
      mInterstitialAd.show();
    }
  }

  /**
   * To confirm whether the validation of the Play-service of Google Inc.
   */
  private void checkPlayService() {
    final int isFound = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
    if (isFound == ConnectionResult.SUCCESS ||
        isFound == ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED) {//Ignore update.
      //The "End User License Agreement" must be confirmed before you use this application.
      if (!Prefs.getInstance(getApplication()).isEULAOnceConfirmed()) {
        showDialogFragment(new EulaConfirmationDialog(), null);
      }
    } else {
      new AlertDialog.Builder(this).setTitle(R.string.application_name).setMessage(R.string.lbl_play_service)
          .setCancelable(false).setPositiveButton(R.string.btn_ok, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
          dialog.dismiss();
          Intent intent = new Intent(Intent.ACTION_VIEW);
          intent.setData(Uri.parse(getString(R.string.play_service_url)));
          startActivity(intent);
          finish();
        }
      }).create().show();
    }
  }


  /**
   * Show  {@link android.support.v4.app.DialogFragment}.
   *
   * @param _dlgFrg
   *     An instance of {@link android.support.v4.app.DialogFragment}.
   * @param _tagName
   *     Tag name for dialog, default is "dlg". To grantee that only one instance of {@link
   *     android.support.v4.app.DialogFragment} can been seen.
   */
  protected void showDialogFragment(DialogFragment _dlgFrg, String _tagName) {
    try {
      if (_dlgFrg != null) {
        DialogFragment dialogFragment = _dlgFrg;
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        // Ensure that there's only one dialog to the user.
        Fragment prev = getSupportFragmentManager().findFragmentByTag("dlg");
        if (prev != null) {
          ft.remove(prev);
        }
        try {
          if (TextUtils.isEmpty(_tagName)) {
            dialogFragment.show(ft, "dlg");
          } else {
            dialogFragment.show(ft, _tagName);
          }
        } catch (Exception _e) {
        }
      }
    } catch (Exception _e) {
    }
  }

  @Override
  public void onConnected(Bundle bundle) {
    if (mProgressDialog != null && mProgressDialog.isShowing()) {
      mProgressDialog.dismiss();
      mGPlusBtn.setVisibility(View.GONE);
    }
    if (TextUtils.isEmpty(Prefs.getInstance(getApplication()).getPushRegId())) {
      new AlertDialog.Builder(this).setTitle(R.string.application_name).setMessage(R.string.lbl_turn_on_push_info)
          .setCancelable(false).setPositiveButton(R.string.lbl_yes, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
          AsyncTaskCompat.executeParallel(new RegGCMTask(getApplication()) {
            @Override
            protected void onPreExecute() {
              super.onPreExecute();
              mProgressDialog = ProgressDialog.show(MainActivity.this, null, getString(
                  R.string.msg_push_registering));
            }
          });
          mSnackBar.show(getString(R.string.msg_wait_new_messages));
        }
      }).setNeutralButton(R.string.lbl_no, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {

        }
      }).create().show();
    }
    EventBus.getDefault().postSticky(new LoginedGPlusEvent(mPlusClient));
    Prefs.getInstance(getApplication()).setGoogleAccount(
        Plus.AccountApi.getAccountName(mPlusClient));
    handleGPlusLinkedUI();
  }

  @Override
  public void onConnectionSuspended(int i) {
    dismissProgressDialog();
  }



  @Override
  public void onConnectionFailed(ConnectionResult connectionResult) {
    dismissProgressDialog();
    mGPlusBtn.setVisibility(View.VISIBLE);

    if (connectionResult.hasResolution()) {
      try {
        connectionResult.startResolutionForResult(this, REQUEST_CODE_RESOLVE_ERR);
      } catch (SendIntentException e) {
        mPlusClient.connect();
      }
    } else {
      mSnackBar.show(getString(R.string.lbl_login_fail));
    }
  }

  /**
   * Login Google+
   */
  private void loginGPlus() {
    if (mConnectionResult == null) {
      mProgressDialog = ProgressDialog.show(this, null, getString(R.string.lbl_login_gplus));
      mProgressDialog.setCancelable(true);
      mPlusClient.connect();
    } else {
      try {
        mConnectionResult.startResolutionForResult(this, REQUEST_CODE_RESOLVE_ERR);
      } catch (SendIntentException e) {
        mConnectionResult = null;
        mPlusClient.connect();
      }
    }
  }


  /**
   * Logout Google+
   */
  private void logoutGPlus() {
    if (mPlusClient.isConnected()) {
      mGPlusBtn.setVisibility(View.VISIBLE);
      mPlusClient.disconnect();
    }
    Prefs prefs = Prefs.getInstance(getApplication());
    if (!TextUtils.isEmpty(prefs.getGoogleAccount())) {
      AsyncTaskCompat.executeParallel(new UnregGCMTask(getApplication()));
      prefs.setGoogleAccount(null);
      handleGPlusLinkedUI();
    }
    mSnackBar.show(getString(R.string.lbl_logout_gplus_cause));
  }


  @Override
  protected void onActivityResult(int requestCode, int responseCode, Intent intent) {
    if (requestCode == REQUEST_CODE_RESOLVE_ERR && responseCode == RESULT_OK) {
      mConnectionResult = null;
      mPlusClient.connect();
    }
  }




  private void refreshCurrentTotalMessages() {
    AsyncTask<Void, int[], int[]> task = new AsyncTask<Void, int[], int[]>() {
      @Override
      protected int[] doInBackground(Void... params) {
        DB db = DB.getInstance(getApplication());
        return new int[] { db.getBookmarks(Sort.DESC).size(), db.getMessages(Sort.DESC).size() };
      }

      @Override
      protected void onPostExecute(int[] ints) {
        super.onPostExecute(ints);
        int sum = ints[0] + ints[1];
        mTotalTv.setText(sum + "");
      }
    };
    AsyncTaskCompat.executeParallel(task);
  }

  /**
   * Save settings on server.
   */
  private void saveSettings() {
    dismissProgressDialog();
    Prefs prefs = Prefs.getInstance(getApplication());
    final String regId = prefs.getPushRegId();
    if (!TextUtils.isEmpty(regId)) {
      mProgressDialog = ProgressDialog.show(this, null, getString(R.string.msg_save_data));
      mProgressDialog.setCancelable(true);
      new ChangeSettingsTask(getApplication(), prefs.getPushBackendEditUrl()).execute();
    }
  }

  /**
   * Close progress indicator.
   */
  private void dismissProgressDialog() {
    if (mProgressDialog != null && mProgressDialog.isShowing()) {
      mProgressDialog.dismiss();
    }
  }


  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  //UI effect:
  //https://github.com/ksoichiro/Android-ObservableScrollView/blob/master/observablescrollview-samples/src/main/java/com/github/ksoichiro/android/observablescrollview/samples/ViewPagerTabActivity.java
  /////////////////////////////////////////////////////////////////////////////////////////////////////////
  private int mBaseTranslationY;

  @Override
  public void onScrollChanged(int scrollY, boolean firstScroll, boolean dragging) {
    int toolbarHeight = mToolbar.getHeight();
    float currentHeaderTranslationY = ViewHelper.getTranslationY(mHeaderView);
    if (firstScroll) {
      if (-toolbarHeight < currentHeaderTranslationY) {
        mBaseTranslationY = scrollY;
      }
    }
    int headerTranslationY = Math.min(0, Math.max(-toolbarHeight, -(scrollY - mBaseTranslationY)));
    ViewPropertyAnimator.animate(mHeaderView).cancel();
    ViewHelper.setTranslationY(mHeaderView, headerTranslationY);
  }

  @Override
  public void onDownMotionEvent() {

  }


  @Override
  public void onUpOrCancelMotionEvent(ScrollState scrollState) {
    mBaseTranslationY = 0;

    Fragment fragment = mPagerAdapter.getItemAt(mViewPager.getCurrentItem());
    if (fragment == null) {
      return;
    }
    View view = fragment.getView();
    if (view == null) {
      return;
    }

    // ObservableXxxViews have same API
    // but currently they don't have any common interfaces.
    adjustToolbar(scrollState, view);
  }

  private void adjustToolbar(ScrollState scrollState, View view) {
    int toolbarHeight = mToolbar.getHeight();
    final Scrollable scrollView = (Scrollable) view.findViewById(R.id.msg_rv);
    if (scrollView == null) {
      return;
    }
    if (scrollState == ScrollState.UP) {
      if (toolbarHeight < scrollView.getCurrentScrollY()) {
        hideToolbar();
      } else if (scrollView.getCurrentScrollY() < toolbarHeight) {
        showToolbar();
      }
    } else if (scrollState == ScrollState.DOWN) {
      if (toolbarHeight < scrollView.getCurrentScrollY()) {
        showToolbar();
      }
    }
  }

  private void hideToolbar() {
    float headerTranslationY = ViewHelper.getTranslationY(mHeaderView);
    int toolbarHeight = mToolbar.getHeight();
    if (headerTranslationY != -toolbarHeight) {
      ViewPropertyAnimator.animate(mHeaderView).cancel();
      ViewPropertyAnimator.animate(mHeaderView).translationY(-toolbarHeight).setDuration(200).start();
    }
    propagateToolbarState(false);
  }

  private void showToolbar() {
    float headerTranslationY = ViewHelper.getTranslationY(mHeaderView);
    if (headerTranslationY != 0) {
      ViewPropertyAnimator.animate(mHeaderView).cancel();
      ViewPropertyAnimator.animate(mHeaderView).translationY(0).setDuration(200).start();
    }
    propagateToolbarState(true);
  }

  private void propagateToolbarState(boolean isShown) {
    int toolbarHeight = mToolbar.getHeight();

    // Set scrollY for the fragments that are not created yet
    mPagerAdapter.setScrollY(isShown ? 0 : toolbarHeight);

    // Set scrollY for the active fragments
    for (int i = 0; i < mPagerAdapter.getCount(); i++) {
      // Skip current item
      if (i == mViewPager.getCurrentItem()) {
        continue;
      }

      // Skip destroyed or not created item
      Fragment f = mPagerAdapter.getItemAt(i);
      if (f == null) {
        continue;
      }

      View view = f.getView();
      if (view == null) {
        continue;
      }
      propagateToolbarState(isShown, view, toolbarHeight);
    }
  }


  private void propagateToolbarState(boolean isShown, View view, int toolbarHeight) {
    Scrollable scrollView = (Scrollable) view.findViewById(R.id.msg_rv);
    if (scrollView == null) {
      return;
    }
    if (isShown) {
      // Scroll up
      if (0 < scrollView.getCurrentScrollY()) {
        scrollView.scrollVerticallyTo(0);
      }
    } else {
      // Scroll down (to hide padding)
      if (scrollView.getCurrentScrollY() < toolbarHeight * 2) {
        scrollView.scrollVerticallyTo(toolbarHeight * 2);
      }
    }
  }

  private boolean toolbarIsShown() {
    return ViewHelper.getTranslationY(mHeaderView) == 0;
  }

  /////////////////////////////////////////////////////////////////////////////////////////////////////////
}




Java Source Code List

com.hpush.app.App.java
com.hpush.app.activities.BasicActivity.java
com.hpush.app.activities.DailiesActivity.java
com.hpush.app.activities.MainActivity.java
com.hpush.app.activities.SettingActivity.java
com.hpush.app.activities.WebViewActivity.java
com.hpush.app.adapters.DailiesListAdapter.java
com.hpush.app.adapters.MainViewPagerAdapter.java
com.hpush.app.adapters.MessagesListAdapter.java
com.hpush.app.fragments.AboutDialogFragment.java
com.hpush.app.fragments.AdFragment.java
com.hpush.app.fragments.AppListImpFragment.java
com.hpush.app.fragments.BookmarksListFragment.java
com.hpush.app.fragments.DailiesLstFragment.java
com.hpush.app.fragments.GPlusFragment.java
com.hpush.app.fragments.MessagesListFragment.java
com.hpush.bus.BookmarkAllEvent.java
com.hpush.bus.BookmarkMessageEvent.java
com.hpush.bus.BookmarkedEvent.java
com.hpush.bus.ClickMessageCommentsEvent.java
com.hpush.bus.ClickMessageEvent.java
com.hpush.bus.ClickMessageLinkEvent.java
com.hpush.bus.DeleteAccountEvent.java
com.hpush.bus.EULAConfirmedEvent.java
com.hpush.bus.EULARejectEvent.java
com.hpush.bus.EditSettingsEvent.java
com.hpush.bus.GCMRegistedEvent.java
com.hpush.bus.InsertAccountEvent.java
com.hpush.bus.LoadAllEvent.java
com.hpush.bus.LoginedGPlusEvent.java
com.hpush.bus.LogoutGPlusEvent.java
com.hpush.bus.RemoveAllEvent.java
com.hpush.bus.SelectMessageEvent.java
com.hpush.bus.ShareMessageEvent.java
com.hpush.bus.ShowActionBar.java
com.hpush.bus.SortAllEvent.java
com.hpush.bus.UpdateCurrentTotalMessagesEvent.java
com.hpush.data.DailyListItem.java
com.hpush.data.Daily.java
com.hpush.data.FunctionType.java
com.hpush.data.MessageListItem.java
com.hpush.data.Message.java
com.hpush.data.Status.java
com.hpush.data.SyncList.java
com.hpush.db.BookmarksTbl.java
com.hpush.db.DB.java
com.hpush.db.DailyTbl.java
com.hpush.db.DatabaseHelper.java
com.hpush.db.MessagesTbl.java
com.hpush.gcm.ChangeSettingsTask.java
com.hpush.gcm.GcmBroadcastReceiver.java
com.hpush.gcm.GcmIntentService.java
com.hpush.gcm.RegGCMTask.java
com.hpush.gcm.SyncTask.java
com.hpush.gcm.UnregGCMTask.java
com.hpush.utils.Prefs.java
com.hpush.utils.Utils.java
com.hpush.views.FontTextView.java
com.hpush.views.OnViewAnimatedClickedListener2.java
com.hpush.views.OnViewAnimatedClickedListener3.java
com.hpush.views.OnViewAnimatedClickedListener.java
com.hpush.views.SortActionViewProvider.java
com.hpush.views.WebViewEx.java