Skip to content

Instantly share code, notes, and snippets.

@secondsun
Last active December 14, 2015 09: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 secondsun/1b8f9f480d6f9f4453f6 to your computer and use it in GitHub Desktop.
Save secondsun/1b8f9f480d6f9f4453f6 to your computer and use it in GitHub Desktop.

Before and After:

Using Authentication:

Before

Configure.java

RedditAuthenticationModule module = new RedditAuthenticationModule(getApplicationContext());

PipeConfig config = new PipeConfig(redditURL, Listing.class);
config.setGsonBuilder(new GsonBuilder().registerTypeAdapter(Listing.class, new ListingTypeAdapter()));
config.setEndpoint(".json");
config.setAuthModule(module);

pipeline.pipe(Listing.class, config);

Use.java

public void login(String username, String password, Callback<HeaderAndBody> callback) {
   module.login(username, password, callback);
}

After

Configure.java

authenticator = new Authenticator(redditURL);
module = new RedditAuthenticationModule(getApplicationContext());
authenticator.add("reddit", module);

PipeConfig config = new PipeConfig(redditURL, Listing.class);
config.setGsonBuilder(new GsonBuilder().registerTypeAdapter(
		Listing.class, new ListingTypeAdapter()));
config.setEndpoint(".json");
config.setAuthModule(module);

config.setPageConfig(pageConfig);

pipeline.pipe(Listing.class, config);

Use.java

public void login(String username, String password, Callback<HeaderAndBody> callback, Fragment fragment) {
    authenticator.get("reddit", fragment, this.getApplicationContext()).login(username, password, callback);
}

Using Pipes:

Before

Fragment.java

public void load() {
		StoryListApplication application = (StoryListApplication) getActivity()
				.getApplication();
		Pipe<Listing> listing = pipeline.get("listing");
		listing.read(new Callback<List<Listing>>() {

			public void onSuccess(List<Listing> data) {
				Log.d("Reddt", "success");
				Log.d("Reddit", data.toString());
				setListAdapter(new ArrayAdapter<T3>(getActivity(),
		                R.layout.simple_list_item_activated_1,
		                R.id.text1,
		                data.get(0).getData().getChildren()));
			}

			public void onFailure(Exception e) {
				Log.d("Reddt", "failure", e);
				if (e instanceof HttpException) {
					HttpException httpException = (HttpException) e;
					Log.d("Reddit", new String(httpException.getData()));
				}
			}

		});
}

After

Fragment.java

public Fragment() {
   this.readCallback = new StoryListCallback<List<Listing>>(this);
}

public void load() {
		StoryListApplication application = (StoryListApplication) getActivity()
				.getApplication();
		LoaderPipe<Listing> listing = pipeline.get("listing", this, this.getActivity());
		listing.read(readCallback);
}

StoryListCallback.java

public class StoryListCallback<T>
		extends
			AbstractFragmentCallback<List<Listing>> {

	public StoryListCallback(StoryListFragment f) {
		super(f, 1);
	}

	public void onSuccess(final List<Listing> data) {
		final StoryListFragment fragment = (StoryListFragment) getFragment();
		Log.d("Reddt", "success");
		Log.d("Reddit", data.toString());
                fragment.setListAdapter(new ArrayAdapter<T3>(getActivity(),
                  R.layout.simple_list_item_activated_1,
		  R.id.text1,
                  data.get(0).getData().getChildren()));

	}

	public void onFailure(Exception e) {
		Log.d("Reddt", "failure", e);
		if (e instanceof HttpException) {
			HttpException httpException = (HttpException) e;
			Log.d("Reddit", new String(httpException.getData()));
		}
	}

}

Using Paging:

No change

Implementing Authentication:

Before

	public void login(final String username, final String password,
			final Callback<HeaderAndBody> callback) {
		new AsyncTask<Void, Void, Void>() {
			private Exception exception;
			private HeaderAndBody result;

			@Override
			protected Void doInBackground(Void... params) {

				try {
					HttpProvider provider = new HttpRestProvider(
							getLoginURL(username));
					provider.setDefaultHeader("User-Agent",
							"AeroGear StoryList Demo /u/secondsun");
					provider.setDefaultHeader("Content-Type",
							"application/x-www-form-urlencoded");
					String loginData = buildLoginData(username, password);
					result = provider.post(loginData);
					Log.d("Auth", new String(result.getBody()));
					String json = new String(result.getBody());
					JsonObject obj = new JsonParser().parse(json)
							.getAsJsonObject().get("json").getAsJsonObject();
					modHash = obj.get("data").getAsJsonObject().get("modhash")
							.getAsString();
					authToken = obj.get("data").getAsJsonObject().get("cookie")
							.getAsString();
					isLoggedIn = true;
				} catch (Exception e) {
					Log.e(RedditAuthenticationModule.class.getSimpleName(),
							"Error with Login", e);
					exception = e;
				}
				return null;
			}

			private String buildLoginData(String username, String password) {
				StringBuilder builder = new StringBuilder();
				builder.append("user=").append(URLEncoder.encode(username))
						.append("&api_type=json&passwd=")
						.append(URLEncoder.encode(password));
				return builder.toString();
			}

			@Override
			protected void onPostExecute(Void ignore) {
				super.onPostExecute(ignore);
				if (exception == null) {
					callback.onSuccess(this.result);
				} else {
					callback.onFailure(exception);
				}
			}

		}.execute((Void) null);

	}

After

public void login(final String username, final String password,
			final Callback<HeaderAndBody> callback) {
		THREAD_POOL_EXECUTOR.execute(new Runnable() {
			private Exception exception;
			private HeaderAndBody result;

			@Override
			public void run() {
				try {
					HttpProvider provider = new HttpRestProvider(
							getLoginURL(username));
					provider.setDefaultHeader("User-Agent",
							"AeroGear StoryList Demo /u/secondsun");
					provider.setDefaultHeader("Content-Type",
							"application/x-www-form-urlencoded");
					String loginData = buildLoginData(username, password);
					result = provider.post(loginData);
					Log.d("Auth", new String(result.getBody()));
					String json = new String(result.getBody());
					JsonObject obj = new JsonParser().parse(json)
							.getAsJsonObject().get("json").getAsJsonObject();
					modHash = obj.get("data").getAsJsonObject().get("modhash")
							.getAsString();
					authToken = obj.get("data").getAsJsonObject().get("cookie")
							.getAsString();
					isLoggedIn = true;
				} catch (Exception e) {
					Log.e(RedditAuthenticationModule.class.getSimpleName(),
							"Error with Login", e);
					exception = e;
				}

				if (exception == null) {
					callback.onSuccess(this.result);
				} else {
					callback.onFailure(exception);
				}

			}

			private String buildLoginData(String username, String password) {
				StringBuilder builder = new StringBuilder();
				builder.append("user=").append(URLEncoder.encode(username))
						.append("&api_type=json&passwd=").append(
								URLEncoder.encode(password));
				return builder.toString();
			}

		});

	}

Implementing Pipes:

Before

MyCustomPipe.java

public class MyCustomPipe implements Pipe {
//snip
@Override
    public void readWithFilter(ReadFilter filter, final Callback<List<T>> callback) {
        if (filter == null) {
            filter = new ReadFilter();
        }
        final ReadFilter innerFilter = filter;

        new AsyncTask<Void, Void, Void>() {
            List<T> result = null;
            Exception exception = null;

            @Override
            protected Void doInBackground(Void... voids) {
                try {
                    HttpProvider httpProvider = getHttpProvider("http://www.devnexus.com/s/speakers.json");
                    HeaderAndBody httpResponse = httpProvider.get();
                    byte[] responseBody = httpResponse.getBody();
                    String responseAsString = new String(responseBody, encoding);
                    JsonParser parser = new JsonParser();
                    JsonElement httpJsonResult = parser.parse(responseAsString);
                    httpJsonResult = getResultElement(httpJsonResult, dataRoot);
                    if (httpJsonResult.isJsonArray()) {
                        T[] resultArray = gson.fromJson(httpJsonResult, arrayKlass);
                        this.result = Arrays.asList(resultArray);
                    } else {
                        T resultObject = gson.fromJson(httpJsonResult, klass);
                        List<T> resultList = new ArrayList<T>(1);
                        resultList.add(resultObject);
                        this.result = resultList;
                    }
                } catch (Exception e) {
                    exception = e;
                }
                return null;
            }

            @Override
            protected void onPostExecute(Void ignore) {
                super.onPostExecute(ignore);
                if (exception == null) {
                    callback.onSuccess(this.result);
                } else {
                    callback.onFailure(exception);
                }
            }
        }.execute();

    }
}

Application.java

Pipeline pipeline = new Pipeline(MY_URL);
pipeline.add("speakers", new MyCustomPipe());

After

MyCustomPipeHandler.java

public class MyCustomPipeHandler implements PipeHandler { 
  @Override
  public List<T> onReadWithFilter(ReadFilter filter, Pipe<T> requestingPipe) {
    List<T> result;
    HttpProvider httpProvider = getHttpProvider("https://devnexus.com/s/speakers.json");

    HeaderAndBody httpResponse = httpProvider.get();
    byte[] responseBody = httpResponse.getBody();
    String responseAsString = new String(responseBody, encoding);
    JsonParser parser = new JsonParser();
    JsonElement httpJsonResult = parser.parse(responseAsString);
    httpJsonResult = getResultElement(httpJsonResult, dataRoot);
    if (httpJsonResult.isJsonArray()) {
      T[] resultArray = gson.fromJson(httpJsonResult, arrayKlass);
      result = Arrays.asList(resultArray);
    } else {
      T resultObject = gson.fromJson(httpJsonResult, klass);
      List<T> resultList = new ArrayList<T>(1);
      resultList.add(resultObject);
      result = resultList;
    }
  return result;

  }

}

Application.java

Pipeline pipeline = new Pipeline(MY_URL);

PipeConfig config = new PipeConfig();
config.setHandler(new MyCustomePipeHandler());

pipeline.pipe("speakers", config);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment