/*
* Copyright 2016 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.android.agera.basicsamplewithoutcallbacks;
import com.google.android.agera.Result;
import com.google.android.agera.Supplier;
import android.support.annotation.NonNull;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* This implements getting a list of usernames. A fake latency is added. The number of returned
* usernames is controlled by a public static field, to allow us to write deterministic tests. This
* gets the usernames on the thread it is called from.
* <p/>
* Typically, this would directly implement {@link Supplier<Result<List<String>>>} and {@link
* Supplier#get()} would be a wrapper around {@link #getUsernames()}. Of course this is possible
* only if this
* class is controlled by the same team.
*/
public class UsernamesSupplier implements Supplier<Result<List<String>>> {
/**
* Config constant that determines the number of users to return. {@link #getUsernames()}
* returns null if this is negative.
*/
public static int NUMBER_OF_USERS = 4;
private static final String TAG = UsernamesSupplier.class.getSimpleName();
/**
* This method fakes getting a list of usernames from a server. It returns null if {@link
* #NUMBER_OF_USERS} is negative. It simulates server latency to return usernames. It is a
* blocking call.
*/
private List<String> getUsernames() {
// Simulate network latency
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
Log.e(TAG, e.toString());
return null;
}
if (NUMBER_OF_USERS < 0) {
return null;
}
String name1 = "Joe";
String name2 = "Amanda";
final List<String> usernames = new ArrayList<String>();
Random random = new Random();
for (int i = 0; i < NUMBER_OF_USERS; i++) {
int number = random.nextInt(50);
if (System.currentTimeMillis() % 2 == 0) {
usernames.add(name1 + number);
} else {
usernames.add(name2 + number);
}
}
return usernames;
}
@NonNull
@Override
public Result<List<String>> get() {
List<String> usernames = getUsernames();
if (usernames == null) {
return Result.failure();
} else {
return Result.success(getUsernames());
}
}
}