Skip to content

Instantly share code, notes, and snippets.

View patrickhammond's full-sized avatar

Patrick Hammond patrickhammond

View GitHub Profile
@patrickhammond
patrickhammond / duplicate_strings.py
Created December 2, 2015 15:41
Finds duplicate string values in an Android strings.xml file.
#!/usr/bin/python
import sys
import xml.etree.ElementTree
import collections
xmlFile = sys.argv[1]
strings = collections.Counter()
root = xml.etree.ElementTree.parse(xmlFile).getroot()
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class StringTest {
@Test
public void testAllTheSame() {
assertEquals(true, allDuplicateChars("cccccc"));
}
@patrickhammond
patrickhammond / fml.java
Created October 20, 2015 19:01
Parsing timestamps in Android without Jodatime.
public static Date parseRawDateWithUnhandledException(String dateString) throws ParseException {
// This was previously being handled with Joda (yay!), but Joda eats up nearly 5000
// methods (boo!) in an already big app just to parse a timestamp...so there *is* a reason
// we are doing things like this...
if (dateString.endsWith("Z")) {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);
dateFormat.setTimeZone(TimeZone.getTimeZone("Zulu"));
return dateFormat.parse(dateString);
} else {
@patrickhammond
patrickhammond / DrawableHelper.java
Created October 18, 2015 00:24
Drawable helper
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.support.annotation.ColorRes;
import android.support.annotation.DrawableRes;
import android.support.v4.content.ContextCompat;
import android.support.v4.graphics.drawable.DrawableCompat;
public class DrawableHelper {
public static Drawable setupTintedIcon(Context context, @DrawableRes int iconDrawableResId, @ColorRes int iconColorResId) {
Drawable icon = ContextCompat.getDrawable(context, iconDrawableResId);
import android.app.Application;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.squareup.okhttp.OkHttpClient;
import javax.inject.Singleton;
import dagger.Module;
// annotation processor will generate DevicePhoneNumberSumType (see: 4_DevicePhoneNumberSumType.java)
@SumType
public interface DevicePhoneNumber {
String phoneNumber();
void phoneNumberNotAvailable();
String[] permissionsRequired();
}
@patrickhammond
patrickhammond / ActivityPermissionDelegate.java
Last active April 30, 2018 21:10
Pushing permission ugliness handling to one place.
import android.app.Activity;
import android.support.annotation.CheckResult;
import android.support.annotation.NonNull;
import android.support.annotation.Size;
import android.support.v4.app.ActivityCompat;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
public class ActivityPermissionDelegate {
public interface PermissionRationaleRetryBehavior {
@Override
protected void onCreate(Bundle savedInstanceState) {
...
BarcodeLoggerActivityPermissionsDispatcher.startBarcodeCaptureWithCheck(this);
}
@NeedsPermission(Manifest.permission.CAMERA)
void startBarcodeCapture() {
int orientation = WindowManagerHelper.getCurrentAccurateOrientation(this);
Intent intent = CaptureActivity.buildIntent(this, orientation);
@Singleton
@Component(modules = {
AndroidModule.class,
BusModule.class,
NetworkModule.class,
AppModule.class
})
public interface ApplicationComponent {
...
Bus bus();
// Put this at the end of your project build.gradle
// Execute on your CI server with something like:
// ./gradlew continuousIntegration -Pfingerprint=asdf -PbuildNumber=2 -PdisablePreDex
evaluationDependsOnChildren();
task staticAnalysis() {
def appProject = subprojects.find { project -> 'app' == project.name }
dependsOn appProject.getTasksByName('findbugs', true)