Skip to content

getId() implementation with instrumented tests. #703

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 17 commits into from
Aug 30, 2019
Merged

Conversation

ankitaj224
Copy link
Contributor

No description provided.

@googlebot googlebot added the cla: yes Override cla label Aug 13, 2019
Copy link
Contributor

@andirayo andirayo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good! Major comments are:
a) Please avoid using "Fiid", the identifier is called "Fid".
b) Most methods look good, but there is one method that is too big and hard too read. My general suggestion is that (besides input-parameter checking) every method should try to be limited to 1 if-clause or 1 try-catch-block or 1 loop.
c)

this.firebaseApp = firebaseApp;
this.serviceClient = serviceClient;
this.executor = Executors.newFixedThreadPool(6);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this not a constant?
Why 6?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changed it. Its a random number, based on 3 APIs I chose double the number of available threads.

*
* <pre>
* The workflow is:
* check if cache empty or cache status is REGISTER_ERROR
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This description is somewhat confusing to me: What happens if the status is REGISTER_ERROR or not?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also what happens if status is UNREGISTERED?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated the description. Let me know, if you want me to change further.

long creationTime = Utils.getCurrentTimeInSeconds();

InstallationResponse installationResponse =
serviceClient.createFirebaseInstallation(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think, I mentioned this before (I know it's pretty nitty):
Can we change the order of the parameters maybe?
like first FID, then API-Key, then all the metadata?
Or first the API-Key, then FID, then all the metadata?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changed it in the parent PR. 34848c6

- Detailed JavaDocs
- Renaming FiidCache as PersistedFid
*/
private void registerAndSaveFID(String fid) throws FirebaseInstallationsException {
private void registerAndSaveFid(String fid) throws FirebaseInstallationsException {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This method has to be asynchronous to not block callers to #getId.
What I'm saying is that if someone calls #getId, the method should immediately return an FID independent of if that FID has to be registered with FIS or not.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done. Please take another look.

return createFidAndPersistFidEntry();
}

if (persistedFidExistsAndRegistered(persistedFidEntryValue)) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we please move this case to the top, because this is the standard case.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, something we added to the Web SDK:
We should check here if the current FIS Auth Token is still valid.
If not, this request should trigger an asynchronous request to FIS to update the local FIS Auth Token.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As discussed offline, will add this when auth token method is implemented.

- Make registerAnsSaveFid non blocking call in getId()
- PersistedFidEntry builder with default values
return persistedFidEntryValue.getFirebaseInstallationId();
if (persistedFidExistsAndUnregistered(persistedFidEntry)) {
Tasks.call(executor, () -> registerAndSaveFid(persistedFidEntry.getFirebaseInstallationId()));
return persistedFidEntry.getFirebaseInstallationId();
}

return null;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How can this method ever return NULL?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If delete() is called and there is no network availability, we mark registration status as deleted. In that case, it returns NULL.

Is that not right?

Copy link
Contributor Author

@ankitaj224 ankitaj224 Aug 21, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@andirayo Can you please check this? I think the issue is, we have introduced a state DELETED as per fis-android-sdk-design doc. But from your comments on my doc, seems like you don't want the DELETED state.

We can change the above function as :

@workerthread

private String getFirebaseInstallationId() throws FirebaseInstallationsException {

PersistedFidEntry persistedFidEntry = persistedFid.readPersistedFidEntryValue();

if (persistedFidExistsAndRegistered(persistedFidEntry)) {
  return persistedFidEntry.getFirebaseInstallationId();
} else  if (persistedFidExistsAndUnregistered(persistedFidEntry)) {
  Tasks.call(executor, () -> registerAndSaveFid(persistedFidEntry.getFirebaseInstallationId()));
  return persistedFidEntry.getFirebaseInstallationId();
}
  return createFidAndPersistFidEntry();
}

Wdyt?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Except for the "else if" in there (an else is not necessary after you "return" in the if-statement, I like it better yes.

How about
// not registered with FIS yet
if (fidExistsAndUnregistered(persistedFidEntry)) {
Tasks.call(executor, () -> registerAndSaveFid(persistedFidEntry.getFirebaseInstallationId()));
}
// return FID from in local storage
if (fidExists(persistedFidEntry)) {
return persistedFidEntry.getFirebaseInstallationId();
}

return createFidAndPersistFidEntry();

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what do you all think about something like this? I haven't checked that it'll compile, but it seems to clearly express what we're trying to do:

  1. return the existing fid if it's there
  2. create one if it didn't exist
  3. trigger a background registration if it wasn't previously registered
public Task<FID> getFid() {
  return getExistingFid()
    .continueWith(orElse(this::createAndPersistNewFid))
    .onSuccessTask(this::registerFidIfNecessary);
}

public static <F, T> Continuation<F, T> orElse(Supplier<T> supplier) {
  return t -> {
    if (t.isSuccessful()) { return t.getResult(); }
    return supplier.get();
  };
}

private FID createAndPersistNewFid() {
  FID fid = Utils.createRandomFid();
  persist(fid);
  return fid;
}

private void registerFidIfNecessary(FID fid) {
  // do network stuff
}

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ciarand I tried incorporating the changes you mentioned below:

  @RequiresApi(api = Build.VERSION_CODES.N)
  private Task<String> getFid() {
    return Tasks.call(executor, this::getExistingFid)
        .continueWith(orElse(new NewFidSupplier()))
        .onSuccessTask(this::registerFidIfNecessary);
  }

  private PersistedFidEntry getExistingFid() throws FirebaseInstallationsException {
    PersistedFidEntry persistedFidEntry = persistedFid.readPersistedFidEntryValue();
    if (persistedFidMissingOrInErrorState(persistedFidEntry)) {
      throw new FirebaseInstallationsException(
          "Failed to get existing fid.", FirebaseInstallationsException.Status.CLIENT_ERROR);
    }
    return persistedFidEntry;
  }

  @RequiresApi(api = Build.VERSION_CODES.N)
  @NonNull
  public static <F, T> Continuation<F, T> orElse(@NonNull Supplier<T> supplier) {
    return t -> {
      if (t.isSuccessful()) {
        return (T) t.getResult();
      }
      return supplier.get();
    };
  }

  @RequiresApi(api = Build.VERSION_CODES.N)
  class NewFidSupplier implements Supplier<PersistedFidEntry> {

    @Override
    public PersistedFidEntry get() {
      return createAndPersistNewFid();
    }
  }

  private PersistedFidEntry createAndPersistNewFid() {
    String fid = Utils.createRandomFid();
    try {
      persistFid(fid);
      PersistedFidEntry persistedFidEntry = persistedFid.readPersistedFidEntryValue();
      return persistedFidEntry;
    } catch (FirebaseInstallationsException e) {
      // Exception handling
    }
    return PersistedFidEntry.builder().build();
  }

  private void persistFid(String fid) throws FirebaseInstallationsException {
    boolean firstUpdateCacheResult =
        persistedFid.insertOrUpdatePersistedFidEntry(
            PersistedFidEntry.builder()
                .setFirebaseInstallationId(fid)
                .setRegistrationStatus(PersistedFid.RegistrationStatus.UNREGISTERED)
                .build());

    if (!firstUpdateCacheResult) {
      throw new FirebaseInstallationsException(
          "Failed to update client side cache.",
          FirebaseInstallationsException.Status.CLIENT_ERROR);
    }
  }

  private Task<String> registerFidIfNecessary(PersistedFidEntry persistedFidEntry) {
    if (persistedFidEntry.getRegistrationStatus() != PersistedFid.RegistrationStatus.REGISTERED) {
      Tasks.call(executor, () -> registerAndSaveFid(persistedFidEntry));
    }
    return Tasks.forResult(persistedFidEntry.getFirebaseInstallationId());
  }

  /** Registers the created Fid with FIS Servers and update the shared prefs. */
  private Void registerAndSaveFid(PersistedFidEntry persistedFidEntry)
      throws FirebaseInstallationsException {
    // network call
  }

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have 2 concerns:

  • Supplier get call requires API level 24, Is this right way of handling it?
  • Exception handling by the Supplier while persisting the newly created fid

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah we can't use the standard java.util.functional.Supplier interface. We can just define one in the parent class:

interface Supplier<T> {
  T get() throws Exception;
}

When you say "Exception handling by the Supplier while persisting the newly created fid" do you mean you're worried that you can't propagate exceptions or you're worried that they will be propagated?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated. Thanks for the comments.

}

@Test
public void testUpdateAndReadCacheEntry() throws Exception {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can you add some comments explaining what this is testing?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done. Thanks. PTAL.

return persistedFidEntry.getFirebaseInstallationId();
}

return null;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

mark it @Nullable if it's nullable

return System.currentTimeMillis() / 1000;
}

public static boolean isNetworkAvailable(Context context) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

as above, I'd inject a "NetworkChecker" or similar so that you're not forced to muck around with a real ConnectivityManager in tests

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Skipped the connectivity check here. Fred was of the opinion - the developer should check and handle the cases of network connectivity instead of us doing it.


InstallationResponse installationResponse =
serviceClient.createFirebaseInstallation(
firebaseApp.getOptions().getApiKey(),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can you add /* paramName= */ style comments here? otherwise it looks really easy to transpose one of the string params into another

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done. Thanks.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not seeing them in the diff, am I missing something?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done. f8e75fd

this.firebaseApp = firebaseApp;
this.serviceClient = serviceClient;
this.executor = Executors.newFixedThreadPool(THREAD_COUNT);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

a fixed thread pool never GC's idle threads ("The threads in the pool will exist until it is explicitly shutdown.")

  1. are you sure we need 6 threads? that seems like a huuuuge amount
  2. can we not inject the executor in this constructor? it's usually an antipattern for the instantiating class to also instantiate its own thread pool

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was referring to FLoC sdk while implementing the executor. I am not sure whats the best approach to decide the thread pool count.

If I just inject the executor, the user of the sdk has to instantiate the executor class. This might be a wrong question, but, how will they know the right number of threads required? Or, how does this improve the performance?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do you actually need multiple threads? a cached executor service w/ a cap of one thread and ~30s idle time should be sufficient, no? You're never actually running more than one thing at a time right?

If I just inject the executor, the user of the sdk has to instantiate the executor class.

I'm suggesting that you move the instantiation of the executor service into the delegating constructor, which ensures there's at least one constructor where you can inject a test-controllable executor.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I will be running more than one task at a time( Line 96 and Line 170 ). Task for getId and another task for registering FID.

Do you recommend using newCachedThreadPool() or have a custom executor

new ThreadPoolExecutor(0, 2,
30L, TimeUnit.SECONDS,
new SynchronousQueue());

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You're loading two separate jobs onto the same executor, but they don't run in parallel right? The getId call runs first, then the registration call runs asynchronously after the getId call finishes.

A custom executor is probably fine. new ThreadPoolExecutor(0, 1, 30L, TimeUnit.SECONDS, new SynchronousQueue<>());

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated. PTAL.

Copy link
Contributor

@andirayo andirayo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think, there is a question around the stati of requests to FIS API.
Aren't me missing a status for "PENDING" to avoid race conditions?
Also, what is the difference between "UNREGISTERED" and "REGISTER_ERROR"?

this.firebaseApp = firebaseApp;
this.serviceClient = serviceClient;
this.executor = Executors.newFixedThreadPool(THREAD_COUNT);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1

return persistedFidEntryValue.getFirebaseInstallationId();
if (persistedFidExistsAndUnregistered(persistedFidEntry)) {
Tasks.call(executor, () -> registerAndSaveFid(persistedFidEntry.getFirebaseInstallationId()));
return persistedFidEntry.getFirebaseInstallationId();
}

return null;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Except for the "else if" in there (an else is not necessary after you "return" in the if-statement, I like it better yes.

How about
// not registered with FIS yet
if (fidExistsAndUnregistered(persistedFidEntry)) {
Tasks.call(executor, () -> registerAndSaveFid(persistedFidEntry.getFirebaseInstallationId()));
}
// return FID from in local storage
if (fidExists(persistedFidEntry)) {
return persistedFidEntry.getFirebaseInstallationId();
}

return createFidAndPersistFidEntry();

UNREGISTERED,
// Cache entry is in error state when syncing with Firebase backend
// Persisted Fid entry is in error state when syncing with Firebase backend
REGISTER_ERROR,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what's the difference between UNREGISTERED AND REGISTER_ERROR?

DELETED
}

private static final String SHARED_PREFS_NAME = "FiidCache";
private static final String SHARED_PREFS_NAME = "PersistedFid";

private static final String FIREBASE_INSTALLATION_ID_KEY = "Fid";
private static final String AUTH_TOKEN_KEY = "AuthToken";
private static final String REFRESH_TOKEN_KEY = "RefreshToken";
private static final String TOKEN_CREATION_TIME_IN_SECONDS_KEY = "TokenCreationEpochInSecs";
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is usually called a "Timestamp".
Any reason to prefer "Creation Time in Seconds" over "Timestamp"?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the creation timestamp when registering the FID on FIS Servers and not any value returned by the server.
This is used to calculate if token is valid or not.

String authToken = prefs.getString(getSharedPreferencesKey(AUTH_TOKEN_KEY), null);
String refreshToken = prefs.getString(getSharedPreferencesKey(REFRESH_TOKEN_KEY), null);
long tokenCreationTime =
prefs.getLong(getSharedPreferencesKey(TOKEN_CREATION_TIME_IN_SECONDS_KEY), 0);
long expiresIn = prefs.getLong(getSharedPreferencesKey(EXPIRES_IN_SECONDS_KEY), 0);

if (iid == null || status == -1) {
if (fid == null || status == -1) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this not a constant?
What does -1 mean?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we pass -1 as a default in the call to prefs.getInt

import com.google.firebase.FirebaseApp;
import com.google.firebase.FirebaseOptions;
import com.google.firebase.installations.local.PersistedFid;
import com.google.firebase.installations.local.PersistedFidEntry;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the difference between PersistedFid and PersistedFidEntry?

public class FiidCache {
// Status of each cache entry
// NOTE: never change the ordinal of the enum values because the enum values are stored in cache
public class PersistedFid {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How about calling this LocalStorage or FisStorage or FirebaseInstallationsStorage?

* Firebase Installation attributes and the persisted status of this entry.
*/
@AutoValue
public abstract class PersistedFidEntry {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please feel free to ignore this comment.
Maybe, it's easier to discuss in person and just submit this PR with this name.
I'm just wondering:
Why can't we just call this "FirebaseInstallation"?
(or "PersistedFirebaseInstallation" in case you want to make it obvious that it's received from local storage)
Let's discuss in person after this is submitted.

@ankitaj224 ankitaj224 self-assigned this Aug 26, 2019
.isEqualTo(TEST_FID_1);
assertWithMessage("Registration status doesn't match")
.that(entryValue.getRegistrationStatus())
.isEqualTo(PersistedFid.RegistrationStatus.PENDING);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what prevents the FID from being registered at this point in the test code?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Honestly, nothing. I thought about it. But the test runs have been consistent with registration taking some time. Is there a better way to test it or do i skip the status check altogether.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ciarand Your thoughts.


InstallationResponse installationResponse =
serviceClient.createFirebaseInstallation(
firebaseApp.getOptions().getApiKey(),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

?

@@ -78,7 +89,7 @@ public synchronized PersistedFidEntry readPersistedFidEntryValue() {

return PersistedFidEntry.builder()
.setFirebaseInstallationId(fid)
.setPersistedStatus(PersistedStatus.values()[status])
.setRegistrationStatus(RegistrationStatus.values()[status])
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, technically you're just verifying that there is a number in shared prefs with that key. I'm saying we should check that the number is >= 0 and < RegistrationStatus.values().length as well

@@ -126,7 +130,7 @@ public void testGetId_PersistedFidOk_BackendOk() throws Exception {
.isEqualTo(PersistedFid.RegistrationStatus.PENDING);

// Waiting for Task that registers FID on the FIS Servers
Thread.sleep(500);
executor.awaitTermination(500, TimeUnit.MILLISECONDS);
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ciarand I was able to eliminate sleep entirely. Instead awaiting for the executor to complete. I am not sure if you saw these changes.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nice

@@ -126,7 +130,7 @@ public void testGetId_PersistedFidOk_BackendOk() throws Exception {
.isEqualTo(PersistedFid.RegistrationStatus.PENDING);

// Waiting for Task that registers FID on the FIS Servers
Thread.sleep(500);
executor.awaitTermination(500, TimeUnit.MILLISECONDS);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nice

/**
* Creates a FID on the FIS Servers by calling FirebaseInstallations API create method.
*
* @param apiKey API Key that has access to FIS APIs
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ciarand Added the param javadocs. Is that not sufficient.

@ankitaj224
Copy link
Contributor Author

/retest

@google-oss-bot
Copy link
Contributor

google-oss-bot commented Aug 30, 2019

@ankitaj224: The following test failed, say /retest to rerun them all:

Test name Commit Details Rerun command
api-information 16544a6 link /test api-information

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository. I understand the commands that are listed here.

@ankitaj224 ankitaj224 merged commit 429581e into ankita_fis Aug 30, 2019
ankitaj224 added a commit that referenced this pull request Aug 30, 2019
* Adding Firebase Installations module

* Readding .idea files that were deleted in previous commit

* Revert "Adding Firebase Installations module"

This reverts commit 2ec4aef.

* Revert "Readding .idea files that were deleted in previous commit"

This reverts commit 7b4ebcf.

* Adding Firebase Installations module.

* Readding .idea files that were deleted in previous commit

* Revert "Readding .idea files that were deleted in previous commit"

This reverts commit 7b4ebcf.

* Revert "Adding Firebase Installations module" with hidden files

This reverts commit 2ec4aef.

* Addressing review comments.

* Http client to call FIS backend service.

* Http client to call FIS backend service.

* Http client to call FIS backend service.

* Adding Firebase Installations module

* Adding Firebase Installations module.

* Readding .idea files that were deleted in previous commit

* Readding .idea files that were deleted in previous commit

* Revert "Adding Firebase Installations module"

This reverts commit 2ec4aef.

* Revert "Readding .idea files that were deleted in previous commit"

This reverts commit 7b4ebcf.

* Revert "Readding .idea files that were deleted in previous commit"

This reverts commit 7b4ebcf.

* Revert "Adding Firebase Installations module" with hidden files

This reverts commit 2ec4aef.

* Addressing review comments.

* Http client to call FIS backend service.

* Http client to call FIS backend service.

* Initial Code structure for FIS Android SDK (#648)

* Adding an interface library for Firebase Installations SDK

* Adding Firebase Installations module

* Adding Firebase Installations module.

* Readding .idea files that were deleted in previous commit

* Revert "Adding Firebase Installations module"

This reverts commit 2ec4aef.

* Revert "Readding .idea files that were deleted in previous commit"

This reverts commit 7b4ebcf.

* Add firebase installations project path

* Adding Firebase Installations module.

* Readding .idea files that were deleted in previous commit

* Revert "Adding Firebase Installations module"

This reverts commit 2ec4aef.

* Revert "Readding .idea files that were deleted in previous commit"

This reverts commit 7b4ebcf.

* Add firebase installations project path

* Fixing formattinf issues.

* Revert "Adding Firebase Installations module" with hidden files

This reverts commit 2ec4aef.

* Addressing review comments.

* Making InstallationTokenResult an AutoValue class.

* Http client to call FIS backend service.

* Addresing comments and introducing new FirebaseInstallationService
Exception.

* Implementing getId method in FirebaseInstallation to call backend.

* 1. Adding instrumentation tests.
2. Introducing serviceClient level and main class exceptions.

* Addressing Di's comments.

* Addressing Rayo's comments

* Updating parameters order in ServiceClient.

* Updating createRandomFid as per Rayo's comments.

* getId() implementation with instrumented tests. (#703)

* getId() implementation with instrumented tests.

* Addressing rayo's comments.
- Detailed JavaDocs
- Renaming FiidCache as PersistedFid

* Addressing rayo's comments.
- Detailed JavaDocs
- Renaming FiidCache as PersistedFid

* Addresing comments to resoleve the following:
- Make registerAnsSaveFid non blocking call in getId()
- PersistedFidEntry builder with default values

* Addressing Ciaran and Rayo's comments.

* Addressing Ciaran's comments

* Addressing Ciaran's comments

* Adding param comments and checking if registration status is valid.

* Correcting lint warning: uses-permission should be declared before
application in AndroidManifest.xml

* Adding custom assertThat with more readable assertions

* Correcting instrumented tests to be reliable.
@ankitaj224 ankitaj224 deleted the create_fis branch August 30, 2019 21:48
ankitaj224 added a commit that referenced this pull request Sep 5, 2019
* Adding Firebase Installations module

* Readding .idea files that were deleted in previous commit

* Revert "Adding Firebase Installations module"

This reverts commit 2ec4aef.

* Revert "Readding .idea files that were deleted in previous commit"

This reverts commit 7b4ebcf.

* Adding Firebase Installations module.

* Readding .idea files that were deleted in previous commit

* Revert "Readding .idea files that were deleted in previous commit"

This reverts commit 7b4ebcf.

* Revert "Adding Firebase Installations module" with hidden files

This reverts commit 2ec4aef.

* Addressing review comments.

* Http client to call FIS backend service.

* Http client to call FIS backend service.

* Http client to call FIS backend service.

* Adding Firebase Installations module

* Adding Firebase Installations module.

* Readding .idea files that were deleted in previous commit

* Readding .idea files that were deleted in previous commit

* Revert "Adding Firebase Installations module"

This reverts commit 2ec4aef.

* Revert "Readding .idea files that were deleted in previous commit"

This reverts commit 7b4ebcf.

* Revert "Readding .idea files that were deleted in previous commit"

This reverts commit 7b4ebcf.

* Revert "Adding Firebase Installations module" with hidden files

This reverts commit 2ec4aef.

* Addressing review comments.

* Http client to call FIS backend service.

* Http client to call FIS backend service.

* Initial Code structure for FIS Android SDK (#648)

* Adding an interface library for Firebase Installations SDK

* Adding Firebase Installations module

* Adding Firebase Installations module.

* Readding .idea files that were deleted in previous commit

* Revert "Adding Firebase Installations module"

This reverts commit 2ec4aef.

* Revert "Readding .idea files that were deleted in previous commit"

This reverts commit 7b4ebcf.

* Add firebase installations project path

* Adding Firebase Installations module.

* Readding .idea files that were deleted in previous commit

* Revert "Adding Firebase Installations module"

This reverts commit 2ec4aef.

* Revert "Readding .idea files that were deleted in previous commit"

This reverts commit 7b4ebcf.

* Add firebase installations project path

* Fixing formattinf issues.

* Revert "Adding Firebase Installations module" with hidden files

This reverts commit 2ec4aef.

* Addressing review comments.

* Making InstallationTokenResult an AutoValue class.

* Http client to call FIS backend service.

* Addresing comments and introducing new FirebaseInstallationService
Exception.

* Implementing getId method in FirebaseInstallation to call backend.

* 1. Adding instrumentation tests.
2. Introducing serviceClient level and main class exceptions.

* Addressing Di's comments.

* Addressing Rayo's comments

* Updating parameters order in ServiceClient.

* Updating createRandomFid as per Rayo's comments.

* getId() implementation with instrumented tests. (#703)

* getId() implementation with instrumented tests.

* Addressing rayo's comments.
- Detailed JavaDocs
- Renaming FiidCache as PersistedFid

* Addressing rayo's comments.
- Detailed JavaDocs
- Renaming FiidCache as PersistedFid

* Addresing comments to resoleve the following:
- Make registerAnsSaveFid non blocking call in getId()
- PersistedFidEntry builder with default values

* Addressing Ciaran and Rayo's comments.

* Addressing Ciaran's comments

* Addressing Ciaran's comments

* Adding param comments and checking if registration status is valid.

* Correcting lint warning: uses-permission should be declared before
application in AndroidManifest.xml

* Adding custom assertThat with more readable assertions

* Correcting instrumented tests to be reliable.
@firebase firebase locked and limited conversation to collaborators Oct 8, 2019
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants