Skip to content

Instantly share code, notes, and snippets.

@edBaev
Created November 18, 2014 10:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save edBaev/caf5f522b27d42150d6e to your computer and use it in GitHub Desktop.
Save edBaev/caf5f522b27d42150d6e to your computer and use it in GitHub Desktop.
package com.blacksquared.changers.activity;
import java.util.Locale;
import android.annotation.TargetApi;
import android.app.ActionBar;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.text.Spannable;
import android.text.SpannableString;
import android.util.TypedValue;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Toast;
import com.blacksquared.changers.App;
import com.blacksquared.changers.Constants;
import com.blacksquared.changers.R;
import com.blacksquared.changers.activity.auth.AuthActivity;
import com.blacksquared.changers.event.error.ErrorApiEvent;
import com.blacksquared.changers.event.auth.LogOutApiEvent;
import com.blacksquared.changers.event.track.TrackEvent;
import com.blacksquared.changers.interfaces.IChangeTitle;
import com.blacksquared.changers.interfaces.OnControlActionBarAttr;
import com.blacksquared.changers.service.LocationService;
import com.blacksquared.changers.utils.CustomTypeFace;
import com.blacksquared.changers.utils.Logger;
import com.blacksquared.changers.utils.Toaster;
import com.bugsense.trace.BugSenseHandler;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.ErrorDialogFragment;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.readystatesoftware.systembartint.SystemBarTintManager;
import de.greenrobot.event.EventBus;
public class BaseActivity extends FragmentActivity implements OnControlActionBarAttr, IChangeTitle {
protected ActionBar actionBar;
protected FragmentManager fragmentManager;
private ProgressDialog progressDialog;
private SystemBarTintManager tintManager;
protected int statusBarHeight;
protected int actionBarHeight;
protected String title;
private boolean isLogOuting;
protected Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
BugSenseHandler.initAndStartSession(this, "f8072d6a");
actionBar = getActionBar();
if (actionBar != null) {
actionBar.setDisplayShowCustomEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
}
fragmentManager = getSupportFragmentManager();
progressDialog = new ProgressDialog(App.getAppContext());
progressDialog.setTitle(null);
progressDialog.setMessage(getString(R.string.progressDialog_message_pleaseWait));
setStatusBarColor();
setActionBarColor(R.color.action_bar_color);
handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
return BaseActivity.this.handleMessage(msg);
}
});
}
protected boolean handleMessage(Message msg) {
return false;
}
public void removeStickyEvent(final Class<?> eventType) {
handler.postDelayed(new Runnable() {
@Override
public void run() {
EventBus.getDefault().removeStickyEvent(eventType);
}
}, 100);
}
public void removeStickyEvent(final Object event) {
handler.postDelayed(new Runnable() {
@Override
public void run() {
EventBus.getDefault().removeStickyEvent(event);
}
}, 100);
}
protected void setActionBarTitle(String title) {
this.title = title;
restoreActionBar();
}
protected void sendFeedback() {
Intent email = new Intent(Intent.ACTION_SEND);
email.setType("text/email");
email.putExtra(Intent.EXTRA_EMAIL, new String[] { Constants.FEEDBACK_EMAIL });
email.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.feedback_subject, getVersionName()));
email.putExtra(Intent.EXTRA_TEXT, getTextForFeedback());
startActivity(Intent.createChooser(email, getResources().getString(R.string.send_feedback)));
}
private String getTextForFeedback() {
String text = getString(R.string.feedback_body, Build.MODEL, Build.DEVICE, Build.VERSION.RELEASE, Locale
.getDefault()
.getDisplayLanguage());
return text;
}
protected void sendFile(String json) {
Intent email = new Intent(Intent.ACTION_SEND);
email.setType("text/email");
email.putExtra(Intent.EXTRA_EMAIL, new String[] { "edbaev@gmail.com" });
email.putExtra(Intent.EXTRA_TEXT,
"" + json);
startActivity(Intent.createChooser(email, getResources().getString(R.string.send_feedback)));
}
private String getVersionName() {
PackageInfo pInfo;
try {
pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
return pInfo.versionName;
} catch (PackageManager.NameNotFoundException e) {
return "";
}
}
protected void logout() {
if (!isLogOuting) {
isLogOuting = true;
App.apiManager.clear();
App.dataManager.logout();
stopService(new Intent(this, LocationService.class));
EventBus.getDefault().postSticky(new TrackEvent(TrackEvent.TrackEventType.StopRecord));
startActivity(new Intent(this, AuthActivity.class));
finish();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
BugSenseHandler.closeSession(this);
}
@Override
public void onStart() {
super.onStart();
BugSenseHandler.startSession(this);
}
protected void restoreActionBar() {
if (title != null && actionBar != null) {
SpannableString s = new SpannableString(title);
s.setSpan(new CustomTypeFace(this), 0, s.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
actionBar.setTitle(s);
}
}
@Override
public void setContentView(int layoutId) {
super.setContentView(layoutId);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
TypedValue tv = new TypedValue();
if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) {
actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics());
}
if (getTheme().resolveAttribute(android.R.attr.windowTitleSize, tv, true)) {
statusBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics());
}
App.PADDING_TOP_STATUS_BAR = statusBarHeight;
App.PADDING_TOP_STATUS_ACTION_BAR = actionBarHeight + statusBarHeight;
setPaddingToActionBar();
}
App.PADDING_BOTTOM_NAVIGATION_BAR = tintManager.getConfig().getPixelInsetBottom();
}
private void setStatusBarColor() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
setTranslucentStatus(true);
}
tintManager = new SystemBarTintManager(this);// works on 19 API level or higher
tintManager.setStatusBarTintEnabled(true);
}
@TargetApi(19)
private void setTranslucentStatus(boolean on) {
Window win = getWindow();
WindowManager.LayoutParams winParams = win.getAttributes();
final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
if (on) {
winParams.flags |= bits;
} else {
winParams.flags &= ~bits;
}
win.setAttributes(winParams);
}
/**
* @param colorResourceId
*/
protected void setActionBarColor(int colorResourceId) {
if (actionBar != null) {
actionBar.setBackgroundDrawable(new ColorDrawable(getResources().getColor(colorResourceId)));
}
setStatusbarColor(getResources().getColor(colorResourceId));
}
protected void setStatusbarColor(int color) {
try {
tintManager.setTintColor(color);
} catch (NullPointerException e) {
Logger.d("color=" + color);
}
}
@Override
protected void onResume() {
super.onResume();
EventBus.getDefault().registerSticky(this);
}
protected void replaceFragment(Fragment fragment, boolean addToBackStack, int containerId) {
invalidateOptionsMenu();
String backStateName = fragment.getClass().getName();
boolean fragmentPopped = fragmentManager.popBackStackImmediate(backStateName, 0);
if (!fragmentPopped && fragmentManager.findFragmentByTag(backStateName) == null) {
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE).replace(containerId, fragment,
backStateName);
if (addToBackStack) {
transaction.addToBackStack(backStateName);
}
transaction.commit();
}
}
protected void showErrorToast(Activity activity, Throwable e) {
setProgressBarIndeterminateVisibility(false);
Toaster.showShort(activity, R.string.label_check_net_connection);
Logger.e(e);
}
protected void showErrorToast(Throwable e) {
setProgressBarIndeterminateVisibility(false);
Toaster.showShort(R.string.label_check_net_connection);
Logger.e(e);
}
@Override
protected void onPause() {
super.onPause();
EventBus.getDefault().unregister(this);
}
public void onEvent(Constants.EventBusEvents event) {
}
public void onEvent(ErrorApiEvent errorApiEvent) {
EventBus.getDefault().removeStickyEvent(errorApiEvent);
if (errorApiEvent.displayToast) {
Toast.makeText(BaseActivity.this, errorApiEvent.message, Toast.LENGTH_SHORT).show();
}
}
public void onEvent(LogOutApiEvent logOutApiEvent) {
EventBus.getDefault().removeStickyEvent(logOutApiEvent);
logout();
}
protected void clearPaddingForRootView() {
findViewById(android.R.id.content)
.setPadding(0, 0, 0, 0);
setStatusbarColor(Color.TRANSPARENT);
}
protected void setPaddingToStatusBar() {
findViewById(android.R.id.content)
.setPadding(0, statusBarHeight, 0, 0);
}
protected void setPaddingToActionBar() {
findViewById(android.R.id.content)
.setPadding(0, actionBarHeight + statusBarHeight, 0, 0);
}
@Override
public void onPaddingToStatusBar() {
setPaddingToStatusBar();
}
@Override
public void onPaddingToActionBar() {
setPaddingToActionBar();
}
@Override
public void onSetABColorListener(int color) {
setActionBarColor(color);
}
@Override
public void onPaddingReset() {
clearPaddingForRootView();
}
@Override
public void onPaddingNavigationBar() {
}
protected boolean isGooglePlayServicesAvailable() {
int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
if (ConnectionResult.SUCCESS == resultCode) {
Logger.d("Google Play services is available.");
return true;
} else {
Dialog errorDialog = GooglePlayServicesUtil.getErrorDialog(resultCode, this,
Constants.Location.CONNECTION_FAILURE_RESOLUTION_REQUEST);
if (errorDialog != null) {
ErrorDialogFragment.newInstance(errorDialog).show(getFragmentManager(), "Location Updates");
}
return false;
}
}
@Override
public void onChangeTitle(String title) {
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment