/** * Implements {@link #setEnabled(boolean)}}. */ private synchronized AppCenterFuture<Void> setInstanceEnabledAsync(final boolean enabled) { final DefaultAppCenterFuture<Void> future = new DefaultAppCenterFuture<>(); if (checkPrecondition()) { mHandler.post(new Runnable() { @Override public void run() { setInstanceEnabled(enabled); future.complete(null); } }); } else { future.complete(null); } return future; }
@Override public void run() { /* Same runnable is used whether App Center or the service is disabled or not started. */ future.complete(valueIfDisabledOrNotStarted); } };
/** * Implements {@link #getMinidumpDirectory()} at instance level. */ private synchronized AppCenterFuture<String> getNewMinidumpDirectoryAsync() { final DefaultAppCenterFuture<String> future = new DefaultAppCenterFuture<>(); postAsyncGetter(new Runnable() { @Override public void run() { future.complete(ErrorLogHelper.getNewMinidumpDirectory().getAbsolutePath()); } }, future, null); return future; }
@Test public void completeTwiceIgnored() { DefaultAppCenterFuture<Integer> future = new DefaultAppCenterFuture<>(); future.complete(1); future.complete(2); assertEquals(Integer.valueOf(1), future.get()); }
@Test @PrepareForTest(HandlerUtils.class) public void multipleCallbacks() { mockStatic(HandlerUtils.class); doAnswer(new Answer<Void>() { @Override public Void answer(InvocationOnMock invocation) { ((Runnable) invocation.getArguments()[0]).run(); return null; } }).when(HandlerUtils.class); HandlerUtils.runOnUiThread(any(Runnable.class)); DefaultAppCenterFuture<Integer> future = new DefaultAppCenterFuture<>(); @SuppressWarnings("unchecked") AppCenterConsumer<Integer> function = mock(AppCenterConsumer.class); future.thenAccept(function); future.thenAccept(function); future.complete(1); verify(function, times(2)).accept(1); /* Works also after completion. */ future.thenAccept(function); future.thenAccept(function); verify(function, times(4)).accept(1); } }
@Override public synchronized void thenAccept(final AppCenterConsumer<T> function) { if (isDone()) { HandlerUtils.runOnUiThread(new Runnable() { @Override public void run() { function.accept(mResult); } }); } else { if (mConsumers == null) { mConsumers = new LinkedList<>(); } mConsumers.add(function); } }
@Override public void run() { result.set(future.get()); } };
@Override public void run() { future.complete(null); } });
/** * Implements {@link #hasCrashedInLastSession()} at instance level. */ private synchronized AppCenterFuture<Boolean> hasInstanceCrashedInLastSession() { final DefaultAppCenterFuture<Boolean> future = new DefaultAppCenterFuture<>(); postAsyncGetter(new Runnable() { @Override public void run() { future.complete(mLastSessionErrorReport != null); } }, future, false); return future; }
/** * Set result. * * @param value result. */ public synchronized void complete(final T value) { if (!isDone()) { mResult = value; mLatch.countDown(); if (mConsumers != null) { HandlerUtils.runOnUiThread(new Runnable() { @Override public void run() { /* No need to synchronize anymore as consumers cannot be modified anymore. */ for (AppCenterConsumer<T> function : mConsumers) { function.accept(value); } mConsumers = null; } }); } } }
final DefaultAppCenterFuture<Void> future = new DefaultAppCenterFuture<>(); final Runnable coreDisabledRunnable = new Runnable() { future.complete(null);
@Override public void run() { future.complete(mLastSessionErrorReport != null); } }, future, false);
/** * Implements {@link #getLastSessionCrashReport()} at instance level. */ private synchronized AppCenterFuture<ErrorReport> getInstanceLastSessionCrashReport() { final DefaultAppCenterFuture<ErrorReport> future = new DefaultAppCenterFuture<>(); postAsyncGetter(new Runnable() { @Override public void run() { future.complete(mLastSessionErrorReport); } }, future, null); return future; }
@Override public void run() { result.set(future.isDone()); } };
/** * {@link #setMaxStorageSize(long)} implementation at instance level. * * @param storageSizeInBytes size to set SQLite database to in bytes. * @return future of result of set maximum storage size. */ private synchronized AppCenterFuture<Boolean> setInstanceMaxStorageSizeAsync(long storageSizeInBytes) { DefaultAppCenterFuture<Boolean> setMaxStorageSizeFuture = new DefaultAppCenterFuture<>(); if (mConfiguredFromApp) { AppCenterLog.error(LOG_TAG, "setMaxStorageSize may not be called after App Center has been configured."); setMaxStorageSizeFuture.complete(false); return setMaxStorageSizeFuture; } if (storageSizeInBytes < MINIMUM_STORAGE_SIZE) { AppCenterLog.error(LOG_TAG, "Maximum storage size must be at least " + MINIMUM_STORAGE_SIZE + " bytes."); setMaxStorageSizeFuture.complete(false); return setMaxStorageSizeFuture; } if (mSetMaxStorageSizeFuture != null) { AppCenterLog.error(LOG_TAG, "setMaxStorageSize may only be called once per app launch."); setMaxStorageSizeFuture.complete(false); return setMaxStorageSizeFuture; } mMaxStorageSizeInBytes = storageSizeInBytes; mSetMaxStorageSizeFuture = setMaxStorageSizeFuture; return setMaxStorageSizeFuture; }
@Override public void run() { future.complete(false); } });
/** * Help implementing static isEnabled() for services with future. * * @return future with result being <code>true</code> if enabled, <code>false</code> otherwise. */ protected synchronized AppCenterFuture<Boolean> isInstanceEnabledAsync() { final DefaultAppCenterFuture<Boolean> future = new DefaultAppCenterFuture<>(); postAsyncGetter(new Runnable() { @Override public void run() { future.complete(true); } }, future, false); return future; }
/** * Implements {@link #isEnabled()} at instance level. */ private synchronized AppCenterFuture<Boolean> isInstanceEnabledAsync() { final DefaultAppCenterFuture<Boolean> future = new DefaultAppCenterFuture<>(); if (checkPrecondition()) { mAppCenterHandler.post(new Runnable() { @Override public void run() { future.complete(true); } }, new Runnable() { @Override public void run() { future.complete(false); } }); } else { future.complete(false); } return future; }
@Override public void run() { setInstanceEnabled(enabled); future.complete(null); } });
/** * Implementation of {@link WrapperSdkExceptionManager#getUnprocessedErrorReports()}. */ AppCenterFuture<Collection<ErrorReport>> getUnprocessedErrorReports() { final DefaultAppCenterFuture<Collection<ErrorReport>> future = new DefaultAppCenterFuture<>(); postAsyncGetter(new Runnable() { @Override public void run() { Collection<ErrorReport> reports = new ArrayList<>(mUnprocessedErrorReports.size()); for (ErrorLogReport entry : mUnprocessedErrorReports.values()) { reports.add(entry.report); } future.complete(reports); } }, future, Collections.<ErrorReport>emptyList()); return future; }