Merge "Unhide APIs in WindowInsetsCompat and ViewDragHelper" into androidx-master-dev
diff --git a/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeActivity.java b/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeActivity.java
index b9faf73..e5230bd1 100644
--- a/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeActivity.java
+++ b/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeActivity.java
@@ -16,11 +16,15 @@
package androidx.appcompat.app;
+import android.content.res.Configuration;
+
+import androidx.annotation.NonNull;
import androidx.appcompat.test.R;
import androidx.appcompat.testutils.BaseTestActivity;
public class NightModeActivity extends BaseTestActivity {
private int mLastNightModeChange = Integer.MIN_VALUE;
+ private Configuration mLastConfigurationChange;
@Override
protected int getContentViewLayoutResId() {
@@ -32,6 +36,18 @@
mLastNightModeChange = mode;
}
+ @Override
+ public void onConfigurationChanged(@NonNull Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ mLastConfigurationChange = newConfig;
+ }
+
+ Configuration getLastConfigurationChangeAndClear() {
+ final Configuration config = mLastConfigurationChange;
+ mLastConfigurationChange = null;
+ return config;
+ }
+
int getLastNightModeAndReset() {
final int mode = mLastNightModeChange;
mLastNightModeChange = Integer.MIN_VALUE;
diff --git a/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeTestCase.java b/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeTestCase.java
index ac5cd5c..0550ec5 100644
--- a/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeTestCase.java
+++ b/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeTestCase.java
@@ -32,6 +32,7 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
import android.app.Instrumentation;
import android.content.res.Configuration;
@@ -310,6 +311,21 @@
});
}
+ @Test
+ public void testOnConfigurationChangeNotCalled() throws Throwable {
+ NightModeActivity activity = mActivityTestRule.getActivity();
+ // Set local night mode to YES
+ setNightModeAndWait(mActivityTestRule, MODE_NIGHT_YES, mSetMode);
+ // Assert that onConfigurationChange was not called on the original activity
+ assertNull(activity.getLastConfigurationChangeAndClear());
+
+ activity = mActivityTestRule.getActivity();
+ // Set local night mode back to NO
+ setNightModeAndWait(mActivityTestRule, MODE_NIGHT_NO, mSetMode);
+ // Assert that onConfigurationChange was not called
+ assertNull(activity.getLastConfigurationChangeAndClear());
+ }
+
@After
public void cleanup() throws Throwable {
// Reset the default night mode
diff --git a/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeUiModeConfigChangesTestCase.java b/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeUiModeConfigChangesTestCase.java
index 246f842..0badb08 100644
--- a/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeUiModeConfigChangesTestCase.java
+++ b/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeUiModeConfigChangesTestCase.java
@@ -22,6 +22,7 @@
import static androidx.appcompat.testutils.NightModeUtils.setNightModeAndWait;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
import android.content.res.Configuration;
@@ -68,23 +69,39 @@
}
@Test
- public void testResourcesNotUpdated() throws Throwable {
- final int defaultNightMode = mActivityTestRule.getActivity()
- .getResources().getConfiguration().uiMode
- & Configuration.UI_MODE_NIGHT_MASK;
-
+ public void testOnConfigurationChangeCalled() throws Throwable {
// Set local night mode to YES
setNightModeAndWait(mActivityTestRule, MODE_NIGHT_YES, mSetMode);
- // Assert that the Activity did not get updated
- assertConfigurationNightModeEquals(defaultNightMode,
+ // Assert that the onConfigurationChange was called with a new correct config
+ Configuration lastConfig = mActivityTestRule.getActivity()
+ .getLastConfigurationChangeAndClear();
+ assertNotNull(lastConfig);
+ assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_YES, lastConfig);
+
+ // Set local night mode back to NO
+ setNightModeAndWait(mActivityTestRule, MODE_NIGHT_NO, mSetMode);
+
+ // Assert that the onConfigurationChange was again called with a new correct config
+ lastConfig = mActivityTestRule.getActivity().getLastConfigurationChangeAndClear();
+ assertNotNull(lastConfig);
+ assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_NO, lastConfig);
+ }
+
+ @Test
+ public void testResourcesUpdated() throws Throwable {
+ // Set local night mode to YES
+ setNightModeAndWait(mActivityTestRule, MODE_NIGHT_YES, mSetMode);
+
+ // Assert that the Activity resources configuration was updated
+ assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_YES,
mActivityTestRule.getActivity().getResources().getConfiguration());
// Set local night mode back to NO
setNightModeAndWait(mActivityTestRule, MODE_NIGHT_NO, mSetMode);
- // Assert that the Activity did not get updated
- assertConfigurationNightModeEquals(defaultNightMode,
+ // Assert that the Activity resources configuration was updated
+ assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_NO,
mActivityTestRule.getActivity().getResources().getConfiguration());
}
diff --git a/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java b/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
index 86ae4f33..ec681f1 100644
--- a/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
+++ b/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
@@ -2247,8 +2247,10 @@
final boolean activityHandlingUiMode = isActivityManifestHandlingUiMode();
- if (newNightMode != applicationNightMode && !activityHandlingUiMode
- && Build.VERSION.SDK_INT >= 17 && !mBaseContextAttached
+ if (newNightMode != applicationNightMode
+ && !activityHandlingUiMode
+ && Build.VERSION.SDK_INT >= 17
+ && !mBaseContextAttached
&& mHost instanceof android.view.ContextThemeWrapper) {
// If we're here then we can try and apply an override configuration on the Context.
final Configuration conf = new Configuration();
@@ -2271,48 +2273,51 @@
}
}
- if (!handled && !activityHandlingUiMode) {
- final int currentNightMode = mContext.getResources().getConfiguration().uiMode
- & Configuration.UI_MODE_NIGHT_MASK;
- if (currentNightMode != newNightMode) {
- if (allowRecreation && mBaseContextAttached
- && (Build.VERSION.SDK_INT >= 17 || mCreated)
- && mHost instanceof Activity) {
- // If we're an attached Activity, we can recreate to apply
- // The SDK_INT check above is because applyOverrideConfiguration only exists on
- // API 17+, so we don't want to get into an loop of infinite recreations.
- // On < API 17 we need to use updateConfiguration before we're 'created'
- if (DEBUG) {
- Log.d(TAG, "updateForNightMode. Recreating Activity");
- }
- ActivityCompat.recreate((Activity) mHost);
- handled = true;
- }
- if (!handled) {
- // Else we need to use the updateConfiguration path
- if (DEBUG) {
- Log.d(TAG, "updateForNightMode. Updating resources config");
- }
- updateResourcesConfigurationForNightMode(newNightMode);
- handled = true;
- }
- } else {
- if (DEBUG) {
- Log.d(TAG, "updateForNightMode. Skipping. Night mode: " + mode);
- }
+ final int currentNightMode = mContext.getResources().getConfiguration().uiMode
+ & Configuration.UI_MODE_NIGHT_MASK;
+
+ if (!handled
+ && currentNightMode != newNightMode
+ && allowRecreation
+ && !activityHandlingUiMode
+ && mBaseContextAttached
+ && (Build.VERSION.SDK_INT >= 17 || mCreated)
+ && mHost instanceof Activity) {
+ // If we're an attached Activity, we can recreate to apply
+ // The SDK_INT check above is because applyOverrideConfiguration only exists on
+ // API 17+, so we don't want to get into an loop of infinite recreations.
+ // On < API 17 we need to use updateConfiguration before we're 'created'
+ if (DEBUG) {
+ Log.d(TAG, "updateForNightMode. Recreating Activity");
}
+ ActivityCompat.recreate((Activity) mHost);
+ handled = true;
+ }
+
+ if (!handled && currentNightMode != newNightMode) {
+ // Else we need to use the updateConfiguration path
+ if (DEBUG) {
+ Log.d(TAG, "updateForNightMode. Updating resources config");
+ }
+ updateResourcesConfigurationForNightMode(newNightMode, activityHandlingUiMode);
+ handled = true;
+ }
+
+ if (DEBUG && !handled) {
+ Log.d(TAG, "updateForNightMode. Skipping. Night mode: " + mode);
}
// Notify the activity of the night mode. We only notify if we handled the change,
// or the Activity is set to handle uiMode changes
- if ((handled || activityHandlingUiMode) && mHost instanceof AppCompatActivity) {
+ if (handled && mHost instanceof AppCompatActivity) {
((AppCompatActivity) mHost).onNightModeChanged(mode);
}
return handled;
}
- private void updateResourcesConfigurationForNightMode(final int uiModeNightModeValue) {
+ private void updateResourcesConfigurationForNightMode(
+ final int uiModeNightModeValue, final boolean callOnConfigChange) {
// If the Activity is not set to handle uiMode config changes we will
// update the Resources with a new Configuration with an updated UI Mode
final Resources res = mContext.getResources();
@@ -2340,6 +2345,10 @@
mContext.getTheme().applyStyle(mThemeResId, true);
}
}
+
+ if (callOnConfigChange && mHost instanceof Activity) {
+ ((Activity) mHost).onConfigurationChanged(conf);
+ }
}
/**
diff --git a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
index eb1b6c4..b3b4f4b 100644
--- a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
@@ -62,7 +62,7 @@
val HEIFWRITER = Version("1.1.0-alpha01")
val INSPECTION = Version("1.0.0-alpha01")
val INTERPOLATOR = Version("1.1.0-alpha01")
- val JETIFIER = Version("1.0.0-beta04")
+ val JETIFIER = Version("1.0.0-beta05")
val LEANBACK = Version("1.1.0-alpha03")
val LEANBACK_PREFERENCE = Version("1.1.0-alpha03")
val LEGACY = Version("1.1.0-alpha01")
diff --git a/camera/camera2/src/androidTest/java/androidx/camera/camera2/Camera2ConfigTest.java b/camera/camera2/src/androidTest/java/androidx/camera/camera2/Camera2ConfigTest.java
index 66ddfe8..d9a2f18 100644
--- a/camera/camera2/src/androidTest/java/androidx/camera/camera2/Camera2ConfigTest.java
+++ b/camera/camera2/src/androidTest/java/androidx/camera/camera2/Camera2ConfigTest.java
@@ -25,6 +25,7 @@
import android.util.Range;
import androidx.camera.camera2.impl.Camera2CaptureCallbacks;
+import androidx.camera.camera2.impl.CameraEventCallbacks;
import androidx.camera.core.CameraCaptureSessionStateCallbacks;
import androidx.camera.core.CameraDeviceStateCallbacks;
import androidx.camera.core.Config;
@@ -46,6 +47,8 @@
CameraCaptureSessionStateCallbacks.createNoOpCallback();
private static final CameraDevice.StateCallback DEVICE_STATE_CALLBACK =
CameraDeviceStateCallbacks.createNoOpCallback();
+ private static final CameraEventCallbacks CAMERA_EVENT_CALLBACKS =
+ CameraEventCallbacks.createEmptyCallback();
@Test
public void emptyConfigurationDoesNotContainTemplateType() {
@@ -106,6 +109,18 @@
}
@Test
+ public void canExtendWithCameraEventCallback() {
+ FakeConfig.Builder builder = new FakeConfig.Builder();
+
+ new Camera2Config.Extender(builder).setCameraEventCallback(CAMERA_EVENT_CALLBACKS);
+
+ Camera2Config config = new Camera2Config(builder.build());
+
+ assertThat(config.getCameraEventCallback(/*valueIfMissing=*/ null))
+ .isSameAs(CAMERA_EVENT_CALLBACKS);
+ }
+
+ @Test
public void canSetAndRetrieveCaptureRequestKeys() {
FakeConfig.Builder builder = new FakeConfig.Builder();
diff --git a/camera/camera2/src/androidTest/java/androidx/camera/camera2/impl/CaptureSessionTest.java b/camera/camera2/src/androidTest/java/androidx/camera/camera2/impl/CaptureSessionTest.java
index 439cf69..acdbfc3 100644
--- a/camera/camera2/src/androidTest/java/androidx/camera/camera2/impl/CaptureSessionTest.java
+++ b/camera/camera2/src/androidTest/java/androidx/camera/camera2/impl/CaptureSessionTest.java
@@ -20,15 +20,21 @@
import static org.junit.Assume.assumeTrue;
import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.inOrder;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
import android.Manifest;
import android.graphics.ImageFormat;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CameraDevice;
+import android.hardware.camera2.CaptureRequest;
+import android.hardware.camera2.CaptureResult;
import android.media.Image;
import android.media.ImageReader;
import android.media.ImageReader.OnImageAvailableListener;
@@ -36,6 +42,7 @@
import android.os.HandlerThread;
import androidx.annotation.NonNull;
+import androidx.camera.camera2.Camera2Config;
import androidx.camera.camera2.impl.CaptureSession.State;
import androidx.camera.core.CameraCaptureCallback;
import androidx.camera.core.CameraCaptureCallbacks;
@@ -43,6 +50,7 @@
import androidx.camera.core.CaptureConfig;
import androidx.camera.core.DeferrableSurface;
import androidx.camera.core.ImmediateSurface;
+import androidx.camera.core.MutableOptionsBundle;
import androidx.camera.core.SessionConfig;
import androidx.camera.testing.CameraUtil;
import androidx.concurrent.ListenableFuture;
@@ -56,6 +64,8 @@
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.InOrder;
import org.mockito.Mockito;
import java.util.Collections;
@@ -309,6 +319,118 @@
Mockito.verify(listener, times(1)).onSurfaceDetached();
}
+ @Test
+ public void cameraEventCallbackInvokedInOrder() throws CameraAccessException {
+ CaptureSession captureSession = new CaptureSession(mTestParameters0.mHandler);
+ captureSession.setSessionConfig(mTestParameters0.mSessionConfig);
+
+ captureSession.open(mTestParameters0.mSessionConfig, mCameraDevice);
+
+ InOrder inOrder = inOrder(mTestParameters0.mMockCameraEventCallback);
+
+ inOrder.verify(mTestParameters0.mMockCameraEventCallback, timeout(3000)).onPresetSession();
+ inOrder.verify(mTestParameters0.mMockCameraEventCallback, timeout(3000)).onEnableSession();
+ inOrder.verify(mTestParameters0.mMockCameraEventCallback, timeout(3000)).onRepeating();
+ verify(mTestParameters0.mMockCameraEventCallback, never()).onDisableSession();
+
+ verifyNoMoreInteractions(mTestParameters0.mMockCameraEventCallback);
+
+ captureSession.close();
+ verify(mTestParameters0.mMockCameraEventCallback, timeout(3000)).onDisableSession();
+
+ verifyNoMoreInteractions(mTestParameters0.mMockCameraEventCallback);
+ }
+
+ @Test
+ public void cameraEventCallback_requestKeysIssuedSuccessfully() throws CameraAccessException {
+ ArgumentCaptor<CameraCaptureResult> captureResultCaptor = ArgumentCaptor.forClass(
+ CameraCaptureResult.class);
+
+ CaptureSession captureSession = new CaptureSession(mTestParameters0.mHandler);
+ captureSession.setSessionConfig(mTestParameters0.mSessionConfig);
+
+ // Open the capture session and verify the onEnableSession callback would be invoked
+ // but onDisableSession callback not.
+ captureSession.open(mTestParameters0.mSessionConfig, mCameraDevice);
+
+ // Verify the request options in onEnableSession.
+ verify(mTestParameters0.mTestCameraEventCallback.mEnableCallback,
+ timeout(3000)).onCaptureCompleted(captureResultCaptor.capture());
+ CameraCaptureResult result1 = captureResultCaptor.getValue();
+ assertThat(result1).isInstanceOf(Camera2CameraCaptureResult.class);
+ CaptureResult captureResult1 = ((Camera2CameraCaptureResult) result1).getCaptureResult();
+ assertThat(captureResult1.getRequest().get(CaptureRequest.CONTROL_EFFECT_MODE)).isEqualTo(
+ CaptureRequest.CONTROL_EFFECT_MODE_NEGATIVE);
+ // The onDisableSession should not been invoked.
+ verify(mTestParameters0.mTestCameraEventCallback.mDisableCallback,
+ never()).onCaptureCompleted(any(CameraCaptureResult.class));
+
+ reset(mTestParameters0.mTestCameraEventCallback.mEnableCallback);
+ reset(mTestParameters0.mTestCameraEventCallback.mDisableCallback);
+
+ // Close the capture session and verify the onDisableSession callback would be invoked
+ // but onEnableSession callback not.
+ captureSession.close();
+
+ // Verify the request options in onDisableSession.
+ verify(mTestParameters0.mTestCameraEventCallback.mDisableCallback,
+ timeout(3000)).onCaptureCompleted(captureResultCaptor.capture());
+ CameraCaptureResult result2 = captureResultCaptor.getValue();
+ assertThat(result2).isInstanceOf(Camera2CameraCaptureResult.class);
+ CaptureResult captureResult2 = ((Camera2CameraCaptureResult) result2).getCaptureResult();
+ assertThat(captureResult2.getRequest().get(CaptureRequest.CONTROL_EFFECT_MODE)).isEqualTo(
+ CaptureRequest.CONTROL_EFFECT_MODE_SEPIA);
+ // The onEnableSession should not been invoked in close().
+ verify(mTestParameters0.mTestCameraEventCallback.mEnableCallback,
+ never()).onCaptureCompleted(any(CameraCaptureResult.class));
+ }
+
+ /**
+ * A implementation to test {@link CameraEventCallback} on CaptureSession.
+ */
+ private static class TestCameraEventCallback extends CameraEventCallback {
+
+ private final CameraCaptureCallback mEnableCallback = Mockito.mock(
+ CameraCaptureCallback.class);
+ private final CameraCaptureCallback mDisableCallback = Mockito.mock(
+ CameraCaptureCallback.class);
+
+ @Override
+ public CaptureConfig onPresetSession() {
+ return getCaptureConfig(CaptureRequest.CONTROL_EFFECT_MODE,
+ CaptureRequest.CONTROL_EFFECT_MODE_MONO, null);
+ }
+
+ @Override
+ public CaptureConfig onEnableSession() {
+ return getCaptureConfig(CaptureRequest.CONTROL_EFFECT_MODE,
+ CaptureRequest.CONTROL_EFFECT_MODE_NEGATIVE, mEnableCallback);
+ }
+
+ @Override
+ public CaptureConfig onRepeating() {
+ return getCaptureConfig(CaptureRequest.CONTROL_EFFECT_MODE,
+ CaptureRequest.CONTROL_EFFECT_MODE_SOLARIZE, null);
+ }
+
+ @Override
+ public CaptureConfig onDisableSession() {
+ return getCaptureConfig(CaptureRequest.CONTROL_EFFECT_MODE,
+ CaptureRequest.CONTROL_EFFECT_MODE_SEPIA, mDisableCallback);
+ }
+ }
+
+ private static CaptureConfig getCaptureConfig(CaptureRequest.Key key, int effectValue,
+ CameraCaptureCallback callback) {
+ CaptureConfig.Builder captureConfigBuilder = new CaptureConfig.Builder();
+ Camera2Config.Builder camera2ConfigurationBuilder =
+ new Camera2Config.Builder();
+ camera2ConfigurationBuilder.setCaptureRequestOption(key, effectValue);
+ captureConfigBuilder.addImplementationOptions(camera2ConfigurationBuilder.build());
+ captureConfigBuilder.addCameraCaptureCallback(callback);
+ return captureConfigBuilder.build();
+ }
+
/**
* Collection of parameters required for setting a {@link CaptureSession} and wait for it to
* produce data.
@@ -342,6 +464,11 @@
private final SessionConfig mSessionConfig;
private final CaptureConfig mCaptureConfig;
+ private final TestCameraEventCallback mTestCameraEventCallback =
+ new TestCameraEventCallback();
+ private final CameraEventCallback mMockCameraEventCallback = Mockito.mock(
+ CameraEventCallback.class);
+
private final CameraCaptureSession.StateCallback mSessionStateCallback =
Mockito.mock(CameraCaptureSession.StateCallback.class);
private final CameraCaptureCallback mSessionCameraCaptureCallback =
@@ -381,6 +508,16 @@
builder.addSessionStateCallback(mSessionStateCallback);
builder.addRepeatingCameraCaptureCallback(mSessionCameraCaptureCallback);
+ MutableOptionsBundle testCallbackConfig = MutableOptionsBundle.create();
+ testCallbackConfig.insertOption(Camera2Config.CAMERA_EVENT_CALLBACK_OPTION,
+ new CameraEventCallbacks(mTestCameraEventCallback));
+ builder.addImplementationOptions(testCallbackConfig);
+
+ MutableOptionsBundle mockCameraEventCallbackConfig = MutableOptionsBundle.create();
+ mockCameraEventCallbackConfig.insertOption(Camera2Config.CAMERA_EVENT_CALLBACK_OPTION,
+ new CameraEventCallbacks(mMockCameraEventCallback));
+ builder.addImplementationOptions(mockCameraEventCallbackConfig);
+
mSessionConfig = builder.build();
CaptureConfig.Builder captureConfigBuilder = new CaptureConfig.Builder();
diff --git a/camera/camera2/src/test/java/androidx/camera/camera2/impl/Camera2SessionOptionUnpackerTest.java b/camera/camera2/src/test/java/androidx/camera/camera2/impl/Camera2SessionOptionUnpackerTest.java
index 222ce50..27e0949 100644
--- a/camera/camera2/src/test/java/androidx/camera/camera2/impl/Camera2SessionOptionUnpackerTest.java
+++ b/camera/camera2/src/test/java/androidx/camera/camera2/impl/Camera2SessionOptionUnpackerTest.java
@@ -19,6 +19,7 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CameraCaptureSession.CaptureCallback;
@@ -58,11 +59,14 @@
CameraDevice.StateCallback deviceCallback = mock(CameraDevice.StateCallback.class);
CameraCaptureSession.StateCallback sessionStateCallback =
mock(CameraCaptureSession.StateCallback.class);
+ CameraEventCallbacks cameraEventCallbacks = mock(CameraEventCallbacks.class);
+ when(cameraEventCallbacks.clone()).thenReturn(cameraEventCallbacks);
new Camera2Config.Extender(imageCaptureConfigBuilder)
.setSessionCaptureCallback(captureCallback)
.setDeviceStateCallback(deviceCallback)
- .setSessionStateCallback(sessionStateCallback);
+ .setSessionStateCallback(sessionStateCallback)
+ .setCameraEventCallback(cameraEventCallbacks);
SessionConfig.Builder sessionBuilder = new SessionConfig.Builder();
mUnpacker.unpack(imageCaptureConfigBuilder.build(), sessionBuilder);
@@ -79,5 +83,8 @@
assertThat(sessionConfig.getDeviceStateCallbacks()).containsExactly(deviceCallback);
assertThat(sessionConfig.getSessionStateCallbacks())
.containsExactly(sessionStateCallback);
+ assertThat(
+ new Camera2Config(sessionConfig.getImplementationOptions()).getCameraEventCallback(
+ null)).isEqualTo(cameraEventCallbacks);
}
}
diff --git a/camera/core/src/androidTest/java/androidx/camera/core/CameraXTest.java b/camera/core/src/androidTest/java/androidx/camera/core/CameraXTest.java
index 52ea4ff..65c1cf1 100644
--- a/camera/core/src/androidTest/java/androidx/camera/core/CameraXTest.java
+++ b/camera/core/src/androidTest/java/androidx/camera/core/CameraXTest.java
@@ -244,6 +244,21 @@
}
@Test
+ public void eventListenerCalled_bindAndUnbind() {
+ UseCase.EventListener eventListener = Mockito.mock(UseCase.EventListener.class);
+
+ FakeUseCaseConfig.Builder fakeConfigBuilder = new FakeUseCaseConfig.Builder();
+ fakeConfigBuilder.setUseCaseEventListener(eventListener);
+ AttachCameraFakeCase fakeUseCase = new AttachCameraFakeCase(fakeConfigBuilder.build());
+
+ CameraX.bindToLifecycle(mLifecycle, fakeUseCase);
+ Mockito.verify(eventListener).onBind(mCameraId);
+
+ CameraX.unbind(fakeUseCase);
+ Mockito.verify(eventListener).onUnbind();
+ }
+
+ @Test
public void canRetrieveCameraInfo() throws CameraInfoUnavailableException {
String cameraId = CameraX.getCameraWithLensFacing(LensFacing.BACK);
CameraInfo cameraInfo = CameraX.getCameraInfo(cameraId);
diff --git a/camera/core/src/androidTest/java/androidx/camera/core/CaptureConfigTest.java b/camera/core/src/androidTest/java/androidx/camera/core/CaptureConfigTest.java
index a9d818f..2f25ce6 100644
--- a/camera/core/src/androidTest/java/androidx/camera/core/CaptureConfigTest.java
+++ b/camera/core/src/androidTest/java/androidx/camera/core/CaptureConfigTest.java
@@ -35,6 +35,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.Arrays;
import java.util.List;
@LargeTest
@@ -44,6 +45,8 @@
"camerax.test.option_0", Integer.class);
private DeferrableSurface mMockSurface0;
+ private static final Config.Option<FakeMultiValueSet> FAKE_MULTI_VALUE_SET_OPTION =
+ Config.Option.create("option.fakeMultiValueSet.1", FakeMultiValueSet.class);
@Before
public void setup() {
@@ -161,6 +164,34 @@
.containsExactly(callback0, callback1);
}
+ @Test
+ public void builderAddImplementationMultiValue() {
+ CaptureConfig.Builder builder = new CaptureConfig.Builder();
+
+ Object obj1 = new Object();
+ FakeMultiValueSet fakeMultiValueSet1 = new FakeMultiValueSet();
+ fakeMultiValueSet1.addAll(Arrays.asList(obj1));
+ MutableOptionsBundle fakeConfig1 = MutableOptionsBundle.create();
+ fakeConfig1.insertOption(FAKE_MULTI_VALUE_SET_OPTION, fakeMultiValueSet1);
+ builder.addImplementationOptions(fakeConfig1);
+
+ Object obj2 = new Object();
+ FakeMultiValueSet fakeMultiValueSet2 = new FakeMultiValueSet();
+ fakeMultiValueSet2.addAll(Arrays.asList(obj2));
+ MutableOptionsBundle fakeConfig2 = MutableOptionsBundle.create();
+ fakeConfig2.insertOption(FAKE_MULTI_VALUE_SET_OPTION, fakeMultiValueSet2);
+ builder.addImplementationOptions(fakeConfig2);
+
+ CaptureConfig captureConfig = builder.build();
+
+ FakeMultiValueSet fakeMultiValueSet =
+ captureConfig.getImplementationOptions().retrieveOption(
+ FAKE_MULTI_VALUE_SET_OPTION);
+
+ assertThat(fakeMultiValueSet).isNotNull();
+ assertThat(fakeMultiValueSet.getAllItems()).containsExactly(obj1, obj2);
+ }
+
@Test(expected = IllegalArgumentException.class)
public void builderAddDuplicateCameraCaptureCallback_throwsException() {
CaptureConfig.Builder builder = new CaptureConfig.Builder();
@@ -195,4 +226,15 @@
configuration.getCameraCaptureCallbacks().add(mock(CameraCaptureCallback.class));
}
+ /**
+ * A fake {@link MultiValueSet}.
+ */
+ static class FakeMultiValueSet extends MultiValueSet<Object> {
+ @Override
+ public MultiValueSet clone() {
+ FakeMultiValueSet multiValueSet = new FakeMultiValueSet();
+ multiValueSet.addAll(getAllItems());
+ return multiValueSet;
+ }
+ }
}
diff --git a/camera/core/src/test/java/androidx/camera/core/ProcessingImageReaderTest.java b/camera/core/src/test/java/androidx/camera/core/ProcessingImageReaderTest.java
index 3529b84..02bfcbf 100644
--- a/camera/core/src/test/java/androidx/camera/core/ProcessingImageReaderTest.java
+++ b/camera/core/src/test/java/androidx/camera/core/ProcessingImageReaderTest.java
@@ -36,6 +36,8 @@
import org.robolectric.annotation.internal.DoNotInstrument;
import org.robolectric.shadows.ShadowLooper;
+import java.util.HashMap;
+import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
@@ -47,8 +49,12 @@
public final class ProcessingImageReaderTest {
private static final int CAPTURE_ID_0 = 0;
private static final int CAPTURE_ID_1 = 1;
+ private static final int CAPTURE_ID_2 = 2;
+ private static final int CAPTURE_ID_3 = 3;
private static final long TIMESTAMP_0 = 0L;
private static final long TIMESTAMP_1 = 1000L;
+ private static final long TIMESTAMP_2 = 2000L;
+ private static final long TIMESTAMP_3 = 4000L;
private static final CaptureProcessor NOOP_PROCESSOR = new CaptureProcessor() {
@Override
public void onOutputSurface(Surface surface, int imageFormat) {
@@ -68,6 +74,8 @@
private final CaptureStage mCaptureStage0 = new FakeCaptureStage(CAPTURE_ID_0, null);
private final CaptureStage mCaptureStage1 = new FakeCaptureStage(CAPTURE_ID_1, null);
+ private final CaptureStage mCaptureStage2 = new FakeCaptureStage(CAPTURE_ID_2, null);
+ private final CaptureStage mCaptureStage3 = new FakeCaptureStage(CAPTURE_ID_3, null);
private final FakeImageReaderProxy mImageReaderProxy = new FakeImageReaderProxy();
private CaptureBundle mCaptureBundle;
private Handler mMainHandler;
@@ -99,12 +107,28 @@
}
};
- new ProcessingImageReader(
+ ProcessingImageReader processingImageReader = new ProcessingImageReader(
mImageReaderProxy, mMainHandler, mCaptureBundle, captureProcessor);
+ Map<Integer, Long> resultMap = new HashMap<>();
+ resultMap.put(CAPTURE_ID_0, TIMESTAMP_0);
+ resultMap.put(CAPTURE_ID_1, TIMESTAMP_1);
+ triggerAndVerify(bundleRef, resultMap);
+ processingImageReader.setCaptureBundle(CaptureBundles.createCaptureBundle(mCaptureStage2,
+ mCaptureStage3));
+ Map<Integer, Long> resultMap1 = new HashMap<>();
+ resultMap1.put(CAPTURE_ID_2, TIMESTAMP_2);
+ resultMap1.put(CAPTURE_ID_3, TIMESTAMP_3);
+ triggerAndVerify(bundleRef, resultMap1);
+ }
+
+ private void triggerAndVerify(AtomicReference<ImageProxyBundle> bundleRef,
+ Map<Integer, Long> captureIdToTime)
+ throws InterruptedException, ExecutionException, TimeoutException {
// Feeds ImageProxy with all capture id on the initial list.
- triggerImageAvailable(CAPTURE_ID_0, TIMESTAMP_0);
- triggerImageAvailable(CAPTURE_ID_1, TIMESTAMP_1);
+ for (Integer id : captureIdToTime.keySet()) {
+ triggerImageAvailable(id, captureIdToTime.get(id));
+ }
// Ensure all posted tasks finish running
ShadowLooper.runUiThreadTasks();
@@ -114,10 +138,10 @@
// CaptureProcessor.process should be called once all ImageProxies on the
// initial lists are ready. Then checks if the output has matched timestamp.
- assertThat(bundle.getImageProxy(CAPTURE_ID_0).get(0,
- TimeUnit.SECONDS).getTimestamp()).isEqualTo(TIMESTAMP_0);
- assertThat(bundle.getImageProxy(CAPTURE_ID_1).get(0,
- TimeUnit.SECONDS).getTimestamp()).isEqualTo(TIMESTAMP_1);
+ for (Integer id : captureIdToTime.keySet()) {
+ assertThat(bundle.getImageProxy(id).get(0,
+ TimeUnit.SECONDS).getTimestamp()).isEqualTo(captureIdToTime.get(id));
+ }
}
@Test(expected = IllegalArgumentException.class)
diff --git a/camera/extensions/build.gradle b/camera/extensions/build.gradle
index 61508e9e..ac23da8 100644
--- a/camera/extensions/build.gradle
+++ b/camera/extensions/build.gradle
@@ -30,13 +30,33 @@
implementation(project(":camera:camera-camera2"))
implementation("androidx.core:core:1.0.0")
implementation(project(":concurrent-listenablefuture"))
+ implementation(AUTO_VALUE_ANNOTATIONS)
+ annotationProcessor(AUTO_VALUE)
compileOnly(project(":camera:camera-extensions-stub"))
+
+
+ testImplementation(JUNIT)
+ testImplementation(MOCKITO_CORE)
+ testImplementation(ROBOLECTRIC)
+
+ testCompileOnly(project(":camera:camera-extensions-stub"))
}
android {
defaultConfig {
minSdkVersion 21
+
+ // TODO: To use the separate version for extensions after new library item is created.
+ buildConfigField "String", "CAMERA_VERSION", "\"${LibraryVersions.CAMERA}\""
+ }
+}
+
+// Enable generating BuildConfig.java since support library default disable it.
+// Need to track on https://issuetracker.google.com/issues/72050365
+android.libraryVariants.all { variant ->
+ variant.generateBuildConfigProvider.configure {
+ it.enabled = true
}
}
diff --git a/camera/extensions/src/main/java/androidx/camera/extensions/AutoImageCaptureExtender.java b/camera/extensions/src/main/java/androidx/camera/extensions/AutoImageCaptureExtender.java
index 8c0905e..82b2b27 100644
--- a/camera/extensions/src/main/java/androidx/camera/extensions/AutoImageCaptureExtender.java
+++ b/camera/extensions/src/main/java/androidx/camera/extensions/AutoImageCaptureExtender.java
@@ -34,12 +34,15 @@
* {@link androidx.camera.core.ImageCapture}.
*/
public static AutoImageCaptureExtender create(ImageCaptureConfig.Builder builder) {
- try {
- return new VendorAutoImageCaptureExtender(builder);
- } catch (NoClassDefFoundError e) {
- Log.d(TAG, "No auto image capture extender found. Falling back to default.");
- return new DefaultAutoImageCaptureExtender();
+ if (ExtensionVersion.isExtensionVersionSupported()) {
+ try {
+ return new VendorAutoImageCaptureExtender(builder);
+ } catch (NoClassDefFoundError e) {
+ Log.d(TAG, "No auto image capture extender found. Falling back to default.");
+ }
}
+
+ return new DefaultAutoImageCaptureExtender();
}
/** Empty implementation of auto extender which does nothing. */
diff --git a/camera/extensions/src/main/java/androidx/camera/extensions/AutoPreviewExtender.java b/camera/extensions/src/main/java/androidx/camera/extensions/AutoPreviewExtender.java
index 44b0ee6..f49850c 100644
--- a/camera/extensions/src/main/java/androidx/camera/extensions/AutoPreviewExtender.java
+++ b/camera/extensions/src/main/java/androidx/camera/extensions/AutoPreviewExtender.java
@@ -34,12 +34,15 @@
* {@link androidx.camera.core.Preview}.
*/
public static AutoPreviewExtender create(PreviewConfig.Builder builder) {
- try {
- return new VendorAutoPreviewExtender(builder);
- } catch (NoClassDefFoundError e) {
- Log.d(TAG, "No auto preview extender found. Falling back to default.");
- return new DefaultAutoPreviewExtender();
+ if (ExtensionVersion.isExtensionVersionSupported()) {
+ try {
+ return new VendorAutoPreviewExtender(builder);
+ } catch (NoClassDefFoundError e) {
+ Log.d(TAG, "No auto preview extender found. Falling back to default.");
+ }
}
+
+ return new DefaultAutoPreviewExtender();
}
/** Empty implementation of auto extender which does nothing. */
diff --git a/camera/extensions/src/main/java/androidx/camera/extensions/BeautyImageCaptureExtender.java b/camera/extensions/src/main/java/androidx/camera/extensions/BeautyImageCaptureExtender.java
index e7dd18e..9837b45 100644
--- a/camera/extensions/src/main/java/androidx/camera/extensions/BeautyImageCaptureExtender.java
+++ b/camera/extensions/src/main/java/androidx/camera/extensions/BeautyImageCaptureExtender.java
@@ -34,12 +34,15 @@
* {@link androidx.camera.core.ImageCapture}.
*/
public static BeautyImageCaptureExtender create(ImageCaptureConfig.Builder builder) {
- try {
- return new VendorBeautyImageCaptureExtender(builder);
- } catch (NoClassDefFoundError e) {
- Log.d(TAG, "No beauty image capture extender found. Falling back to default.");
- return new DefaultBeautyImageCaptureExtender();
+ if (ExtensionVersion.isExtensionVersionSupported()) {
+ try {
+ return new VendorBeautyImageCaptureExtender(builder);
+ } catch (NoClassDefFoundError e) {
+ Log.d(TAG, "No beauty image capture extender found. Falling back to default.");
+ }
}
+
+ return new DefaultBeautyImageCaptureExtender();
}
/** Empty implementation of beauty extender which does nothing. */
diff --git a/camera/extensions/src/main/java/androidx/camera/extensions/BeautyPreviewExtender.java b/camera/extensions/src/main/java/androidx/camera/extensions/BeautyPreviewExtender.java
index d24b3ce..fb13d5d 100644
--- a/camera/extensions/src/main/java/androidx/camera/extensions/BeautyPreviewExtender.java
+++ b/camera/extensions/src/main/java/androidx/camera/extensions/BeautyPreviewExtender.java
@@ -34,12 +34,15 @@
* {@link androidx.camera.core.Preview}.
*/
public static BeautyPreviewExtender create(PreviewConfig.Builder builder) {
- try {
- return new VendorBeautyPreviewExtender(builder);
- } catch (NoClassDefFoundError e) {
- Log.d(TAG, "No beauty preview extender found. Falling back to default.");
- return new DefaultBeautyPreviewExtender();
+ if (ExtensionVersion.isExtensionVersionSupported()) {
+ try {
+ return new VendorBeautyPreviewExtender(builder);
+ } catch (NoClassDefFoundError e) {
+ Log.d(TAG, "No beauty preview extender found. Falling back to default.");
+ }
}
+
+ return new DefaultBeautyPreviewExtender();
}
/** Empty implementation of beauty extender which does nothing. */
diff --git a/camera/extensions/src/main/java/androidx/camera/extensions/BokehImageCaptureExtender.java b/camera/extensions/src/main/java/androidx/camera/extensions/BokehImageCaptureExtender.java
index abdbbfb..9fcbdbee 100644
--- a/camera/extensions/src/main/java/androidx/camera/extensions/BokehImageCaptureExtender.java
+++ b/camera/extensions/src/main/java/androidx/camera/extensions/BokehImageCaptureExtender.java
@@ -34,12 +34,15 @@
* {@link androidx.camera.core.ImageCapture}.
*/
public static BokehImageCaptureExtender create(ImageCaptureConfig.Builder builder) {
- try {
- return new VendorBokehImageCaptureExtender(builder);
- } catch (NoClassDefFoundError e) {
- Log.d(TAG, "No bokeh image capture extender found. Falling back to default.");
- return new DefaultBokehImageCaptureExtender();
+ if (ExtensionVersion.isExtensionVersionSupported()) {
+ try {
+ return new VendorBokehImageCaptureExtender(builder);
+ } catch (NoClassDefFoundError e) {
+ Log.d(TAG, "No bokeh image capture extender found. Falling back to default.");
+ }
}
+
+ return new DefaultBokehImageCaptureExtender();
}
/** Empty implementation of bokeh extender which does nothing. */
diff --git a/camera/extensions/src/main/java/androidx/camera/extensions/BokehPreviewExtender.java b/camera/extensions/src/main/java/androidx/camera/extensions/BokehPreviewExtender.java
index 5a23970..c15df1da 100644
--- a/camera/extensions/src/main/java/androidx/camera/extensions/BokehPreviewExtender.java
+++ b/camera/extensions/src/main/java/androidx/camera/extensions/BokehPreviewExtender.java
@@ -34,12 +34,15 @@
* {@link androidx.camera.core.Preview}.
*/
public static BokehPreviewExtender create(PreviewConfig.Builder builder) {
- try {
- return new VendorBokehPreviewExtender(builder);
- } catch (NoClassDefFoundError e) {
- Log.d(TAG, "No bokeh preview extender found. Falling back to default.");
- return new DefaultBokehPreviewExtender();
+ if (ExtensionVersion.isExtensionVersionSupported()) {
+ try {
+ return new VendorBokehPreviewExtender(builder);
+ } catch (NoClassDefFoundError e) {
+ Log.d(TAG, "No bokeh preview extender found. Falling back to default.");
+ }
}
+
+ return new DefaultBokehPreviewExtender();
}
/** Empty implementation of bokeh extender which does nothing. */
diff --git a/camera/extensions/src/main/java/androidx/camera/extensions/ExtensionVersion.java b/camera/extensions/src/main/java/androidx/camera/extensions/ExtensionVersion.java
new file mode 100644
index 0000000..574a3f0
--- /dev/null
+++ b/camera/extensions/src/main/java/androidx/camera/extensions/ExtensionVersion.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * 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 androidx.camera.extensions;
+
+import android.util.Log;
+
+import androidx.camera.extensions.impl.ExtensionVersionImpl;
+
+/**
+ * Provides interfaces to check the extension version.
+ */
+abstract class ExtensionVersion {
+ private static final String TAG = "ExtenderVersion";
+
+ private static volatile ExtensionVersion sExtensionVersion;
+
+ private static ExtensionVersion getInstance() {
+ if (sExtensionVersion != null) {
+ return sExtensionVersion;
+ }
+ synchronized (ExtensionVersion.class) {
+ if (sExtensionVersion == null) {
+ try {
+ sExtensionVersion = new VendorExtenderVersioning();
+ } catch (NoClassDefFoundError e) {
+ Log.d(TAG, "No versioning extender found. Falling back to default.");
+ sExtensionVersion = new DefaultExtenderVersioning();
+ }
+ }
+ }
+
+ return sExtensionVersion;
+ }
+
+ /**
+ * Indicate the compatibility of CameraX and OEM library.
+ *
+ * @return true if OEM returned a major version is matched with the current version, false
+ * otherwise.
+ */
+ static boolean isExtensionVersionSupported() {
+ return getInstance().getVersionObject() != null;
+ }
+
+ /**
+ * Return the Version object of the OEM library if the version is compatible with CameraX.
+ *
+ * @return a Version object which composed of the version number string that's returned from
+ * {@link ExtensionVersionImpl#checkApiVersion(String)}.
+ * <tt>null</tt> if the OEM library didn't implement the version checking method or the
+ * version is not compatible with CameraX.
+ */
+ static Version getRuntimeVersion() {
+ return getInstance().getVersionObject();
+ }
+
+ /**
+ * @return a Version object returned from the extension implementation.
+ */
+ abstract Version getVersionObject();
+
+ /** An implementation that calls into the vendor provided implementation. */
+ private static class VendorExtenderVersioning extends ExtensionVersion {
+ private ExtensionVersionImpl mImpl;
+ private Version mRuntimeVersion;
+
+ VendorExtenderVersioning() {
+ mImpl = new ExtensionVersionImpl();
+ String vendorVersion = mImpl.checkApiVersion(VersionName.CURRENT.toVersionString());
+ Version vendorVersionObj = Version.parse(vendorVersion);
+ if (vendorVersionObj != null && VersionName.CURRENT.getVersion().compareTo(
+ vendorVersionObj.getMajor()) == 0) {
+ mRuntimeVersion = vendorVersionObj;
+ }
+
+ Log.d(TAG, "Selected vendor runtime: " + mRuntimeVersion);
+ }
+
+ @Override
+ Version getVersionObject() {
+ return mRuntimeVersion;
+ }
+ }
+
+ /** Empty implementation of ExtensionVersion which does nothing. */
+ private static class DefaultExtenderVersioning extends ExtensionVersion {
+ DefaultExtenderVersioning() {
+ }
+
+ @Override
+ Version getVersionObject() {
+ return null;
+ }
+ }
+}
diff --git a/camera/extensions/src/main/java/androidx/camera/extensions/HdrImageCaptureExtender.java b/camera/extensions/src/main/java/androidx/camera/extensions/HdrImageCaptureExtender.java
index 071276f..5e90691 100644
--- a/camera/extensions/src/main/java/androidx/camera/extensions/HdrImageCaptureExtender.java
+++ b/camera/extensions/src/main/java/androidx/camera/extensions/HdrImageCaptureExtender.java
@@ -33,12 +33,15 @@
* {@link androidx.camera.core.ImageCapture}.
*/
public static HdrImageCaptureExtender create(ImageCaptureConfig.Builder builder) {
- try {
- return new VendorHdrImageCaptureExtender(builder);
- } catch (NoClassDefFoundError e) {
- Log.d(TAG, "No HDR image capture extender found. Falling back to default.");
- return new DefaultHdrImageCaptureExtender();
+ if (ExtensionVersion.isExtensionVersionSupported()) {
+ try {
+ return new VendorHdrImageCaptureExtender(builder);
+ } catch (NoClassDefFoundError e) {
+ Log.d(TAG, "No HDR image capture extender found. Falling back to default.");
+ }
}
+
+ return new DefaultHdrImageCaptureExtender();
}
/** Empty implementation of HDR extender which does nothing. */
diff --git a/camera/extensions/src/main/java/androidx/camera/extensions/HdrPreviewExtender.java b/camera/extensions/src/main/java/androidx/camera/extensions/HdrPreviewExtender.java
index 239cef1..b931eaf 100644
--- a/camera/extensions/src/main/java/androidx/camera/extensions/HdrPreviewExtender.java
+++ b/camera/extensions/src/main/java/androidx/camera/extensions/HdrPreviewExtender.java
@@ -34,12 +34,15 @@
* {@link androidx.camera.core.Preview}.
*/
public static HdrPreviewExtender create(PreviewConfig.Builder builder) {
- try {
- return new VendorHdrPreviewExtender(builder);
- } catch (NoClassDefFoundError e) {
- Log.d(TAG, "No HDR preview extender found. Falling back to default.");
- return new DefaultHdrPreviewExtender();
+ if (ExtensionVersion.isExtensionVersionSupported()) {
+ try {
+ return new VendorHdrPreviewExtender(builder);
+ } catch (NoClassDefFoundError e) {
+ Log.d(TAG, "No HDR preview extender found. Falling back to default.");
+ }
}
+
+ return new DefaultHdrPreviewExtender();
}
/** Empty implementation of HDR extender which does nothing. */
diff --git a/camera/extensions/src/main/java/androidx/camera/extensions/NightImageCaptureExtender.java b/camera/extensions/src/main/java/androidx/camera/extensions/NightImageCaptureExtender.java
index 96ce123..adbab14 100644
--- a/camera/extensions/src/main/java/androidx/camera/extensions/NightImageCaptureExtender.java
+++ b/camera/extensions/src/main/java/androidx/camera/extensions/NightImageCaptureExtender.java
@@ -34,12 +34,15 @@
* {@link androidx.camera.core.ImageCapture}.
*/
public static NightImageCaptureExtender create(ImageCaptureConfig.Builder builder) {
- try {
- return new VendorNightImageCaptureExtender(builder);
- } catch (NoClassDefFoundError e) {
- Log.d(TAG, "No night image capture extender found. Falling back to default.");
- return new DefaultNightImageCaptureExtender();
+ if (ExtensionVersion.isExtensionVersionSupported()) {
+ try {
+ return new VendorNightImageCaptureExtender(builder);
+ } catch (NoClassDefFoundError e) {
+ Log.d(TAG, "No night image capture extender found. Falling back to default.");
+ }
}
+
+ return new DefaultNightImageCaptureExtender();
}
/** Empty implementation of night extender which does nothing. */
diff --git a/camera/extensions/src/main/java/androidx/camera/extensions/NightPreviewExtender.java b/camera/extensions/src/main/java/androidx/camera/extensions/NightPreviewExtender.java
index 71f0ad2..da3e83d 100644
--- a/camera/extensions/src/main/java/androidx/camera/extensions/NightPreviewExtender.java
+++ b/camera/extensions/src/main/java/androidx/camera/extensions/NightPreviewExtender.java
@@ -34,12 +34,15 @@
* {@link androidx.camera.core.Preview}.
*/
public static NightPreviewExtender create(PreviewConfig.Builder builder) {
- try {
- return new VendorNightPreviewExtender(builder);
- } catch (NoClassDefFoundError e) {
- Log.d(TAG, "No night preview extender found. Falling back to default.");
- return new DefaultNightPreviewExtender();
+ if (ExtensionVersion.isExtensionVersionSupported()) {
+ try {
+ return new VendorNightPreviewExtender(builder);
+ } catch (NoClassDefFoundError e) {
+ Log.d(TAG, "No night preview extender found. Falling back to default.");
+ }
}
+
+ return new DefaultNightPreviewExtender();
}
/** Empty implementation of night extender which does nothing. */
diff --git a/camera/extensions/src/main/java/androidx/camera/extensions/Version.java b/camera/extensions/src/main/java/androidx/camera/extensions/Version.java
new file mode 100644
index 0000000..e70e683
--- /dev/null
+++ b/camera/extensions/src/main/java/androidx/camera/extensions/Version.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * 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 androidx.camera.extensions;
+
+import android.text.TextUtils;
+
+import com.google.auto.value.AutoValue;
+
+import java.math.BigInteger;
+import java.util.Objects;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Class encapsulating a version with major, minor, patch and description values.
+ */
+@AutoValue
+abstract class Version implements Comparable<Version> {
+ private static final Pattern VERSION_STRING_PATTERN =
+ Pattern.compile("(\\d+)(?:\\.(\\d+))(?:\\.(\\d+))(?:\\-(.+))?");
+
+ /**
+ * Parses a string to a version object.
+ *
+ * @param versionString string in the format "1.2.3" or "1.2.3-Description"
+ * (major.minor.patch[-description])
+ * @return the parsed Version object or <tt>null</tt> if the versionString format is invalid.
+ */
+ public static Version parse(String versionString) {
+ if (TextUtils.isEmpty(versionString)) {
+ return null;
+ }
+
+ Matcher matcher = VERSION_STRING_PATTERN.matcher(versionString);
+ if (!matcher.matches()) {
+ return null;
+ }
+
+ int major = Integer.parseInt(matcher.group(1));
+ int minor = Integer.parseInt(matcher.group(2));
+ int patch = Integer.parseInt(matcher.group(3));
+ String description = matcher.group(4) != null ? matcher.group(4) : "";
+ return create(major, minor, patch, description);
+ }
+
+ /**
+ * Creates a new instance of the Version object with the given parameters.
+ */
+ public static Version create(int major, int minor, int patch, String description) {
+ return new AutoValue_Version(major, minor, patch, description);
+ }
+
+ /** Prevent subclassing. */
+ Version() {
+ }
+
+ abstract int getMajor();
+
+ abstract int getMinor();
+
+ abstract int getPatch();
+
+ abstract String getDescription();
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder(getMajor() + "." + getMinor() + "." + getPatch());
+ if (!TextUtils.isEmpty(getDescription())) {
+ sb.append("-" + getDescription());
+ }
+ return sb.toString();
+ }
+
+ /**
+ * To compare the major, minor and patch version with another.
+ *
+ * @param other The preference to compare to this one.
+ * @return 0 if it have the same major minor and patch version; less than 0 if this
+ * preference sorts ahead of <var>other</var>; greater than 0 if this preference sorts after
+ * <var>other</var>.
+ */
+ @Override
+ public int compareTo(Version other) {
+ return createBigInteger(this).compareTo(createBigInteger(other));
+ }
+
+ public int compareTo(int majorVersion) {
+ return compareTo(majorVersion, 0);
+ }
+
+ public int compareTo(int majorVersion, int minorVersion) {
+ if (getMajor() == majorVersion) {
+ return Integer.compare(getMinor(), minorVersion);
+ }
+ return Integer.compare(getMajor(), majorVersion);
+ }
+
+ private static BigInteger createBigInteger(Version version) {
+ return BigInteger.valueOf(version.getMajor())
+ .shiftLeft(32)
+ .or(BigInteger.valueOf(version.getMinor()))
+ .shiftLeft(32)
+ .or(BigInteger.valueOf(version.getPatch()));
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof Version)) {
+ return false;
+ }
+
+ Version otherVersionObj = (Version) obj;
+
+ // The equals checking ignores the description.
+ return Objects.equals(getMajor(), otherVersionObj.getMajor())
+ && Objects.equals(getMinor(), otherVersionObj.getMinor())
+ && Objects.equals(getPatch(), otherVersionObj.getPatch());
+ }
+
+ @Override
+ public int hashCode() {
+ // The hash code ignores the description.
+ return Objects.hash(getMajor(), getMinor(), getPatch());
+ }
+}
diff --git a/camera/extensions/src/main/java/androidx/camera/extensions/VersionName.java b/camera/extensions/src/main/java/androidx/camera/extensions/VersionName.java
new file mode 100644
index 0000000..6afd91c
--- /dev/null
+++ b/camera/extensions/src/main/java/androidx/camera/extensions/VersionName.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * 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 androidx.camera.extensions;
+
+import androidx.annotation.RestrictTo;
+
+/**
+ * The version of CameraX extension releases.
+ *
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+public enum VersionName {
+
+ /* The current version of the CameraX extension. */
+ CURRENT(BuildConfig.CAMERA_VERSION);
+
+ private final Version mVersion;
+
+ public Version getVersion() {
+ return mVersion;
+ }
+
+ VersionName(String versionString) {
+ mVersion = Version.parse(versionString);
+ }
+
+ VersionName(int major, int minor, int patch, String description) {
+ mVersion = Version.create(major, minor, patch, description);
+ }
+
+ /**
+ * Gets this version number as string.
+ *
+ * @return the string of the version in a form of MAJOR.MINOR.PATCH-description.
+ */
+ public String toVersionString() {
+ return mVersion.toString();
+ }
+}
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/LifecycleObserver.java b/camera/extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java
similarity index 60%
copy from lifecycle/common/src/main/java/androidx/lifecycle/LifecycleObserver.java
copy to camera/extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java
index f02aad8..9641d6d5 100644
--- a/lifecycle/common/src/main/java/androidx/lifecycle/LifecycleObserver.java
+++ b/camera/extensions/src/test/java/androidx/camera/extensions/VersionNameTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,15 +14,15 @@
* limitations under the License.
*/
-package androidx.lifecycle;
+package androidx.camera.extensions;
-/**
- * Marks a class as a LifecycleObserver. It does not have any methods, instead, relies on
- * {@link OnLifecycleEvent} annotated methods.
- * <p>
- * @see Lifecycle Lifecycle - for samples and usage patterns.
- */
-@SuppressWarnings("WeakerAccess")
-public interface LifecycleObserver {
+import static org.junit.Assert.assertNotNull;
+import org.junit.Test;
+
+public class VersionNameTest {
+ @Test
+ public void testCurrentVersion_shouldNotEmpty() {
+ assertNotNull(VersionName.CURRENT.getVersion());
+ }
}
diff --git a/camera/extensions/src/test/java/androidx/camera/extensions/VersionTest.java b/camera/extensions/src/test/java/androidx/camera/extensions/VersionTest.java
new file mode 100644
index 0000000..fb6859e
--- /dev/null
+++ b/camera/extensions/src/test/java/androidx/camera/extensions/VersionTest.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * 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 androidx.camera.extensions;
+
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.greaterThan;
+import static org.hamcrest.Matchers.lessThan;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+public class VersionTest {
+
+ @Test
+ public void testVersionEqual() {
+ Version version1 = Version.create(1, 0, 0, "test");
+ Version version1_patch = Version.create(1, 0, 1, "test");
+ Version version1_minor = Version.create(1, 1, 0, "test");
+ Version version1_description = Version.create(1, 0, 0, "description");
+
+ Version version2 = Version.create(2, 0, 0, "test");
+
+ assertTrue(version1.equals(version1_description));
+ assertFalse(version1.equals(version1_patch));
+ assertFalse(version1.equals(version1_minor));
+ assertFalse(version1.equals(version2));
+
+ assertThat(version1.compareTo(version1_patch), lessThan(0));
+ assertThat(version1.compareTo(version1_description), equalTo(0));
+ assertThat(version1.compareTo(version1_minor), lessThan(0));
+ assertThat(version1.compareTo(version2), lessThan(0));
+
+ assertThat(version1.compareTo(1), equalTo(0));
+ assertThat(version1.compareTo(2), lessThan(0));
+ assertThat(version1.compareTo(0), greaterThan(0));
+
+ assertThat(version1.compareTo(1, 0), equalTo(0));
+ assertThat(version1.compareTo(1, 1), lessThan(0));
+ assertThat(version1_minor.compareTo(1, 0), greaterThan(0));
+
+ assertThat(version1.compareTo(2, 0), lessThan(0));
+ }
+
+ @Test
+ public void testParseStringVersion() {
+
+ Version version1 = Version.parse("1.2.3-description");
+ assertNotNull(version1);
+ assertEquals(version1.getMajor(), 1);
+ assertEquals(version1.getMinor(), 2);
+ assertEquals(version1.getPatch(), 3);
+ assertEquals(version1.getDescription(), "description");
+
+ Version version2 = Version.parse("4.5.6");
+ assertNotNull(version2);
+ assertEquals(version2.getDescription(), "");
+
+ Version version3 = Version.parse("01.002.0003");
+ assertNotNull(version3);
+ assertEquals(version3.getMajor(), 1);
+ assertEquals(version3.getMinor(), 2);
+ assertEquals(version3.getPatch(), 3);
+
+
+ // Test invalid input version string.
+ assertNull(Version.parse("1.0"));
+ assertNull(Version.parse("1. 0.0"));
+ assertNull(Version.parse("1..0"));
+ assertNull(Version.parse("1.0.a"));
+ assertNull(Version.parse("1.0.0."));
+ assertNull(Version.parse("1.0.0.description"));
+
+ assertNull(Version.parse("1.0.0.0"));
+ assertNull(Version.parse("1.0.-0"));
+ assertNull(Version.parse("1.0.-0"));
+ assertNull(Version.parse("(1.0.0)"));
+ assertNull(Version.parse(" 1.0.0 "));
+ }
+}
diff --git a/camera/gradle.properties b/camera/gradle.properties
deleted file mode 100644
index c0384c8..0000000
--- a/camera/gradle.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-# Improve build performance
-org.gradle.jvmargs=-Xmx6g -XX:ReservedCodeCacheSize=2g -Dfile.encoding=UTF-8
-org.gradle.parallel=true
-org.gradle.configureondemand=true
-org.gradle.caching=true
-# For offline storage of dependencies. This string should be considered a child
-# directory of the main directory defined by ${rootProject.projectDir}.
-offlineRepositoryRoot=offline-repository
diff --git a/core/core/api/1.2.0-alpha02.txt b/core/core/api/1.2.0-alpha02.txt
index 09d5cc1..a17492e 100644
--- a/core/core/api/1.2.0-alpha02.txt
+++ b/core/core/api/1.2.0-alpha02.txt
@@ -1258,6 +1258,10 @@
method @Deprecated public static void untagSocket(java.net.Socket!) throws java.net.SocketException;
}
+ public final class UriCompat {
+ method public static String toSafeString(android.net.Uri);
+ }
+
}
package androidx.core.os {
diff --git a/core/core/api/current.txt b/core/core/api/current.txt
index 09d5cc1..a17492e 100644
--- a/core/core/api/current.txt
+++ b/core/core/api/current.txt
@@ -1258,6 +1258,10 @@
method @Deprecated public static void untagSocket(java.net.Socket!) throws java.net.SocketException;
}
+ public final class UriCompat {
+ method public static String toSafeString(android.net.Uri);
+ }
+
}
package androidx.core.os {
diff --git a/core/core/src/androidTest/java/androidx/core/net/UriCompatTest.java b/core/core/src/androidTest/java/androidx/core/net/UriCompatTest.java
new file mode 100644
index 0000000..dfad407
--- /dev/null
+++ b/core/core/src/androidTest/java/androidx/core/net/UriCompatTest.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * 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 androidx.core.net;
+
+import static org.junit.Assert.assertEquals;
+
+import android.net.Uri;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Tests for {@link UriCompat}.
+ */
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class UriCompatTest {
+
+ @Test
+ public void testToSafeString_tel() {
+ checkToSafeString("tel:xxxxxx", "tel:Google");
+ checkToSafeString("tel:xxxxxxxxxx", "tel:1234567890");
+ checkToSafeString("tEl:xxx.xxx-xxxx", "tEl:123.456-7890");
+ }
+
+ @Test
+ public void testToSafeString_sip() {
+ checkToSafeString("sip:[email protected]", "sip:[email protected]:1234");
+ checkToSafeString("sIp:[email protected]", "sIp:[email protected]");
+ }
+
+ @Test
+ public void testToSafeString_sms() {
+ checkToSafeString("sms:xxxxxx", "sms:123abc");
+ checkToSafeString("smS:xxx.xxx-xxxx", "smS:123.456-7890");
+ }
+
+ @Test
+ public void testToSafeString_smsto() {
+ checkToSafeString("smsto:xxxxxx", "smsto:123abc");
+ checkToSafeString("SMSTo:xxx.xxx-xxxx", "SMSTo:123.456-7890");
+ }
+
+ @Test
+ public void testToSafeString_mailto() {
+ checkToSafeString("mailto:[email protected]", "mailto:[email protected]");
+ checkToSafeString("Mailto:[email protected]",
+ "Mailto:[email protected]/secret");
+ }
+
+ @Test
+ public void testToSafeString_nfc() {
+ checkToSafeString("nfc:xxxxxx", "nfc:123abc");
+ checkToSafeString("nfc:xxx.xxx-xxxx", "nfc:123.456-7890");
+ checkToSafeString("nfc:[email protected]", "nfc:[email protected]");
+ }
+
+ @Test
+ public void testToSafeString_http() {
+ checkToSafeString("http://www.android.com/...", "http://www.android.com");
+ checkToSafeString("HTTP://www.android.com/...", "HTTP://www.android.com");
+ checkToSafeString("http://www.android.com/...", "http://www.android.com/");
+ checkToSafeString("http://www.android.com/...", "http://www.android.com/secretUrl?param");
+ checkToSafeString("http://www.android.com/...",
+ "http://user:[email protected]/secretUrl?param");
+ checkToSafeString("http://www.android.com/...",
+ "http://[email protected]/secretUrl?param");
+ checkToSafeString("http://www.android.com/...", "http://www.android.com/secretUrl?param");
+ checkToSafeString("http:///...", "http:///path?param");
+ checkToSafeString("http:///...", "http://");
+ checkToSafeString("http://:12345/...", "http://:12345/");
+ }
+
+ @Test
+ public void testToSafeString_https() {
+ checkToSafeString("https://www.android.com/...", "https://www.android.com/secretUrl?param");
+ checkToSafeString("https://www.android.com:8443/...",
+ "https://user:[email protected]:8443/secretUrl?param");
+ checkToSafeString("https://www.android.com/...", "https://user:[email protected]");
+ checkToSafeString("Https://www.android.com/...", "Https://user:[email protected]");
+ }
+
+ @Test
+ public void testToSafeString_ftp() {
+ checkToSafeString("ftp://ftp.android.com/...", "ftp://ftp.android.com/");
+ checkToSafeString("ftP://ftp.android.com/...", "ftP://[email protected]/");
+ checkToSafeString("ftp://ftp.android.com:2121/...",
+ "ftp://root:[email protected]:2121/");
+ }
+
+ @Test
+ public void testToSafeString_rtsp() {
+ checkToSafeString("rtsp://rtsp.android.com/...", "rtsp://rtsp.android.com/");
+ checkToSafeString("rtsp://rtsp.android.com/...", "rtsp://rtsp.android.com/video.mov");
+ checkToSafeString("rtsp://rtsp.android.com/...", "rtsp://rtsp.android.com/video.mov?param");
+ checkToSafeString("RtsP://rtsp.android.com/...", "RtsP://[email protected]/");
+ checkToSafeString("rtsp://rtsp.android.com:2121/...",
+ "rtsp://username:[email protected]:2121/");
+ }
+
+ @Test
+ public void testToSafeString_notSupport() {
+ checkToSafeString("unsupported://ajkakjah/askdha/secret?secret",
+ "unsupported://ajkakjah/askdha/secret?secret");
+ checkToSafeString("unsupported:ajkakjah/askdha/secret?secret",
+ "unsupported:ajkakjah/askdha/secret?secret");
+ }
+
+ private void checkToSafeString(String expectedSafeString, String original) {
+ assertEquals(expectedSafeString, UriCompat.toSafeString(Uri.parse(original)));
+ }
+}
diff --git a/core/core/src/main/java/androidx/core/net/UriCompat.java b/core/core/src/main/java/androidx/core/net/UriCompat.java
new file mode 100644
index 0000000..77834b7
--- /dev/null
+++ b/core/core/src/main/java/androidx/core/net/UriCompat.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * 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 androidx.core.net;
+
+import android.net.Uri;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Helper for accessing function in {@link Uri} in a backwards compatible fashion.
+ */
+public final class UriCompat {
+
+ private UriCompat() {}
+
+ /**
+ * Return a string representation of this URI that has common forms of PII redacted,
+ * making it safer to use for logging purposes. For example, {@code tel:800-466-4411} is
+ * returned as {@code tel:xxx-xxx-xxxx} and {@code http://example.com/path/to/item/} is
+ * returned as {@code http://example.com/...}.
+ *
+ * @param uri The uri for converted to string.
+ * @return Return a string representation of this URI that has common forms of PII redacted.
+ */
+ public static @NonNull String toSafeString(@NonNull Uri uri) {
+ String scheme = uri.getScheme();
+ String ssp = uri.getSchemeSpecificPart();
+ if (scheme != null) {
+ if (scheme.equalsIgnoreCase("tel") || scheme.equalsIgnoreCase("sip")
+ || scheme.equalsIgnoreCase("sms") || scheme.equalsIgnoreCase("smsto")
+ || scheme.equalsIgnoreCase("mailto") || scheme.equalsIgnoreCase("nfc")) {
+ StringBuilder builder = new StringBuilder(64);
+ builder.append(scheme);
+ builder.append(':');
+ if (ssp != null) {
+ for (int i = 0; i < ssp.length(); i++) {
+ char c = ssp.charAt(i);
+ if (c == '-' || c == '@' || c == '.') {
+ builder.append(c);
+ } else {
+ builder.append('x');
+ }
+ }
+ }
+ return builder.toString();
+ } else if (scheme.equalsIgnoreCase("http") || scheme.equalsIgnoreCase("https")
+ || scheme.equalsIgnoreCase("ftp") || scheme.equalsIgnoreCase("rtsp")) {
+ ssp = "//" + ((uri.getHost() != null) ? uri.getHost() : "")
+ + ((uri.getPort() != -1) ? (":" + uri.getPort()) : "")
+ + "/...";
+ }
+ }
+ // Not a sensitive scheme, but let's still be conservative about
+ // the data we include -- only the ssp, not the query params or
+ // fragment, because those can often have sensitive info.
+ StringBuilder builder = new StringBuilder(64);
+ if (scheme != null) {
+ builder.append(scheme);
+ builder.append(':');
+ }
+ if (ssp != null) {
+ builder.append(ssp);
+ }
+ return builder.toString();
+ }
+}
diff --git a/development/validateRefactor.sh b/development/validateRefactor.sh
index c139c73..a4724e9 100755
--- a/development/validateRefactor.sh
+++ b/development/validateRefactor.sh
@@ -55,7 +55,6 @@
rm -rf "$oldOutPath" "$newOutPath" "$tempOutPath"
echo building new commit
-echoAndDo git checkout "$newCommit"
doBuild
mv "$tempOutPath" "$newOutPath"
@@ -66,10 +65,10 @@
echo previous build succeeded
else
echo previous build failed
- git checkout "$newCommit"
+ git checkout -
exit 1
fi
-git checkout "$newCommit"
+git checkout -
mv "$tempOutPath" "$oldOutPath"
echo
diff --git a/lifecycle/common-java8/api/2.2.0-alpha02.txt b/lifecycle/common-java8/api/2.2.0-alpha02.txt
deleted file mode 100644
index 498d3a9..0000000
--- a/lifecycle/common-java8/api/2.2.0-alpha02.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-// Signature format: 3.0
-package androidx.lifecycle {
-
- public interface DefaultLifecycleObserver extends androidx.lifecycle.LifecycleObserver androidx.lifecycle.LifecycleObserver {
- method public default void onCreate(androidx.lifecycle.LifecycleOwner);
- method public default void onDestroy(androidx.lifecycle.LifecycleOwner);
- method public default void onPause(androidx.lifecycle.LifecycleOwner);
- method public default void onResume(androidx.lifecycle.LifecycleOwner);
- method public default void onStart(androidx.lifecycle.LifecycleOwner);
- method public default void onStop(androidx.lifecycle.LifecycleOwner);
- }
-
-}
-
diff --git a/lifecycle/common-java8/api/current.txt b/lifecycle/common-java8/api/current.txt
deleted file mode 100644
index 498d3a9..0000000
--- a/lifecycle/common-java8/api/current.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-// Signature format: 3.0
-package androidx.lifecycle {
-
- public interface DefaultLifecycleObserver extends androidx.lifecycle.LifecycleObserver androidx.lifecycle.LifecycleObserver {
- method public default void onCreate(androidx.lifecycle.LifecycleOwner);
- method public default void onDestroy(androidx.lifecycle.LifecycleOwner);
- method public default void onPause(androidx.lifecycle.LifecycleOwner);
- method public default void onResume(androidx.lifecycle.LifecycleOwner);
- method public default void onStart(androidx.lifecycle.LifecycleOwner);
- method public default void onStop(androidx.lifecycle.LifecycleOwner);
- }
-
-}
-
diff --git a/lifecycle/common/api/current.txt b/lifecycle/common/api/current.txt
deleted file mode 100644
index 3f2e1d7..0000000
--- a/lifecycle/common/api/current.txt
+++ /dev/null
@@ -1,46 +0,0 @@
-// Signature format: 3.0
-package androidx.lifecycle {
-
- public abstract class Lifecycle {
- ctor public Lifecycle();
- method @MainThread public abstract void addObserver(androidx.lifecycle.LifecycleObserver);
- method @MainThread public abstract androidx.lifecycle.Lifecycle.State getCurrentState();
- method @MainThread public abstract void removeObserver(androidx.lifecycle.LifecycleObserver);
- }
-
- public enum Lifecycle.Event {
- enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_ANY;
- enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_CREATE;
- enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_DESTROY;
- enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_PAUSE;
- enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_RESUME;
- enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_START;
- enum_constant public static final androidx.lifecycle.Lifecycle.Event ON_STOP;
- }
-
- public enum Lifecycle.State {
- method public boolean isAtLeast(androidx.lifecycle.Lifecycle.State);
- enum_constant public static final androidx.lifecycle.Lifecycle.State CREATED;
- enum_constant public static final androidx.lifecycle.Lifecycle.State DESTROYED;
- enum_constant public static final androidx.lifecycle.Lifecycle.State INITIALIZED;
- enum_constant public static final androidx.lifecycle.Lifecycle.State RESUMED;
- enum_constant public static final androidx.lifecycle.Lifecycle.State STARTED;
- }
-
- public interface LifecycleEventObserver extends androidx.lifecycle.LifecycleObserver {
- method public void onStateChanged(androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.Event);
- }
-
- public interface LifecycleObserver {
- }
-
- public interface LifecycleOwner {
- method public androidx.lifecycle.Lifecycle getLifecycle();
- }
-
- @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) public @interface OnLifecycleEvent {
- method public abstract androidx.lifecycle.Lifecycle.Event! value();
- }
-
-}
-
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/FullLifecycleObserver.java b/lifecycle/common/src/main/java/androidx/lifecycle/FullLifecycleObserver.java
deleted file mode 100644
index c959d03..0000000
--- a/lifecycle/common/src/main/java/androidx/lifecycle/FullLifecycleObserver.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * 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 androidx.lifecycle;
-
-interface FullLifecycleObserver extends LifecycleObserver {
-
- void onCreate(LifecycleOwner owner);
-
- void onStart(LifecycleOwner owner);
-
- void onResume(LifecycleOwner owner);
-
- void onPause(LifecycleOwner owner);
-
- void onStop(LifecycleOwner owner);
-
- void onDestroy(LifecycleOwner owner);
-}
diff --git a/lifecycle/gradle.properties b/lifecycle/gradle.properties
deleted file mode 100644
index 88d2a75..0000000
--- a/lifecycle/gradle.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-#
-# Copyright (C) 2016 The Android Open Source Project
-#
-# 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.
-#
-
-org.gradle.jvmargs=-Xmx3000M
\ No newline at end of file
diff --git a/lifecycle/common-java8/api/2.0.0.txt b/lifecycle/lifecycle-common-java8/api/2.0.0.txt
similarity index 100%
rename from lifecycle/common-java8/api/2.0.0.txt
rename to lifecycle/lifecycle-common-java8/api/2.0.0.txt
diff --git a/lifecycle/common-java8/api/2.1.0-alpha01.txt b/lifecycle/lifecycle-common-java8/api/2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/common-java8/api/2.1.0-alpha01.txt
rename to lifecycle/lifecycle-common-java8/api/2.1.0-alpha01.txt
diff --git a/lifecycle/common-java8/api/2.1.0-alpha02.txt b/lifecycle/lifecycle-common-java8/api/2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/common-java8/api/2.1.0-alpha02.txt
rename to lifecycle/lifecycle-common-java8/api/2.1.0-alpha02.txt
diff --git a/lifecycle/common-java8/api/2.1.0-alpha03.txt b/lifecycle/lifecycle-common-java8/api/2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/common-java8/api/2.1.0-alpha03.txt
rename to lifecycle/lifecycle-common-java8/api/2.1.0-alpha03.txt
diff --git a/lifecycle/common-java8/api/2.1.0-alpha04.txt b/lifecycle/lifecycle-common-java8/api/2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/common-java8/api/2.1.0-alpha04.txt
rename to lifecycle/lifecycle-common-java8/api/2.1.0-alpha04.txt
diff --git a/lifecycle/common-java8/api/2.1.0-alpha05.txt b/lifecycle/lifecycle-common-java8/api/2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/common-java8/api/2.1.0-alpha05.txt
rename to lifecycle/lifecycle-common-java8/api/2.1.0-alpha05.txt
diff --git a/lifecycle/common-java8/api/2.1.0-beta00.txt b/lifecycle/lifecycle-common-java8/api/2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/common-java8/api/2.1.0-beta00.txt
rename to lifecycle/lifecycle-common-java8/api/2.1.0-beta00.txt
diff --git a/lifecycle/common-java8/api/2.1.0-beta01.txt b/lifecycle/lifecycle-common-java8/api/2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/common-java8/api/2.1.0-beta01.txt
rename to lifecycle/lifecycle-common-java8/api/2.1.0-beta01.txt
diff --git a/lifecycle/common-java8/api/2.1.0-beta02.txt b/lifecycle/lifecycle-common-java8/api/2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/common-java8/api/2.1.0-beta02.txt
rename to lifecycle/lifecycle-common-java8/api/2.1.0-beta02.txt
diff --git a/lifecycle/common-java8/api/2.2.0-alpha01.txt b/lifecycle/lifecycle-common-java8/api/2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/common-java8/api/2.2.0-alpha01.txt
rename to lifecycle/lifecycle-common-java8/api/2.2.0-alpha01.txt
diff --git a/lifecycle/lifecycle-common-java8/api/2.2.0-alpha02.ignore b/lifecycle/lifecycle-common-java8/api/2.2.0-alpha02.ignore
new file mode 100644
index 0000000..b1543dd0
--- /dev/null
+++ b/lifecycle/lifecycle-common-java8/api/2.2.0-alpha02.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedPackage: androidx.lifecycle:
+ Removed package androidx.lifecycle [RemovedPackage]
\ No newline at end of file
diff --git a/lifecycle/common-java8/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-common-java8/api/2.2.0-alpha02.txt
similarity index 100%
copy from lifecycle/common-java8/api/restricted_2.2.0-alpha02.txt
copy to lifecycle/lifecycle-common-java8/api/2.2.0-alpha02.txt
diff --git a/lifecycle/common-java8/api/restricted_current.txt b/lifecycle/lifecycle-common-java8/api/current.txt
similarity index 100%
copy from lifecycle/common-java8/api/restricted_current.txt
copy to lifecycle/lifecycle-common-java8/api/current.txt
diff --git a/lifecycle/common-java8/api/restricted_2.0.0.txt b/lifecycle/lifecycle-common-java8/api/restricted_2.0.0.txt
similarity index 100%
rename from lifecycle/common-java8/api/restricted_2.0.0.txt
rename to lifecycle/lifecycle-common-java8/api/restricted_2.0.0.txt
diff --git a/lifecycle/common-java8/api/restricted_2.1.0-alpha03.txt b/lifecycle/lifecycle-common-java8/api/restricted_2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/common-java8/api/restricted_2.1.0-alpha03.txt
rename to lifecycle/lifecycle-common-java8/api/restricted_2.1.0-alpha03.txt
diff --git a/lifecycle/common-java8/api/restricted_2.1.0-alpha04.txt b/lifecycle/lifecycle-common-java8/api/restricted_2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/common-java8/api/restricted_2.1.0-alpha04.txt
rename to lifecycle/lifecycle-common-java8/api/restricted_2.1.0-alpha04.txt
diff --git a/lifecycle/common-java8/api/restricted_2.1.0-alpha05.txt b/lifecycle/lifecycle-common-java8/api/restricted_2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/common-java8/api/restricted_2.1.0-alpha05.txt
rename to lifecycle/lifecycle-common-java8/api/restricted_2.1.0-alpha05.txt
diff --git a/lifecycle/common-java8/api/restricted_2.1.0-beta00.txt b/lifecycle/lifecycle-common-java8/api/restricted_2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/common-java8/api/restricted_2.1.0-beta00.txt
rename to lifecycle/lifecycle-common-java8/api/restricted_2.1.0-beta00.txt
diff --git a/lifecycle/common-java8/api/restricted_2.1.0-beta01.txt b/lifecycle/lifecycle-common-java8/api/restricted_2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/common-java8/api/restricted_2.1.0-beta01.txt
rename to lifecycle/lifecycle-common-java8/api/restricted_2.1.0-beta01.txt
diff --git a/lifecycle/common-java8/api/restricted_2.1.0-beta02.txt b/lifecycle/lifecycle-common-java8/api/restricted_2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/common-java8/api/restricted_2.1.0-beta02.txt
rename to lifecycle/lifecycle-common-java8/api/restricted_2.1.0-beta02.txt
diff --git a/lifecycle/common-java8/api/restricted_2.2.0-alpha01.txt b/lifecycle/lifecycle-common-java8/api/restricted_2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/common-java8/api/restricted_2.2.0-alpha01.txt
rename to lifecycle/lifecycle-common-java8/api/restricted_2.2.0-alpha01.txt
diff --git a/lifecycle/common-java8/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-common-java8/api/restricted_2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/common-java8/api/restricted_2.2.0-alpha02.txt
rename to lifecycle/lifecycle-common-java8/api/restricted_2.2.0-alpha02.txt
diff --git a/lifecycle/common-java8/api/restricted_current.txt b/lifecycle/lifecycle-common-java8/api/restricted_current.txt
similarity index 100%
rename from lifecycle/common-java8/api/restricted_current.txt
rename to lifecycle/lifecycle-common-java8/api/restricted_current.txt
diff --git a/lifecycle/common-java8/api_legacy/1.0.0.txt b/lifecycle/lifecycle-common-java8/api_legacy/1.0.0.txt
similarity index 100%
rename from lifecycle/common-java8/api_legacy/1.0.0.txt
rename to lifecycle/lifecycle-common-java8/api_legacy/1.0.0.txt
diff --git a/lifecycle/common-java8/build.gradle b/lifecycle/lifecycle-common-java8/build.gradle
similarity index 100%
rename from lifecycle/common-java8/build.gradle
rename to lifecycle/lifecycle-common-java8/build.gradle
diff --git a/lifecycle/common/api/2.0.0.txt b/lifecycle/lifecycle-common/api/2.0.0.txt
similarity index 100%
rename from lifecycle/common/api/2.0.0.txt
rename to lifecycle/lifecycle-common/api/2.0.0.txt
diff --git a/lifecycle/common/api/2.1.0-alpha01.txt b/lifecycle/lifecycle-common/api/2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/common/api/2.1.0-alpha01.txt
rename to lifecycle/lifecycle-common/api/2.1.0-alpha01.txt
diff --git a/lifecycle/common/api/2.1.0-alpha02.txt b/lifecycle/lifecycle-common/api/2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/common/api/2.1.0-alpha02.txt
rename to lifecycle/lifecycle-common/api/2.1.0-alpha02.txt
diff --git a/lifecycle/common/api/2.1.0-alpha03.txt b/lifecycle/lifecycle-common/api/2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/common/api/2.1.0-alpha03.txt
rename to lifecycle/lifecycle-common/api/2.1.0-alpha03.txt
diff --git a/lifecycle/common/api/2.1.0-alpha04.txt b/lifecycle/lifecycle-common/api/2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/common/api/2.1.0-alpha04.txt
rename to lifecycle/lifecycle-common/api/2.1.0-alpha04.txt
diff --git a/lifecycle/common/api/2.1.0-alpha05.txt b/lifecycle/lifecycle-common/api/2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/common/api/2.1.0-alpha05.txt
rename to lifecycle/lifecycle-common/api/2.1.0-alpha05.txt
diff --git a/lifecycle/common/api/2.1.0-beta00.txt b/lifecycle/lifecycle-common/api/2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/common/api/2.1.0-beta00.txt
rename to lifecycle/lifecycle-common/api/2.1.0-beta00.txt
diff --git a/lifecycle/common/api/2.1.0-beta01.txt b/lifecycle/lifecycle-common/api/2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/common/api/2.1.0-beta01.txt
rename to lifecycle/lifecycle-common/api/2.1.0-beta01.txt
diff --git a/lifecycle/common/api/2.1.0-beta02.txt b/lifecycle/lifecycle-common/api/2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/common/api/2.1.0-beta02.txt
rename to lifecycle/lifecycle-common/api/2.1.0-beta02.txt
diff --git a/lifecycle/common/api/2.2.0-alpha01.txt b/lifecycle/lifecycle-common/api/2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/common/api/2.2.0-alpha01.txt
rename to lifecycle/lifecycle-common/api/2.2.0-alpha01.txt
diff --git a/lifecycle/common/api/2.2.0-alpha02.txt b/lifecycle/lifecycle-common/api/2.2.0-alpha02.txt
similarity index 69%
rename from lifecycle/common/api/2.2.0-alpha02.txt
rename to lifecycle/lifecycle-common/api/2.2.0-alpha02.txt
index 3f2e1d7..1d2105f 100644
--- a/lifecycle/common/api/2.2.0-alpha02.txt
+++ b/lifecycle/lifecycle-common/api/2.2.0-alpha02.txt
@@ -1,6 +1,15 @@
// Signature format: 3.0
package androidx.lifecycle {
+ public interface DefaultLifecycleObserver extends androidx.lifecycle.LifecycleObserver {
+ method public default void onCreate(androidx.lifecycle.LifecycleOwner);
+ method public default void onDestroy(androidx.lifecycle.LifecycleOwner);
+ method public default void onPause(androidx.lifecycle.LifecycleOwner);
+ method public default void onResume(androidx.lifecycle.LifecycleOwner);
+ method public default void onStart(androidx.lifecycle.LifecycleOwner);
+ method public default void onStop(androidx.lifecycle.LifecycleOwner);
+ }
+
public abstract class Lifecycle {
ctor public Lifecycle();
method @MainThread public abstract void addObserver(androidx.lifecycle.LifecycleObserver);
@@ -38,8 +47,8 @@
method public androidx.lifecycle.Lifecycle getLifecycle();
}
- @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) public @interface OnLifecycleEvent {
- method public abstract androidx.lifecycle.Lifecycle.Event! value();
+ @Deprecated @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) public @interface OnLifecycleEvent {
+ method @Deprecated public abstract androidx.lifecycle.Lifecycle.Event! value();
}
}
diff --git a/lifecycle/common/api/2.2.0-alpha02.txt b/lifecycle/lifecycle-common/api/current.txt
similarity index 69%
copy from lifecycle/common/api/2.2.0-alpha02.txt
copy to lifecycle/lifecycle-common/api/current.txt
index 3f2e1d7..1d2105f 100644
--- a/lifecycle/common/api/2.2.0-alpha02.txt
+++ b/lifecycle/lifecycle-common/api/current.txt
@@ -1,6 +1,15 @@
// Signature format: 3.0
package androidx.lifecycle {
+ public interface DefaultLifecycleObserver extends androidx.lifecycle.LifecycleObserver {
+ method public default void onCreate(androidx.lifecycle.LifecycleOwner);
+ method public default void onDestroy(androidx.lifecycle.LifecycleOwner);
+ method public default void onPause(androidx.lifecycle.LifecycleOwner);
+ method public default void onResume(androidx.lifecycle.LifecycleOwner);
+ method public default void onStart(androidx.lifecycle.LifecycleOwner);
+ method public default void onStop(androidx.lifecycle.LifecycleOwner);
+ }
+
public abstract class Lifecycle {
ctor public Lifecycle();
method @MainThread public abstract void addObserver(androidx.lifecycle.LifecycleObserver);
@@ -38,8 +47,8 @@
method public androidx.lifecycle.Lifecycle getLifecycle();
}
- @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) public @interface OnLifecycleEvent {
- method public abstract androidx.lifecycle.Lifecycle.Event! value();
+ @Deprecated @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target(java.lang.annotation.ElementType.METHOD) public @interface OnLifecycleEvent {
+ method @Deprecated public abstract androidx.lifecycle.Lifecycle.Event! value();
}
}
diff --git a/lifecycle/common/api/restricted_2.0.0.txt b/lifecycle/lifecycle-common/api/restricted_2.0.0.txt
similarity index 100%
rename from lifecycle/common/api/restricted_2.0.0.txt
rename to lifecycle/lifecycle-common/api/restricted_2.0.0.txt
diff --git a/lifecycle/common/api/restricted_2.1.0-alpha03.ignore b/lifecycle/lifecycle-common/api/restricted_2.1.0-alpha03.ignore
similarity index 100%
rename from lifecycle/common/api/restricted_2.1.0-alpha03.ignore
rename to lifecycle/lifecycle-common/api/restricted_2.1.0-alpha03.ignore
diff --git a/lifecycle/common/api/restricted_2.1.0-alpha03.txt b/lifecycle/lifecycle-common/api/restricted_2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/common/api/restricted_2.1.0-alpha03.txt
rename to lifecycle/lifecycle-common/api/restricted_2.1.0-alpha03.txt
diff --git a/lifecycle/common/api/restricted_2.1.0-alpha04.ignore b/lifecycle/lifecycle-common/api/restricted_2.1.0-alpha04.ignore
similarity index 100%
rename from lifecycle/common/api/restricted_2.1.0-alpha04.ignore
rename to lifecycle/lifecycle-common/api/restricted_2.1.0-alpha04.ignore
diff --git a/lifecycle/common/api/restricted_2.1.0-alpha04.txt b/lifecycle/lifecycle-common/api/restricted_2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/common/api/restricted_2.1.0-alpha04.txt
rename to lifecycle/lifecycle-common/api/restricted_2.1.0-alpha04.txt
diff --git a/lifecycle/common/api/restricted_2.1.0-alpha05.ignore b/lifecycle/lifecycle-common/api/restricted_2.1.0-alpha05.ignore
similarity index 100%
rename from lifecycle/common/api/restricted_2.1.0-alpha05.ignore
rename to lifecycle/lifecycle-common/api/restricted_2.1.0-alpha05.ignore
diff --git a/lifecycle/common/api/restricted_2.1.0-alpha05.txt b/lifecycle/lifecycle-common/api/restricted_2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/common/api/restricted_2.1.0-alpha05.txt
rename to lifecycle/lifecycle-common/api/restricted_2.1.0-alpha05.txt
diff --git a/lifecycle/common/api/restricted_2.1.0-beta00.ignore b/lifecycle/lifecycle-common/api/restricted_2.1.0-beta00.ignore
similarity index 100%
rename from lifecycle/common/api/restricted_2.1.0-beta00.ignore
rename to lifecycle/lifecycle-common/api/restricted_2.1.0-beta00.ignore
diff --git a/lifecycle/common/api/restricted_2.1.0-beta00.txt b/lifecycle/lifecycle-common/api/restricted_2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/common/api/restricted_2.1.0-beta00.txt
rename to lifecycle/lifecycle-common/api/restricted_2.1.0-beta00.txt
diff --git a/lifecycle/common/api/restricted_2.1.0-beta01.txt b/lifecycle/lifecycle-common/api/restricted_2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/common/api/restricted_2.1.0-beta01.txt
rename to lifecycle/lifecycle-common/api/restricted_2.1.0-beta01.txt
diff --git a/lifecycle/common/api/restricted_2.1.0-beta02.txt b/lifecycle/lifecycle-common/api/restricted_2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/common/api/restricted_2.1.0-beta02.txt
rename to lifecycle/lifecycle-common/api/restricted_2.1.0-beta02.txt
diff --git a/lifecycle/common/api/restricted_2.2.0-alpha01.txt b/lifecycle/lifecycle-common/api/restricted_2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/common/api/restricted_2.2.0-alpha01.txt
rename to lifecycle/lifecycle-common/api/restricted_2.2.0-alpha01.txt
diff --git a/lifecycle/common/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-common/api/restricted_2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/common/api/restricted_2.2.0-alpha02.txt
rename to lifecycle/lifecycle-common/api/restricted_2.2.0-alpha02.txt
diff --git a/lifecycle/common/api/restricted_current.txt b/lifecycle/lifecycle-common/api/restricted_current.txt
similarity index 100%
rename from lifecycle/common/api/restricted_current.txt
rename to lifecycle/lifecycle-common/api/restricted_current.txt
diff --git a/lifecycle/common/api_legacy/0.0.0.txt b/lifecycle/lifecycle-common/api_legacy/0.0.0.txt
similarity index 100%
rename from lifecycle/common/api_legacy/0.0.0.txt
rename to lifecycle/lifecycle-common/api_legacy/0.0.0.txt
diff --git a/lifecycle/common/api_legacy/1.0.0.txt b/lifecycle/lifecycle-common/api_legacy/1.0.0.txt
similarity index 100%
rename from lifecycle/common/api_legacy/1.0.0.txt
rename to lifecycle/lifecycle-common/api_legacy/1.0.0.txt
diff --git a/lifecycle/common/api_legacy/current.txt b/lifecycle/lifecycle-common/api_legacy/current.txt
similarity index 100%
rename from lifecycle/common/api_legacy/current.txt
rename to lifecycle/lifecycle-common/api_legacy/current.txt
diff --git a/lifecycle/common/build.gradle b/lifecycle/lifecycle-common/build.gradle
similarity index 100%
rename from lifecycle/common/build.gradle
rename to lifecycle/lifecycle-common/build.gradle
diff --git a/lifecycle/common/lint-baseline.xml b/lifecycle/lifecycle-common/lint-baseline.xml
similarity index 100%
rename from lifecycle/common/lint-baseline.xml
rename to lifecycle/lifecycle-common/lint-baseline.xml
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/ClassesInfoCache.java b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/ClassesInfoCache.java
similarity index 100%
rename from lifecycle/common/src/main/java/androidx/lifecycle/ClassesInfoCache.java
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/ClassesInfoCache.java
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/CompositeGeneratedAdaptersObserver.java b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/CompositeGeneratedAdaptersObserver.java
similarity index 100%
rename from lifecycle/common/src/main/java/androidx/lifecycle/CompositeGeneratedAdaptersObserver.java
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/CompositeGeneratedAdaptersObserver.java
diff --git a/lifecycle/common-java8/src/main/java/androidx/lifecycle/DefaultLifecycleObserver.java b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/DefaultLifecycleObserver.java
similarity index 92%
rename from lifecycle/common-java8/src/main/java/androidx/lifecycle/DefaultLifecycleObserver.java
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/DefaultLifecycleObserver.java
index be9a4a4..4ccb307 100644
--- a/lifecycle/common-java8/src/main/java/androidx/lifecycle/DefaultLifecycleObserver.java
+++ b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/DefaultLifecycleObserver.java
@@ -21,8 +21,6 @@
/**
* Callback interface for listening to {@link LifecycleOwner} state changes.
* <p>
- * If you use Java 8 language, <b>always</b> prefer it over annotations.
- * <p>
* If a class implements both this interface and {@link LifecycleEventObserver}, then
* methods of {@code DefaultLifecycleObserver} will be called first, and then followed by the call
* of {@link LifecycleEventObserver#onStateChanged(LifecycleOwner, Lifecycle.Event)}
@@ -31,7 +29,7 @@
* annotations will be ignored.
*/
@SuppressWarnings("unused")
-public interface DefaultLifecycleObserver extends FullLifecycleObserver {
+public interface DefaultLifecycleObserver extends LifecycleObserver {
/**
* Notifies that {@code ON_CREATE} event occurred.
@@ -41,7 +39,6 @@
*
* @param owner the component, whose state was changed
*/
- @Override
default void onCreate(@NonNull LifecycleOwner owner) {
}
@@ -52,7 +49,6 @@
*
* @param owner the component, whose state was changed
*/
- @Override
default void onStart(@NonNull LifecycleOwner owner) {
}
@@ -64,7 +60,6 @@
*
* @param owner the component, whose state was changed
*/
- @Override
default void onResume(@NonNull LifecycleOwner owner) {
}
@@ -76,7 +71,6 @@
*
* @param owner the component, whose state was changed
*/
- @Override
default void onPause(@NonNull LifecycleOwner owner) {
}
@@ -88,7 +82,6 @@
*
* @param owner the component, whose state was changed
*/
- @Override
default void onStop(@NonNull LifecycleOwner owner) {
}
@@ -100,7 +93,6 @@
*
* @param owner the component, whose state was changed
*/
- @Override
default void onDestroy(@NonNull LifecycleOwner owner) {
}
}
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/FullLifecycleObserverAdapter.java b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/DefaultLifecycleObserverAdapter.java
similarity index 89%
rename from lifecycle/common/src/main/java/androidx/lifecycle/FullLifecycleObserverAdapter.java
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/DefaultLifecycleObserverAdapter.java
index 10223d4..ede3c4c 100644
--- a/lifecycle/common/src/main/java/androidx/lifecycle/FullLifecycleObserverAdapter.java
+++ b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/DefaultLifecycleObserverAdapter.java
@@ -18,12 +18,12 @@
import androidx.annotation.NonNull;
-class FullLifecycleObserverAdapter implements LifecycleEventObserver {
+class DefaultLifecycleObserverAdapter implements LifecycleEventObserver {
- private final FullLifecycleObserver mFullLifecycleObserver;
+ private final DefaultLifecycleObserver mFullLifecycleObserver;
private final LifecycleEventObserver mLifecycleEventObserver;
- FullLifecycleObserverAdapter(FullLifecycleObserver fullLifecycleObserver,
+ DefaultLifecycleObserverAdapter(DefaultLifecycleObserver fullLifecycleObserver,
LifecycleEventObserver lifecycleEventObserver) {
mFullLifecycleObserver = fullLifecycleObserver;
mLifecycleEventObserver = lifecycleEventObserver;
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/GeneratedAdapter.java b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/GeneratedAdapter.java
similarity index 100%
rename from lifecycle/common/src/main/java/androidx/lifecycle/GeneratedAdapter.java
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/GeneratedAdapter.java
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/GenericLifecycleObserver.java b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/GenericLifecycleObserver.java
similarity index 100%
rename from lifecycle/common/src/main/java/androidx/lifecycle/GenericLifecycleObserver.java
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/GenericLifecycleObserver.java
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/Lifecycle.java b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/Lifecycle.java
similarity index 83%
rename from lifecycle/common/src/main/java/androidx/lifecycle/Lifecycle.java
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/Lifecycle.java
index 6fd66bd8..097a46d 100644
--- a/lifecycle/common/src/main/java/androidx/lifecycle/Lifecycle.java
+++ b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/Lifecycle.java
@@ -38,9 +38,9 @@
* before {@link android.app.Activity#onStop onStop} is called.
* This gives you certain guarantees on which state the owner is in.
* <p>
- * If you use <b>Java 8 Language</b>, then observe events with {@link DefaultLifecycleObserver}.
- * To include it you should add {@code "androidx.lifecycle:common-java8:<version>"} to your
- * build.gradle file.
+ * Your observer should implement either {@link DefaultLifecycleObserver}
+ * or {@link LifecycleEventObserver} interfaces, for example, with {@link DefaultLifecycleObserver}
+ * it would look like:
* <pre>
* class TestObserver implements DefaultLifecycleObserver {
* {@literal @}Override
@@ -49,31 +49,6 @@
* }
* }
* </pre>
- * If you use <b>Java 7 Language</b>, Lifecycle events are observed using annotations.
- * Once Java 8 Language becomes mainstream on Android, annotations will be deprecated, so between
- * {@link DefaultLifecycleObserver} and annotations,
- * you must always prefer {@code DefaultLifecycleObserver}.
- * <pre>
- * class TestObserver implements LifecycleObserver {
- * {@literal @}OnLifecycleEvent(ON_STOP)
- * void onStopped() {}
- * }
- * </pre>
- * <p>
- * Observer methods can receive zero or one argument.
- * If used, the first argument must be of type {@link LifecycleOwner}.
- * Methods annotated with {@link Event#ON_ANY} can receive the second argument, which must be
- * of type {@link Event}.
- * <pre>
- * class TestObserver implements LifecycleObserver {
- * {@literal @}OnLifecycleEvent(ON_CREATE)
- * void onCreated(LifecycleOwner source) {}
- * {@literal @}OnLifecycleEvent(ON_ANY)
- * void onAny(LifecycleOwner source, Event event) {}
- * }
- * </pre>
- * These additional parameters are provided to allow you to conveniently observe multiple providers
- * and events without tracking them manually.
*/
public abstract class Lifecycle {
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/LifecycleEventObserver.java b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/LifecycleEventObserver.java
similarity index 100%
rename from lifecycle/common/src/main/java/androidx/lifecycle/LifecycleEventObserver.java
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/LifecycleEventObserver.java
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/LifecycleObserver.java b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/LifecycleObserver.java
similarity index 74%
rename from lifecycle/common/src/main/java/androidx/lifecycle/LifecycleObserver.java
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/LifecycleObserver.java
index f02aad8..6a95e39 100644
--- a/lifecycle/common/src/main/java/androidx/lifecycle/LifecycleObserver.java
+++ b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/LifecycleObserver.java
@@ -17,9 +17,14 @@
package androidx.lifecycle;
/**
- * Marks a class as a LifecycleObserver. It does not have any methods, instead, relies on
- * {@link OnLifecycleEvent} annotated methods.
+ * Marks a class as a LifecycleObserver. It does not have any methods, instead, use either:
+ * <ul>
+ * <li>{@link DefaultLifecycleObserver} if you are interested only in certain events,
+ * for example only in {@code ON_CREATE} and {@code ON_DESTROY};
+ * <li>{@link LifecycleEventObserver} if you need to process all events in a stream-like manner.
+ * </ul>
* <p>
+ *
* @see Lifecycle Lifecycle - for samples and usage patterns.
*/
@SuppressWarnings("WeakerAccess")
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/LifecycleOwner.java b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/LifecycleOwner.java
similarity index 100%
rename from lifecycle/common/src/main/java/androidx/lifecycle/LifecycleOwner.java
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/LifecycleOwner.java
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/Lifecycling.java b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/Lifecycling.java
similarity index 94%
rename from lifecycle/common/src/main/java/androidx/lifecycle/Lifecycling.java
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/Lifecycling.java
index 2abb6ec..9ccdd96 100644
--- a/lifecycle/common/src/main/java/androidx/lifecycle/Lifecycling.java
+++ b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/Lifecycling.java
@@ -66,13 +66,13 @@
@NonNull
static LifecycleEventObserver lifecycleEventObserver(Object object) {
boolean isLifecycleEventObserver = object instanceof LifecycleEventObserver;
- boolean isFullLifecycleObserver = object instanceof FullLifecycleObserver;
- if (isLifecycleEventObserver && isFullLifecycleObserver) {
- return new FullLifecycleObserverAdapter((FullLifecycleObserver) object,
+ boolean isDefaultLifecycleObserver = object instanceof DefaultLifecycleObserver;
+ if (isLifecycleEventObserver && isDefaultLifecycleObserver) {
+ return new DefaultLifecycleObserverAdapter((DefaultLifecycleObserver) object,
(LifecycleEventObserver) object);
}
- if (isFullLifecycleObserver) {
- return new FullLifecycleObserverAdapter((FullLifecycleObserver) object, null);
+ if (isDefaultLifecycleObserver) {
+ return new DefaultLifecycleObserverAdapter((DefaultLifecycleObserver) object, null);
}
if (isLifecycleEventObserver) {
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/MethodCallsLogger.java b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/MethodCallsLogger.java
similarity index 100%
rename from lifecycle/common/src/main/java/androidx/lifecycle/MethodCallsLogger.java
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/MethodCallsLogger.java
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/OnLifecycleEvent.java b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/OnLifecycleEvent.java
similarity index 89%
rename from lifecycle/common/src/main/java/androidx/lifecycle/OnLifecycleEvent.java
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/OnLifecycleEvent.java
index cfb72a0..460f787 100644
--- a/lifecycle/common/src/main/java/androidx/lifecycle/OnLifecycleEvent.java
+++ b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/OnLifecycleEvent.java
@@ -21,9 +21,13 @@
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
+/**
+ * @deprecated Use {@link DefaultLifecycleObserver} or {@link LifecycleEventObserver} instead.
+ */
@SuppressWarnings("unused")
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
+@Deprecated
public @interface OnLifecycleEvent {
Lifecycle.Event value();
}
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/ReflectiveGenericLifecycleObserver.java b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/ReflectiveGenericLifecycleObserver.java
similarity index 100%
rename from lifecycle/common/src/main/java/androidx/lifecycle/ReflectiveGenericLifecycleObserver.java
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/ReflectiveGenericLifecycleObserver.java
diff --git a/lifecycle/common/src/main/java/androidx/lifecycle/SingleGeneratedAdapterObserver.java b/lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/SingleGeneratedAdapterObserver.java
similarity index 100%
rename from lifecycle/common/src/main/java/androidx/lifecycle/SingleGeneratedAdapterObserver.java
rename to lifecycle/lifecycle-common/src/main/java/androidx/lifecycle/SingleGeneratedAdapterObserver.java
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/FullLifecycleObserverTest.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/DefaultLifecycleObserverTest.java
similarity index 92%
rename from lifecycle/common/src/test/java/androidx/lifecycle/FullLifecycleObserverTest.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/DefaultLifecycleObserverTest.java
index 8a6500b..e336ef0 100644
--- a/lifecycle/common/src/test/java/androidx/lifecycle/FullLifecycleObserverTest.java
+++ b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/DefaultLifecycleObserverTest.java
@@ -42,7 +42,7 @@
import org.mockito.Mockito;
@RunWith(JUnit4.class)
-public class FullLifecycleObserverTest {
+public class DefaultLifecycleObserverTest {
private LifecycleOwner mOwner;
private Lifecycle mLifecycle;
@@ -55,8 +55,8 @@
@Test
public void eachEvent() {
- FullLifecycleObserver obj = mock(FullLifecycleObserver.class);
- FullLifecycleObserverAdapter observer = new FullLifecycleObserverAdapter(obj, null);
+ DefaultLifecycleObserver obj = mock(DefaultLifecycleObserver.class);
+ DefaultLifecycleObserverAdapter observer = new DefaultLifecycleObserverAdapter(obj, null);
when(mLifecycle.getCurrentState()).thenReturn(CREATED);
observer.onStateChanged(mOwner, ON_CREATE);
@@ -92,7 +92,7 @@
@Test
public void fullLifecycleObserverAndLifecycleEventObserver() {
- class AllObservers implements FullLifecycleObserver, LifecycleEventObserver {
+ class AllObservers implements DefaultLifecycleObserver, LifecycleEventObserver {
@Override
public void onCreate(LifecycleOwner owner) {
@@ -132,7 +132,7 @@
}
AllObservers obj = mock(AllObservers.class);
- FullLifecycleObserverAdapter observer = new FullLifecycleObserverAdapter(obj, obj);
+ DefaultLifecycleObserverAdapter observer = new DefaultLifecycleObserverAdapter(obj, obj);
when(mLifecycle.getCurrentState()).thenReturn(CREATED);
observer.onStateChanged(mOwner, ON_CREATE);
@@ -173,7 +173,7 @@
}
public void fullLifecycleObserverAndAnnotations() {
- class AnnotatedFullLifecycleObserver implements FullLifecycleObserver {
+ class AnnotatedFullLifecycleObserver implements DefaultLifecycleObserver {
@OnLifecycleEvent(ON_ANY)
public void onAny() {
throw new IllegalStateException("Annotations in FullLifecycleObserver "
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/LifecyclingTest.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/LifecyclingTest.java
similarity index 98%
rename from lifecycle/common/src/test/java/androidx/lifecycle/LifecyclingTest.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/LifecyclingTest.java
index 5854dce..2c6cfe0 100644
--- a/lifecycle/common/src/test/java/androidx/lifecycle/LifecyclingTest.java
+++ b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/LifecyclingTest.java
@@ -116,7 +116,7 @@
@Test
public void fullLifecycleObserverAndAnnotations() {
- class AnnotatedFullLifecycleObserver implements FullLifecycleObserver {
+ class AnnotatedFullLifecycleObserver implements DefaultLifecycleObserver {
@OnLifecycleEvent(ON_ANY)
public void onAny() {
throw new IllegalStateException("Annotations in FullLifecycleObserver "
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/ReflectiveGenericLifecycleObserverTest.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/ReflectiveGenericLifecycleObserverTest.java
similarity index 100%
rename from lifecycle/common/src/test/java/androidx/lifecycle/ReflectiveGenericLifecycleObserverTest.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/ReflectiveGenericLifecycleObserverTest.java
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/observers/Base.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/Base.java
similarity index 100%
rename from lifecycle/common/src/test/java/androidx/lifecycle/observers/Base.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/Base.java
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/observers/Base_LifecycleAdapter.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/Base_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/common/src/test/java/androidx/lifecycle/observers/Base_LifecycleAdapter.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/Base_LifecycleAdapter.java
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/observers/DerivedSequence1.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/DerivedSequence1.java
similarity index 100%
rename from lifecycle/common/src/test/java/androidx/lifecycle/observers/DerivedSequence1.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/DerivedSequence1.java
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/observers/DerivedSequence2.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/DerivedSequence2.java
similarity index 100%
rename from lifecycle/common/src/test/java/androidx/lifecycle/observers/DerivedSequence2.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/DerivedSequence2.java
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/observers/DerivedWithNewMethods.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/DerivedWithNewMethods.java
similarity index 100%
rename from lifecycle/common/src/test/java/androidx/lifecycle/observers/DerivedWithNewMethods.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/DerivedWithNewMethods.java
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/observers/DerivedWithNoNewMethods.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/DerivedWithNoNewMethods.java
similarity index 100%
rename from lifecycle/common/src/test/java/androidx/lifecycle/observers/DerivedWithNoNewMethods.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/DerivedWithNoNewMethods.java
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/observers/DerivedWithOverridenMethodsWithLfAnnotation.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/DerivedWithOverridenMethodsWithLfAnnotation.java
similarity index 100%
rename from lifecycle/common/src/test/java/androidx/lifecycle/observers/DerivedWithOverridenMethodsWithLfAnnotation.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/DerivedWithOverridenMethodsWithLfAnnotation.java
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/observers/Interface1.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/Interface1.java
similarity index 100%
rename from lifecycle/common/src/test/java/androidx/lifecycle/observers/Interface1.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/Interface1.java
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/observers/Interface1_LifecycleAdapter.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/Interface1_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/common/src/test/java/androidx/lifecycle/observers/Interface1_LifecycleAdapter.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/Interface1_LifecycleAdapter.java
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/observers/Interface2.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/Interface2.java
similarity index 100%
rename from lifecycle/common/src/test/java/androidx/lifecycle/observers/Interface2.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/Interface2.java
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/observers/Interface2_LifecycleAdapter.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/Interface2_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/common/src/test/java/androidx/lifecycle/observers/Interface2_LifecycleAdapter.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/Interface2_LifecycleAdapter.java
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/observers/InterfaceImpl1.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/InterfaceImpl1.java
similarity index 100%
rename from lifecycle/common/src/test/java/androidx/lifecycle/observers/InterfaceImpl1.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/InterfaceImpl1.java
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/observers/InterfaceImpl2.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/InterfaceImpl2.java
similarity index 100%
rename from lifecycle/common/src/test/java/androidx/lifecycle/observers/InterfaceImpl2.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/InterfaceImpl2.java
diff --git a/lifecycle/common/src/test/java/androidx/lifecycle/observers/InterfaceImpl3.java b/lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/InterfaceImpl3.java
similarity index 100%
rename from lifecycle/common/src/test/java/androidx/lifecycle/observers/InterfaceImpl3.java
rename to lifecycle/lifecycle-common/src/test/java/androidx/lifecycle/observers/InterfaceImpl3.java
diff --git a/lifecycle/compiler/build.gradle b/lifecycle/lifecycle-compiler/build.gradle
similarity index 100%
rename from lifecycle/compiler/build.gradle
rename to lifecycle/lifecycle-compiler/build.gradle
diff --git a/lifecycle/compiler/reset_results.py b/lifecycle/lifecycle-compiler/reset_results.py
similarity index 100%
rename from lifecycle/compiler/reset_results.py
rename to lifecycle/lifecycle-compiler/reset_results.py
diff --git a/lifecycle/compiler/src/main/kotlin/androidx/lifecycle/ErrorMessages.kt b/lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/ErrorMessages.kt
similarity index 100%
rename from lifecycle/compiler/src/main/kotlin/androidx/lifecycle/ErrorMessages.kt
rename to lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/ErrorMessages.kt
diff --git a/lifecycle/compiler/src/main/kotlin/androidx/lifecycle/LifecycleProcessor.kt b/lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/LifecycleProcessor.kt
similarity index 100%
rename from lifecycle/compiler/src/main/kotlin/androidx/lifecycle/LifecycleProcessor.kt
rename to lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/LifecycleProcessor.kt
diff --git a/lifecycle/compiler/src/main/kotlin/androidx/lifecycle/elements_ext.kt b/lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/elements_ext.kt
similarity index 100%
rename from lifecycle/compiler/src/main/kotlin/androidx/lifecycle/elements_ext.kt
rename to lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/elements_ext.kt
diff --git a/lifecycle/compiler/src/main/kotlin/androidx/lifecycle/input_collector.kt b/lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/input_collector.kt
similarity index 99%
rename from lifecycle/compiler/src/main/kotlin/androidx/lifecycle/input_collector.kt
rename to lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/input_collector.kt
index d6bcaf9..20ea1a9 100644
--- a/lifecycle/compiler/src/main/kotlin/androidx/lifecycle/input_collector.kt
+++ b/lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/input_collector.kt
@@ -14,6 +14,8 @@
* limitations under the License.
*/
+@file:Suppress("DEPRECATION")
+
package androidx.lifecycle
import androidx.lifecycle.model.EventMethod
diff --git a/lifecycle/compiler/src/main/kotlin/androidx/lifecycle/model/AdapterClass.kt b/lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/model/AdapterClass.kt
similarity index 100%
rename from lifecycle/compiler/src/main/kotlin/androidx/lifecycle/model/AdapterClass.kt
rename to lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/model/AdapterClass.kt
diff --git a/lifecycle/compiler/src/main/kotlin/androidx/lifecycle/model/EventMethod.kt b/lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/model/EventMethod.kt
similarity index 85%
rename from lifecycle/compiler/src/main/kotlin/androidx/lifecycle/model/EventMethod.kt
rename to lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/model/EventMethod.kt
index 1056e71..0cc5fbc7 100644
--- a/lifecycle/compiler/src/main/kotlin/androidx/lifecycle/model/EventMethod.kt
+++ b/lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/model/EventMethod.kt
@@ -14,6 +14,8 @@
* limitations under the License.
*/
+@file:Suppress("DEPRECATION")
+
package androidx.lifecycle.model
import androidx.lifecycle.OnLifecycleEvent
@@ -21,9 +23,11 @@
import javax.lang.model.element.ExecutableElement
import javax.lang.model.element.TypeElement
-data class EventMethod(val method: ExecutableElement,
- val onLifecycleEvent: OnLifecycleEvent,
- val type: TypeElement) {
+data class EventMethod(
+ val method: ExecutableElement,
+ val onLifecycleEvent: OnLifecycleEvent,
+ val type: TypeElement
+) {
fun packageName() = type.getPackageQName()
}
diff --git a/lifecycle/compiler/src/main/kotlin/androidx/lifecycle/model/InputModel.kt b/lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/model/InputModel.kt
similarity index 100%
rename from lifecycle/compiler/src/main/kotlin/androidx/lifecycle/model/InputModel.kt
rename to lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/model/InputModel.kt
diff --git a/lifecycle/compiler/src/main/kotlin/androidx/lifecycle/model/LifecycleObserverInfo.kt b/lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/model/LifecycleObserverInfo.kt
similarity index 100%
rename from lifecycle/compiler/src/main/kotlin/androidx/lifecycle/model/LifecycleObserverInfo.kt
rename to lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/model/LifecycleObserverInfo.kt
diff --git a/lifecycle/compiler/src/main/kotlin/androidx/lifecycle/transformation.kt b/lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/transformation.kt
similarity index 100%
rename from lifecycle/compiler/src/main/kotlin/androidx/lifecycle/transformation.kt
rename to lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/transformation.kt
diff --git a/lifecycle/compiler/src/main/kotlin/androidx/lifecycle/writer.kt b/lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/writer.kt
similarity index 100%
rename from lifecycle/compiler/src/main/kotlin/androidx/lifecycle/writer.kt
rename to lifecycle/lifecycle-compiler/src/main/kotlin/androidx/lifecycle/writer.kt
diff --git a/lifecycle/compiler/src/main/resources/META-INF/gradle/incremental.annotation.processors b/lifecycle/lifecycle-compiler/src/main/resources/META-INF/gradle/incremental.annotation.processors
similarity index 100%
rename from lifecycle/compiler/src/main/resources/META-INF/gradle/incremental.annotation.processors
rename to lifecycle/lifecycle-compiler/src/main/resources/META-INF/gradle/incremental.annotation.processors
diff --git a/lifecycle/compiler/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/lifecycle/lifecycle-compiler/src/main/resources/META-INF/services/javax.annotation.processing.Processor
similarity index 100%
rename from lifecycle/compiler/src/main/resources/META-INF/services/javax.annotation.processing.Processor
rename to lifecycle/lifecycle-compiler/src/main/resources/META-INF/services/javax.annotation.processing.Processor
diff --git a/lifecycle/compiler/src/main/resources/NOTICE.txt b/lifecycle/lifecycle-compiler/src/main/resources/NOTICE.txt
similarity index 100%
rename from lifecycle/compiler/src/main/resources/NOTICE.txt
rename to lifecycle/lifecycle-compiler/src/main/resources/NOTICE.txt
diff --git a/lifecycle/compiler/src/tests/kotlin/androidx/lifecycle/InvalidCasesTest.kt b/lifecycle/lifecycle-compiler/src/tests/kotlin/androidx/lifecycle/InvalidCasesTest.kt
similarity index 100%
rename from lifecycle/compiler/src/tests/kotlin/androidx/lifecycle/InvalidCasesTest.kt
rename to lifecycle/lifecycle-compiler/src/tests/kotlin/androidx/lifecycle/InvalidCasesTest.kt
diff --git a/lifecycle/compiler/src/tests/kotlin/androidx/lifecycle/ValidCasesTest.kt b/lifecycle/lifecycle-compiler/src/tests/kotlin/androidx/lifecycle/ValidCasesTest.kt
similarity index 100%
rename from lifecycle/compiler/src/tests/kotlin/androidx/lifecycle/ValidCasesTest.kt
rename to lifecycle/lifecycle-compiler/src/tests/kotlin/androidx/lifecycle/ValidCasesTest.kt
diff --git a/lifecycle/compiler/src/tests/kotlin/androidx/lifecycle/utils/TestUtils.kt b/lifecycle/lifecycle-compiler/src/tests/kotlin/androidx/lifecycle/utils/TestUtils.kt
similarity index 100%
rename from lifecycle/compiler/src/tests/kotlin/androidx/lifecycle/utils/TestUtils.kt
rename to lifecycle/lifecycle-compiler/src/tests/kotlin/androidx/lifecycle/utils/TestUtils.kt
diff --git a/lifecycle/compiler/src/tests/test-data/Bar.java b/lifecycle/lifecycle-compiler/src/tests/test-data/Bar.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/Bar.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/Bar.java
diff --git a/lifecycle/compiler/src/tests/test-data/DerivedFromJar.java b/lifecycle/lifecycle-compiler/src/tests/test-data/DerivedFromJar.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/DerivedFromJar.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/DerivedFromJar.java
diff --git a/lifecycle/compiler/src/tests/test-data/DerivedFromJar1.java b/lifecycle/lifecycle-compiler/src/tests/test-data/DerivedFromJar1.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/DerivedFromJar1.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/DerivedFromJar1.java
diff --git a/lifecycle/compiler/src/tests/test-data/DifferentPackagesBase1.java b/lifecycle/lifecycle-compiler/src/tests/test-data/DifferentPackagesBase1.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/DifferentPackagesBase1.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/DifferentPackagesBase1.java
diff --git a/lifecycle/compiler/src/tests/test-data/DifferentPackagesBase2.java b/lifecycle/lifecycle-compiler/src/tests/test-data/DifferentPackagesBase2.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/DifferentPackagesBase2.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/DifferentPackagesBase2.java
diff --git a/lifecycle/compiler/src/tests/test-data/DifferentPackagesDerived1.java b/lifecycle/lifecycle-compiler/src/tests/test-data/DifferentPackagesDerived1.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/DifferentPackagesDerived1.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/DifferentPackagesDerived1.java
diff --git a/lifecycle/compiler/src/tests/test-data/DifferentPackagesDerived2.java b/lifecycle/lifecycle-compiler/src/tests/test-data/DifferentPackagesDerived2.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/DifferentPackagesDerived2.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/DifferentPackagesDerived2.java
diff --git a/lifecycle/compiler/src/tests/test-data/IGNORE_CHECKSTYLE b/lifecycle/lifecycle-compiler/src/tests/test-data/IGNORE_CHECKSTYLE
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/IGNORE_CHECKSTYLE
rename to lifecycle/lifecycle-compiler/src/tests/test-data/IGNORE_CHECKSTYLE
diff --git a/lifecycle/compiler/src/tests/test-data/InheritanceOk1.java b/lifecycle/lifecycle-compiler/src/tests/test-data/InheritanceOk1.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/InheritanceOk1.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/InheritanceOk1.java
diff --git a/lifecycle/compiler/src/tests/test-data/InheritanceOk2.java b/lifecycle/lifecycle-compiler/src/tests/test-data/InheritanceOk2.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/InheritanceOk2.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/InheritanceOk2.java
diff --git a/lifecycle/compiler/src/tests/test-data/InheritanceOk3.java b/lifecycle/lifecycle-compiler/src/tests/test-data/InheritanceOk3.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/InheritanceOk3.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/InheritanceOk3.java
diff --git a/lifecycle/compiler/src/tests/test-data/InterfaceOk1.java b/lifecycle/lifecycle-compiler/src/tests/test-data/InterfaceOk1.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/InterfaceOk1.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/InterfaceOk1.java
diff --git a/lifecycle/compiler/src/tests/test-data/InterfaceOk2.java b/lifecycle/lifecycle-compiler/src/tests/test-data/InterfaceOk2.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/InterfaceOk2.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/InterfaceOk2.java
diff --git a/lifecycle/compiler/src/tests/test-data/InvalidClassModifier.java b/lifecycle/lifecycle-compiler/src/tests/test-data/InvalidClassModifier.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/InvalidClassModifier.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/InvalidClassModifier.java
diff --git a/lifecycle/compiler/src/tests/test-data/InvalidFirstArg1.java b/lifecycle/lifecycle-compiler/src/tests/test-data/InvalidFirstArg1.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/InvalidFirstArg1.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/InvalidFirstArg1.java
diff --git a/lifecycle/compiler/src/tests/test-data/InvalidFirstArg2.java b/lifecycle/lifecycle-compiler/src/tests/test-data/InvalidFirstArg2.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/InvalidFirstArg2.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/InvalidFirstArg2.java
diff --git a/lifecycle/compiler/src/tests/test-data/InvalidInheritance1.java b/lifecycle/lifecycle-compiler/src/tests/test-data/InvalidInheritance1.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/InvalidInheritance1.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/InvalidInheritance1.java
diff --git a/lifecycle/compiler/src/tests/test-data/InvalidInheritance2.java b/lifecycle/lifecycle-compiler/src/tests/test-data/InvalidInheritance2.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/InvalidInheritance2.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/InvalidInheritance2.java
diff --git a/lifecycle/compiler/src/tests/test-data/InvalidMethodModifier.java b/lifecycle/lifecycle-compiler/src/tests/test-data/InvalidMethodModifier.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/InvalidMethodModifier.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/InvalidMethodModifier.java
diff --git a/lifecycle/compiler/src/tests/test-data/InvalidSecondArg.java b/lifecycle/lifecycle-compiler/src/tests/test-data/InvalidSecondArg.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/InvalidSecondArg.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/InvalidSecondArg.java
diff --git a/lifecycle/compiler/src/tests/test-data/NoPackageOk.java b/lifecycle/lifecycle-compiler/src/tests/test-data/NoPackageOk.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/NoPackageOk.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/NoPackageOk.java
diff --git a/lifecycle/compiler/src/tests/test-data/OnAnyMethod.java b/lifecycle/lifecycle-compiler/src/tests/test-data/OnAnyMethod.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/OnAnyMethod.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/OnAnyMethod.java
diff --git a/lifecycle/compiler/src/tests/test-data/TooManyArgs1.java b/lifecycle/lifecycle-compiler/src/tests/test-data/TooManyArgs1.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/TooManyArgs1.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/TooManyArgs1.java
diff --git a/lifecycle/compiler/src/tests/test-data/TooManyArgs2.java b/lifecycle/lifecycle-compiler/src/tests/test-data/TooManyArgs2.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/TooManyArgs2.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/TooManyArgs2.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/DerivedFromJar1_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/DerivedFromJar1_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/DerivedFromJar1_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/DerivedFromJar1_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/DerivedFromJar_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/DerivedFromJar_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/DerivedFromJar_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/DerivedFromJar_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesBase1_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/DifferentPackagesBase1_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesBase1_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/DifferentPackagesBase1_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesBase2_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/DifferentPackagesBase2_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesBase2_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/DifferentPackagesBase2_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesDerived1_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/DifferentPackagesDerived1_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesDerived1_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/DifferentPackagesDerived1_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesDerived2_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/DifferentPackagesDerived2_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/DifferentPackagesDerived2_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/DifferentPackagesDerived2_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/InheritanceOk2Base_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/InheritanceOk2Base_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/InheritanceOk2Base_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/InheritanceOk2Base_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/InheritanceOk2Derived_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/InheritanceOk2Derived_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/InheritanceOk2Derived_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/InheritanceOk2Derived_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/InheritanceOk3Base_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/InheritanceOk3Base_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/InheritanceOk3Base_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/InheritanceOk3Base_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/InheritanceOk3Derived_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/InheritanceOk3Derived_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/InheritanceOk3Derived_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/InheritanceOk3Derived_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/InterfaceOk2Base_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/InterfaceOk2Base_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/InterfaceOk2Base_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/InterfaceOk2Base_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/InterfaceOk2Derived_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/InterfaceOk2Derived_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/InterfaceOk2Derived_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/InterfaceOk2Derived_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/InterfaceOk2Interface_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/InterfaceOk2Interface_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/InterfaceOk2Interface_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/InterfaceOk2Interface_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/ObserverNoAdapter_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/ObserverNoAdapter_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/ObserverNoAdapter_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/ObserverNoAdapter_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/OnAnyMethod_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/OnAnyMethod_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/OnAnyMethod_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/OnAnyMethod_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/expected/license.txt b/lifecycle/lifecycle-compiler/src/tests/test-data/expected/license.txt
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/expected/license.txt
rename to lifecycle/lifecycle-compiler/src/tests/test-data/expected/license.txt
diff --git a/lifecycle/compiler/src/tests/test-data/lib/src/test/library/LibraryBaseObserver.java b/lifecycle/lifecycle-compiler/src/tests/test-data/lib/src/test/library/LibraryBaseObserver.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/lib/src/test/library/LibraryBaseObserver.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/lib/src/test/library/LibraryBaseObserver.java
diff --git a/lifecycle/compiler/src/tests/test-data/lib/src/test/library/LibraryBaseObserver_LifecycleAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/lib/src/test/library/LibraryBaseObserver_LifecycleAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/lib/src/test/library/LibraryBaseObserver_LifecycleAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/lib/src/test/library/LibraryBaseObserver_LifecycleAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/lib/src/test/library/ObserverNoAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/lib/src/test/library/ObserverNoAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/lib/src/test/library/ObserverNoAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/lib/src/test/library/ObserverNoAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/lib/src/test/library/PPObserverNoAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/lib/src/test/library/PPObserverNoAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/lib/src/test/library/PPObserverNoAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/lib/src/test/library/PPObserverNoAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/lib/src/test/library/PPObserverWithAdapter.java b/lifecycle/lifecycle-compiler/src/tests/test-data/lib/src/test/library/PPObserverWithAdapter.java
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/lib/src/test/library/PPObserverWithAdapter.java
rename to lifecycle/lifecycle-compiler/src/tests/test-data/lib/src/test/library/PPObserverWithAdapter.java
diff --git a/lifecycle/compiler/src/tests/test-data/lib/test-library.jar b/lifecycle/lifecycle-compiler/src/tests/test-data/lib/test-library.jar
similarity index 100%
rename from lifecycle/compiler/src/tests/test-data/lib/test-library.jar
rename to lifecycle/lifecycle-compiler/src/tests/test-data/lib/test-library.jar
Binary files differ
diff --git a/lifecycle/extensions/.gitignore b/lifecycle/lifecycle-extensions/.gitignore
similarity index 100%
rename from lifecycle/extensions/.gitignore
rename to lifecycle/lifecycle-extensions/.gitignore
diff --git a/lifecycle/extensions/api/2.0.0.txt b/lifecycle/lifecycle-extensions/api/2.0.0.txt
similarity index 100%
rename from lifecycle/extensions/api/2.0.0.txt
rename to lifecycle/lifecycle-extensions/api/2.0.0.txt
diff --git a/lifecycle/extensions/api/2.1.0-alpha01.txt b/lifecycle/lifecycle-extensions/api/2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/extensions/api/2.1.0-alpha01.txt
rename to lifecycle/lifecycle-extensions/api/2.1.0-alpha01.txt
diff --git a/lifecycle/extensions/api/2.1.0-alpha02.txt b/lifecycle/lifecycle-extensions/api/2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/extensions/api/2.1.0-alpha02.txt
rename to lifecycle/lifecycle-extensions/api/2.1.0-alpha02.txt
diff --git a/lifecycle/extensions/api/2.1.0-alpha03.txt b/lifecycle/lifecycle-extensions/api/2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/extensions/api/2.1.0-alpha03.txt
rename to lifecycle/lifecycle-extensions/api/2.1.0-alpha03.txt
diff --git a/lifecycle/extensions/api/2.1.0-alpha04.txt b/lifecycle/lifecycle-extensions/api/2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/extensions/api/2.1.0-alpha04.txt
rename to lifecycle/lifecycle-extensions/api/2.1.0-alpha04.txt
diff --git a/lifecycle/extensions/api/2.1.0-alpha05.txt b/lifecycle/lifecycle-extensions/api/2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/extensions/api/2.1.0-alpha05.txt
rename to lifecycle/lifecycle-extensions/api/2.1.0-alpha05.txt
diff --git a/lifecycle/extensions/api/2.1.0-beta00.txt b/lifecycle/lifecycle-extensions/api/2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/extensions/api/2.1.0-beta00.txt
rename to lifecycle/lifecycle-extensions/api/2.1.0-beta00.txt
diff --git a/lifecycle/extensions/api/2.1.0-beta01.txt b/lifecycle/lifecycle-extensions/api/2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/extensions/api/2.1.0-beta01.txt
rename to lifecycle/lifecycle-extensions/api/2.1.0-beta01.txt
diff --git a/lifecycle/extensions/api/2.1.0-beta02.txt b/lifecycle/lifecycle-extensions/api/2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/extensions/api/2.1.0-beta02.txt
rename to lifecycle/lifecycle-extensions/api/2.1.0-beta02.txt
diff --git a/lifecycle/extensions/api/2.2.0-alpha01.txt b/lifecycle/lifecycle-extensions/api/2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/extensions/api/2.2.0-alpha01.txt
rename to lifecycle/lifecycle-extensions/api/2.2.0-alpha01.txt
diff --git a/lifecycle/extensions/api/2.2.0-alpha02.txt b/lifecycle/lifecycle-extensions/api/2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/extensions/api/2.2.0-alpha02.txt
rename to lifecycle/lifecycle-extensions/api/2.2.0-alpha02.txt
diff --git a/lifecycle/extensions/api/current.txt b/lifecycle/lifecycle-extensions/api/current.txt
similarity index 100%
rename from lifecycle/extensions/api/current.txt
rename to lifecycle/lifecycle-extensions/api/current.txt
diff --git a/lifecycle/extensions/api/res-2.1.0-alpha01.txt b/lifecycle/lifecycle-extensions/api/res-2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/extensions/api/res-2.1.0-alpha01.txt
rename to lifecycle/lifecycle-extensions/api/res-2.1.0-alpha01.txt
diff --git a/lifecycle/extensions/api/res-2.1.0-alpha02.txt b/lifecycle/lifecycle-extensions/api/res-2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/extensions/api/res-2.1.0-alpha02.txt
rename to lifecycle/lifecycle-extensions/api/res-2.1.0-alpha02.txt
diff --git a/lifecycle/extensions/api/res-2.1.0-alpha03.txt b/lifecycle/lifecycle-extensions/api/res-2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/extensions/api/res-2.1.0-alpha03.txt
rename to lifecycle/lifecycle-extensions/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/extensions/api/res-2.1.0-alpha04.txt b/lifecycle/lifecycle-extensions/api/res-2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/extensions/api/res-2.1.0-alpha04.txt
rename to lifecycle/lifecycle-extensions/api/res-2.1.0-alpha04.txt
diff --git a/lifecycle/extensions/api/res-2.1.0-alpha05.txt b/lifecycle/lifecycle-extensions/api/res-2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/extensions/api/res-2.1.0-alpha05.txt
rename to lifecycle/lifecycle-extensions/api/res-2.1.0-alpha05.txt
diff --git a/lifecycle/extensions/api/res-2.1.0-beta00.txt b/lifecycle/lifecycle-extensions/api/res-2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/extensions/api/res-2.1.0-beta00.txt
rename to lifecycle/lifecycle-extensions/api/res-2.1.0-beta00.txt
diff --git a/lifecycle/extensions/api/res-2.1.0-beta01.txt b/lifecycle/lifecycle-extensions/api/res-2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/extensions/api/res-2.1.0-beta01.txt
rename to lifecycle/lifecycle-extensions/api/res-2.1.0-beta01.txt
diff --git a/lifecycle/extensions/api/res-2.1.0-beta02.txt b/lifecycle/lifecycle-extensions/api/res-2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/extensions/api/res-2.1.0-beta02.txt
rename to lifecycle/lifecycle-extensions/api/res-2.1.0-beta02.txt
diff --git a/lifecycle/extensions/api/res-2.2.0-alpha01.txt b/lifecycle/lifecycle-extensions/api/res-2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/extensions/api/res-2.2.0-alpha01.txt
rename to lifecycle/lifecycle-extensions/api/res-2.2.0-alpha01.txt
diff --git a/lifecycle/extensions/api/res-2.2.0-alpha02.txt b/lifecycle/lifecycle-extensions/api/res-2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/extensions/api/res-2.2.0-alpha02.txt
rename to lifecycle/lifecycle-extensions/api/res-2.2.0-alpha02.txt
diff --git a/lifecycle/extensions/api/restricted_2.0.0.txt b/lifecycle/lifecycle-extensions/api/restricted_2.0.0.txt
similarity index 100%
rename from lifecycle/extensions/api/restricted_2.0.0.txt
rename to lifecycle/lifecycle-extensions/api/restricted_2.0.0.txt
diff --git a/lifecycle/extensions/api/restricted_2.1.0-alpha03.txt b/lifecycle/lifecycle-extensions/api/restricted_2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/extensions/api/restricted_2.1.0-alpha03.txt
rename to lifecycle/lifecycle-extensions/api/restricted_2.1.0-alpha03.txt
diff --git a/lifecycle/extensions/api/restricted_2.1.0-alpha04.txt b/lifecycle/lifecycle-extensions/api/restricted_2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/extensions/api/restricted_2.1.0-alpha04.txt
rename to lifecycle/lifecycle-extensions/api/restricted_2.1.0-alpha04.txt
diff --git a/lifecycle/extensions/api/restricted_2.1.0-alpha05.txt b/lifecycle/lifecycle-extensions/api/restricted_2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/extensions/api/restricted_2.1.0-alpha05.txt
rename to lifecycle/lifecycle-extensions/api/restricted_2.1.0-alpha05.txt
diff --git a/lifecycle/extensions/api/restricted_2.1.0-beta00.txt b/lifecycle/lifecycle-extensions/api/restricted_2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/extensions/api/restricted_2.1.0-beta00.txt
rename to lifecycle/lifecycle-extensions/api/restricted_2.1.0-beta00.txt
diff --git a/lifecycle/extensions/api/restricted_2.1.0-beta01.txt b/lifecycle/lifecycle-extensions/api/restricted_2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/extensions/api/restricted_2.1.0-beta01.txt
rename to lifecycle/lifecycle-extensions/api/restricted_2.1.0-beta01.txt
diff --git a/lifecycle/extensions/api/restricted_2.1.0-beta02.txt b/lifecycle/lifecycle-extensions/api/restricted_2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/extensions/api/restricted_2.1.0-beta02.txt
rename to lifecycle/lifecycle-extensions/api/restricted_2.1.0-beta02.txt
diff --git a/lifecycle/extensions/api/restricted_2.2.0-alpha01.txt b/lifecycle/lifecycle-extensions/api/restricted_2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/extensions/api/restricted_2.2.0-alpha01.txt
rename to lifecycle/lifecycle-extensions/api/restricted_2.2.0-alpha01.txt
diff --git a/lifecycle/extensions/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-extensions/api/restricted_2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/extensions/api/restricted_2.2.0-alpha02.txt
rename to lifecycle/lifecycle-extensions/api/restricted_2.2.0-alpha02.txt
diff --git a/lifecycle/extensions/api/restricted_current.txt b/lifecycle/lifecycle-extensions/api/restricted_current.txt
similarity index 100%
rename from lifecycle/extensions/api/restricted_current.txt
rename to lifecycle/lifecycle-extensions/api/restricted_current.txt
diff --git a/lifecycle/extensions/api_legacy/1.0.0.ignore b/lifecycle/lifecycle-extensions/api_legacy/1.0.0.ignore
similarity index 100%
rename from lifecycle/extensions/api_legacy/1.0.0.ignore
rename to lifecycle/lifecycle-extensions/api_legacy/1.0.0.ignore
diff --git a/lifecycle/extensions/api_legacy/1.0.0.txt b/lifecycle/lifecycle-extensions/api_legacy/1.0.0.txt
similarity index 100%
rename from lifecycle/extensions/api_legacy/1.0.0.txt
rename to lifecycle/lifecycle-extensions/api_legacy/1.0.0.txt
diff --git a/lifecycle/extensions/api_legacy/1.1.0.txt b/lifecycle/lifecycle-extensions/api_legacy/1.1.0.txt
similarity index 100%
rename from lifecycle/extensions/api_legacy/1.1.0.txt
rename to lifecycle/lifecycle-extensions/api_legacy/1.1.0.txt
diff --git a/lifecycle/extensions/api_legacy/current.txt b/lifecycle/lifecycle-extensions/api_legacy/current.txt
similarity index 100%
rename from lifecycle/extensions/api_legacy/current.txt
rename to lifecycle/lifecycle-extensions/api_legacy/current.txt
diff --git a/lifecycle/extensions/build.gradle b/lifecycle/lifecycle-extensions/build.gradle
similarity index 100%
rename from lifecycle/extensions/build.gradle
rename to lifecycle/lifecycle-extensions/build.gradle
diff --git a/lifecycle/extensions/src/androidTest/AndroidManifest.xml b/lifecycle/lifecycle-extensions/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from lifecycle/extensions/src/androidTest/AndroidManifest.xml
rename to lifecycle/lifecycle-extensions/src/androidTest/AndroidManifest.xml
diff --git a/lifecycle/extensions/src/androidTest/java/androidx/lifecycle/EmptyActivity.java b/lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/EmptyActivity.java
similarity index 100%
rename from lifecycle/extensions/src/androidTest/java/androidx/lifecycle/EmptyActivity.java
rename to lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/EmptyActivity.java
diff --git a/lifecycle/extensions/src/androidTest/java/androidx/lifecycle/FragmentLifecycleInActivityTest.java b/lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/FragmentLifecycleInActivityTest.java
similarity index 100%
rename from lifecycle/extensions/src/androidTest/java/androidx/lifecycle/FragmentLifecycleInActivityTest.java
rename to lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/FragmentLifecycleInActivityTest.java
diff --git a/lifecycle/extensions/src/androidTest/java/androidx/lifecycle/FragmentOperationsLifecycleTest.java b/lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/FragmentOperationsLifecycleTest.java
similarity index 96%
rename from lifecycle/extensions/src/androidTest/java/androidx/lifecycle/FragmentOperationsLifecycleTest.java
rename to lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/FragmentOperationsLifecycleTest.java
index 55ae129..ca3a860 100644
--- a/lifecycle/extensions/src/androidTest/java/androidx/lifecycle/FragmentOperationsLifecycleTest.java
+++ b/lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/FragmentOperationsLifecycleTest.java
@@ -28,6 +28,7 @@
import static java.util.Arrays.asList;
+import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.lifecycle.activity.EmptyActivity;
@@ -102,11 +103,11 @@
return observer;
}
- private static class CollectingObserver implements LifecycleObserver {
+ private static class CollectingObserver implements LifecycleEventObserver {
final List<Lifecycle.Event> mCollectedEvents = new ArrayList<>();
- @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
- public void anyEvent(LifecycleOwner owner, Lifecycle.Event event) {
+ @Override
+ public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
mCollectedEvents.add(event);
}
diff --git a/lifecycle/extensions/src/androidTest/java/androidx/lifecycle/ViewModelTest.java b/lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/ViewModelTest.java
similarity index 65%
rename from lifecycle/extensions/src/androidTest/java/androidx/lifecycle/ViewModelTest.java
rename to lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/ViewModelTest.java
index a263822..4e38fe6 100644
--- a/lifecycle/extensions/src/androidTest/java/androidx/lifecycle/ViewModelTest.java
+++ b/lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/ViewModelTest.java
@@ -16,8 +16,6 @@
package androidx.lifecycle;
-import static androidx.lifecycle.Lifecycle.Event.ON_RESUME;
-
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.CoreMatchers.notNullValue;
@@ -25,6 +23,7 @@
import android.app.Instrumentation;
+import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
@@ -62,46 +61,40 @@
final TestViewModel[] fragment2Model = new TestViewModel[1];
final ViewModelActivity[] viewModelActivity = new ViewModelActivity[1];
viewModelActivity[0] = mActivityRule.getActivity();
- mActivityRule.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- ViewModelFragment fragment1 = getFragment(viewModelActivity[0],
- ViewModelActivity.FRAGMENT_TAG_1);
- ViewModelFragment fragment2 = getFragment(viewModelActivity[0],
- ViewModelActivity.FRAGMENT_TAG_2);
- assertThat(fragment1, notNullValue());
- assertThat(fragment2, notNullValue());
- assertThat(fragment1.activityModel, is(fragment2.activityModel));
- assertThat(fragment1.fragmentModel, not(is(fragment2.activityModel)));
- assertThat(mActivityRule.getActivity().activityModel, is(fragment1.activityModel));
- activityModel[0] = mActivityRule.getActivity().activityModel;
- defaultActivityModel[0] = mActivityRule.getActivity().defaultActivityModel;
- assertThat(defaultActivityModel[0], not(is(activityModel[0])));
- fragment1Model[0] = fragment1.fragmentModel;
- fragment2Model[0] = fragment2.fragmentModel;
- }
+ mActivityRule.runOnUiThread(() -> {
+ ViewModelFragment fragment1 = getFragment(viewModelActivity[0],
+ ViewModelActivity.FRAGMENT_TAG_1);
+ ViewModelFragment fragment2 = getFragment(viewModelActivity[0],
+ ViewModelActivity.FRAGMENT_TAG_2);
+ assertThat(fragment1, notNullValue());
+ assertThat(fragment2, notNullValue());
+ assertThat(fragment1.activityModel, is(fragment2.activityModel));
+ assertThat(fragment1.fragmentModel, not(is(fragment2.activityModel)));
+ assertThat(mActivityRule.getActivity().activityModel, is(fragment1.activityModel));
+ activityModel[0] = mActivityRule.getActivity().activityModel;
+ defaultActivityModel[0] = mActivityRule.getActivity().defaultActivityModel;
+ assertThat(defaultActivityModel[0], not(is(activityModel[0])));
+ fragment1Model[0] = fragment1.fragmentModel;
+ fragment2Model[0] = fragment2.fragmentModel;
});
viewModelActivity[0] = recreateActivity();
- mActivityRule.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- ViewModelFragment fragment1 = getFragment(viewModelActivity[0],
- ViewModelActivity.FRAGMENT_TAG_1);
- ViewModelFragment fragment2 = getFragment(viewModelActivity[0],
- ViewModelActivity.FRAGMENT_TAG_2);
- assertThat(fragment1, notNullValue());
- assertThat(fragment2, notNullValue());
+ mActivityRule.runOnUiThread(() -> {
+ ViewModelFragment fragment1 = getFragment(viewModelActivity[0],
+ ViewModelActivity.FRAGMENT_TAG_1);
+ ViewModelFragment fragment2 = getFragment(viewModelActivity[0],
+ ViewModelActivity.FRAGMENT_TAG_2);
+ assertThat(fragment1, notNullValue());
+ assertThat(fragment2, notNullValue());
- assertThat(fragment1.activityModel, is(activityModel[0]));
- assertThat(fragment2.activityModel, is(activityModel[0]));
- assertThat(fragment1.fragmentModel, is(fragment1Model[0]));
- assertThat(fragment2.fragmentModel, is(fragment2Model[0]));
- assertThat(fragment1.defaultActivityModel, is(defaultActivityModel[0]));
- assertThat(fragment2.defaultActivityModel, is(defaultActivityModel[0]));
- assertThat(mActivityRule.getActivity().activityModel, is(activityModel[0]));
- assertThat(mActivityRule.getActivity().defaultActivityModel,
- is(defaultActivityModel[0]));
- }
+ assertThat(fragment1.activityModel, is(activityModel[0]));
+ assertThat(fragment2.activityModel, is(activityModel[0]));
+ assertThat(fragment1.fragmentModel, is(fragment1Model[0]));
+ assertThat(fragment2.fragmentModel, is(fragment2Model[0]));
+ assertThat(fragment1.defaultActivityModel, is(defaultActivityModel[0]));
+ assertThat(fragment2.defaultActivityModel, is(defaultActivityModel[0]));
+ assertThat(mActivityRule.getActivity().activityModel, is(activityModel[0]));
+ assertThat(mActivityRule.getActivity().defaultActivityModel,
+ is(defaultActivityModel[0]));
});
}
@@ -117,10 +110,9 @@
public void testOnClear() throws Throwable {
final ViewModelActivity activity = mActivityRule.getActivity();
final CountDownLatch latch = new CountDownLatch(1);
- final LifecycleObserver observer = new LifecycleObserver() {
- @SuppressWarnings("unused")
- @OnLifecycleEvent(ON_RESUME)
- void onResume() {
+ final LifecycleObserver observer = new DefaultLifecycleObserver() {
+ @Override
+ public void onResume(@NonNull LifecycleOwner owner) {
try {
final FragmentManager manager = activity.getSupportFragmentManager();
Fragment fragment = new Fragment();
@@ -135,12 +127,7 @@
}
};
- mActivityRule.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- activity.getLifecycle().addObserver(observer);
- }
- });
+ mActivityRule.runOnUiThread(() -> activity.getLifecycle().addObserver(observer));
assertThat(latch.await(TIMEOUT, TimeUnit.SECONDS), is(true));
}
@@ -155,12 +142,7 @@
Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
instrumentation.addMonitor(monitor);
final ViewModelActivity previous = mActivityRule.getActivity();
- mActivityRule.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- previous.recreate();
- }
- });
+ mActivityRule.runOnUiThread(() -> previous.recreate());
ViewModelActivity result;
// this guarantee that we will reinstall monitor between notifications about onDestroy
diff --git a/lifecycle/extensions/src/androidTest/java/androidx/lifecycle/ViewModelTestInTransaction.java b/lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/ViewModelTestInTransaction.java
similarity index 100%
rename from lifecycle/extensions/src/androidTest/java/androidx/lifecycle/ViewModelTestInTransaction.java
rename to lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/ViewModelTestInTransaction.java
diff --git a/lifecycle/extensions/src/androidTest/java/androidx/lifecycle/activity/EmptyActivity.java b/lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/activity/EmptyActivity.java
similarity index 100%
rename from lifecycle/extensions/src/androidTest/java/androidx/lifecycle/activity/EmptyActivity.java
rename to lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/activity/EmptyActivity.java
diff --git a/lifecycle/extensions/src/androidTest/java/androidx/lifecycle/activity/FragmentLifecycleActivity.java b/lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/activity/FragmentLifecycleActivity.java
similarity index 88%
rename from lifecycle/extensions/src/androidTest/java/androidx/lifecycle/activity/FragmentLifecycleActivity.java
rename to lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/activity/FragmentLifecycleActivity.java
index 597111d..caf1a05 100644
--- a/lifecycle/extensions/src/androidTest/java/androidx/lifecycle/activity/FragmentLifecycleActivity.java
+++ b/lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/activity/FragmentLifecycleActivity.java
@@ -24,9 +24,8 @@
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Lifecycle;
-import androidx.lifecycle.LifecycleObserver;
+import androidx.lifecycle.LifecycleEventObserver;
import androidx.lifecycle.LifecycleOwner;
-import androidx.lifecycle.OnLifecycleEvent;
import androidx.lifecycle.extensions.test.R;
import java.util.ArrayList;
@@ -41,7 +40,7 @@
private static final String EXTRA_NESTED = "nested";
private final List<Lifecycle.Event> mLoggedEvents = Collections
- .synchronizedList(new ArrayList<Lifecycle.Event>());
+ .synchronizedList(new ArrayList<>());
private LifecycleOwner mObservedOwner;
private final CountDownLatch mDestroyLatch = new CountDownLatch(1);
@@ -97,13 +96,8 @@
public void observe(LifecycleOwner provider) {
mObservedOwner = provider;
- provider.getLifecycle().addObserver(new LifecycleObserver() {
- @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
- public void anyEvent(@SuppressWarnings("unused") LifecycleOwner owner,
- Lifecycle.Event event) {
- mLoggedEvents.add(event);
- }
- });
+ provider.getLifecycle().addObserver(
+ (LifecycleEventObserver) (source, event) -> mLoggedEvents.add(event));
}
public List<Lifecycle.Event> getLoggedEvents() {
diff --git a/lifecycle/extensions/src/androidTest/java/androidx/lifecycle/viewmodeltest/TestViewModel.java b/lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/viewmodeltest/TestViewModel.java
similarity index 100%
rename from lifecycle/extensions/src/androidTest/java/androidx/lifecycle/viewmodeltest/TestViewModel.java
rename to lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/viewmodeltest/TestViewModel.java
diff --git a/lifecycle/extensions/src/androidTest/java/androidx/lifecycle/viewmodeltest/ViewModelActivity.java b/lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/viewmodeltest/ViewModelActivity.java
similarity index 100%
rename from lifecycle/extensions/src/androidTest/java/androidx/lifecycle/viewmodeltest/ViewModelActivity.java
rename to lifecycle/lifecycle-extensions/src/androidTest/java/androidx/lifecycle/viewmodeltest/ViewModelActivity.java
diff --git a/lifecycle/extensions/src/androidTest/res/layout/activity_main.xml b/lifecycle/lifecycle-extensions/src/androidTest/res/layout/activity_main.xml
similarity index 100%
rename from lifecycle/extensions/src/androidTest/res/layout/activity_main.xml
rename to lifecycle/lifecycle-extensions/src/androidTest/res/layout/activity_main.xml
diff --git a/lifecycle/extensions/src/androidTest/res/layout/activity_view_model.xml b/lifecycle/lifecycle-extensions/src/androidTest/res/layout/activity_view_model.xml
similarity index 100%
rename from lifecycle/extensions/src/androidTest/res/layout/activity_view_model.xml
rename to lifecycle/lifecycle-extensions/src/androidTest/res/layout/activity_view_model.xml
diff --git a/lifecycle/extensions/src/main/AndroidManifest.xml b/lifecycle/lifecycle-extensions/src/main/AndroidManifest.xml
similarity index 100%
rename from lifecycle/extensions/src/main/AndroidManifest.xml
rename to lifecycle/lifecycle-extensions/src/main/AndroidManifest.xml
diff --git a/lifecycle/extensions/src/main/java/androidx/lifecycle/ViewModelProviders.java b/lifecycle/lifecycle-extensions/src/main/java/androidx/lifecycle/ViewModelProviders.java
similarity index 100%
rename from lifecycle/extensions/src/main/java/androidx/lifecycle/ViewModelProviders.java
rename to lifecycle/lifecycle-extensions/src/main/java/androidx/lifecycle/ViewModelProviders.java
diff --git a/lifecycle/extensions/src/main/java/androidx/lifecycle/ViewModelStores.java b/lifecycle/lifecycle-extensions/src/main/java/androidx/lifecycle/ViewModelStores.java
similarity index 100%
rename from lifecycle/extensions/src/main/java/androidx/lifecycle/ViewModelStores.java
rename to lifecycle/lifecycle-extensions/src/main/java/androidx/lifecycle/ViewModelStores.java
diff --git a/lifecycle/extensions/src/test/java/androidx/lifecycle/ViewModelProvidersTest.java b/lifecycle/lifecycle-extensions/src/test/java/androidx/lifecycle/ViewModelProvidersTest.java
similarity index 100%
rename from lifecycle/extensions/src/test/java/androidx/lifecycle/ViewModelProvidersTest.java
rename to lifecycle/lifecycle-extensions/src/test/java/androidx/lifecycle/ViewModelProvidersTest.java
diff --git a/lifecycle/livedata-core/ktx/api/2.1.0-alpha01.txt b/lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/2.1.0-alpha01.txt
rename to lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/2.1.0-alpha02.txt b/lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/2.1.0-alpha02.txt
rename to lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-alpha02.txt
diff --git a/lifecycle/livedata-core/ktx/api/2.1.0-alpha03.txt b/lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/2.1.0-alpha03.txt
rename to lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-alpha03.txt
diff --git a/lifecycle/livedata-core/ktx/api/2.1.0-alpha04.txt b/lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/2.1.0-alpha04.txt
rename to lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-alpha04.txt
diff --git a/lifecycle/livedata-core/ktx/api/2.1.0-alpha05.txt b/lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/2.1.0-alpha05.txt
rename to lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-alpha05.txt
diff --git a/lifecycle/livedata-core/ktx/api/2.1.0-beta00.txt b/lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/2.1.0-beta00.txt
rename to lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-beta00.txt
diff --git a/lifecycle/livedata-core/ktx/api/2.1.0-beta01.txt b/lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/2.1.0-beta01.txt
rename to lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-beta01.txt
diff --git a/lifecycle/livedata-core/ktx/api/2.1.0-beta02.txt b/lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/2.1.0-beta02.txt
rename to lifecycle/lifecycle-livedata-core-ktx/api/2.1.0-beta02.txt
diff --git a/lifecycle/livedata-core/ktx/api/2.2.0-alpha01.txt b/lifecycle/lifecycle-livedata-core-ktx/api/2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/2.2.0-alpha01.txt
rename to lifecycle/lifecycle-livedata-core-ktx/api/2.2.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/2.2.0-alpha02.txt b/lifecycle/lifecycle-livedata-core-ktx/api/2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/2.2.0-alpha02.txt
rename to lifecycle/lifecycle-livedata-core-ktx/api/2.2.0-alpha02.txt
diff --git a/lifecycle/livedata-core/ktx/api/current.txt b/lifecycle/lifecycle-livedata-core-ktx/api/current.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/current.txt
rename to lifecycle/lifecycle-livedata-core-ktx/api/current.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha01.txt b/lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-alpha01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha01.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha02.txt b/lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-alpha02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha02.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-alpha02.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha03.txt b/lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-alpha03.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha03.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha04.txt b/lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-alpha04.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha04.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-alpha04.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha05.txt b/lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-alpha05.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha05.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-alpha05.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-beta00.txt b/lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-beta00.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-beta00.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-beta00.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-beta01.txt b/lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-beta01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-beta01.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-beta01.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-beta02.txt b/lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-beta02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-beta02.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/res-2.1.0-beta02.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.2.0-alpha01.txt b/lifecycle/lifecycle-livedata-core-ktx/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.2.0-alpha01.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/res-2.2.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.2.0-alpha02.txt b/lifecycle/lifecycle-livedata-core-ktx/api/res-2.2.0-alpha02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.2.0-alpha02.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/res-2.2.0-alpha02.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha03.txt b/lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.1.0-alpha03.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha03.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.1.0-alpha03.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha04.txt b/lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.1.0-alpha04.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha04.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.1.0-alpha04.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha05.txt b/lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.1.0-alpha05.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha05.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.1.0-alpha05.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta00.txt b/lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.1.0-beta00.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta00.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.1.0-beta00.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta01.txt b/lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.1.0-beta01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta01.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.1.0-beta01.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta02.txt b/lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.1.0-beta02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta02.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.1.0-beta02.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha01.txt b/lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.2.0-alpha01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha01.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.2.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.2.0-alpha02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha02.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/restricted_2.2.0-alpha02.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_current.txt b/lifecycle/lifecycle-livedata-core-ktx/api/restricted_current.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_current.txt
copy to lifecycle/lifecycle-livedata-core-ktx/api/restricted_current.txt
diff --git a/lifecycle/livedata-core/ktx/build.gradle b/lifecycle/lifecycle-livedata-core-ktx/build.gradle
similarity index 100%
rename from lifecycle/livedata-core/ktx/build.gradle
rename to lifecycle/lifecycle-livedata-core-ktx/build.gradle
diff --git a/lifecycle/livedata-core/ktx/src/main/AndroidManifest.xml b/lifecycle/lifecycle-livedata-core-ktx/src/main/AndroidManifest.xml
similarity index 100%
rename from lifecycle/livedata-core/ktx/src/main/AndroidManifest.xml
rename to lifecycle/lifecycle-livedata-core-ktx/src/main/AndroidManifest.xml
diff --git a/lifecycle/livedata-core/ktx/src/main/java/androidx/lifecycle/LiveData.kt b/lifecycle/lifecycle-livedata-core-ktx/src/main/java/androidx/lifecycle/LiveData.kt
similarity index 100%
rename from lifecycle/livedata-core/ktx/src/main/java/androidx/lifecycle/LiveData.kt
rename to lifecycle/lifecycle-livedata-core-ktx/src/main/java/androidx/lifecycle/LiveData.kt
diff --git a/lifecycle/livedata-core/ktx/src/test/java/androidx/lifecycle/LiveDataTest.kt b/lifecycle/lifecycle-livedata-core-ktx/src/test/java/androidx/lifecycle/LiveDataTest.kt
similarity index 100%
rename from lifecycle/livedata-core/ktx/src/test/java/androidx/lifecycle/LiveDataTest.kt
rename to lifecycle/lifecycle-livedata-core-ktx/src/test/java/androidx/lifecycle/LiveDataTest.kt
diff --git a/lifecycle/livedata-core/api/2.0.0.txt b/lifecycle/lifecycle-livedata-core/api/2.0.0.txt
similarity index 100%
rename from lifecycle/livedata-core/api/2.0.0.txt
rename to lifecycle/lifecycle-livedata-core/api/2.0.0.txt
diff --git a/lifecycle/livedata-core/api/2.1.0-alpha01.txt b/lifecycle/lifecycle-livedata-core/api/2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata-core/api/2.1.0-alpha01.txt
rename to lifecycle/lifecycle-livedata-core/api/2.1.0-alpha01.txt
diff --git a/lifecycle/livedata-core/api/2.1.0-alpha02.txt b/lifecycle/lifecycle-livedata-core/api/2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata-core/api/2.1.0-alpha02.txt
rename to lifecycle/lifecycle-livedata-core/api/2.1.0-alpha02.txt
diff --git a/lifecycle/livedata-core/api/2.1.0-alpha03.txt b/lifecycle/lifecycle-livedata-core/api/2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/livedata-core/api/2.1.0-alpha03.txt
rename to lifecycle/lifecycle-livedata-core/api/2.1.0-alpha03.txt
diff --git a/lifecycle/livedata-core/api/2.1.0-alpha04.txt b/lifecycle/lifecycle-livedata-core/api/2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/livedata-core/api/2.1.0-alpha04.txt
rename to lifecycle/lifecycle-livedata-core/api/2.1.0-alpha04.txt
diff --git a/lifecycle/livedata-core/api/2.1.0-alpha05.txt b/lifecycle/lifecycle-livedata-core/api/2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/livedata-core/api/2.1.0-alpha05.txt
rename to lifecycle/lifecycle-livedata-core/api/2.1.0-alpha05.txt
diff --git a/lifecycle/livedata-core/api/2.1.0-beta00.txt b/lifecycle/lifecycle-livedata-core/api/2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/livedata-core/api/2.1.0-beta00.txt
rename to lifecycle/lifecycle-livedata-core/api/2.1.0-beta00.txt
diff --git a/lifecycle/livedata-core/api/2.1.0-beta01.txt b/lifecycle/lifecycle-livedata-core/api/2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/livedata-core/api/2.1.0-beta01.txt
rename to lifecycle/lifecycle-livedata-core/api/2.1.0-beta01.txt
diff --git a/lifecycle/livedata-core/api/2.1.0-beta02.txt b/lifecycle/lifecycle-livedata-core/api/2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/livedata-core/api/2.1.0-beta02.txt
rename to lifecycle/lifecycle-livedata-core/api/2.1.0-beta02.txt
diff --git a/lifecycle/livedata-core/api/2.2.0-alpha01.txt b/lifecycle/lifecycle-livedata-core/api/2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata-core/api/2.2.0-alpha01.txt
rename to lifecycle/lifecycle-livedata-core/api/2.2.0-alpha01.txt
diff --git a/lifecycle/livedata-core/api/2.2.0-alpha02.txt b/lifecycle/lifecycle-livedata-core/api/2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata-core/api/2.2.0-alpha02.txt
rename to lifecycle/lifecycle-livedata-core/api/2.2.0-alpha02.txt
diff --git a/lifecycle/livedata-core/api/current.txt b/lifecycle/lifecycle-livedata-core/api/current.txt
similarity index 100%
rename from lifecycle/livedata-core/api/current.txt
rename to lifecycle/lifecycle-livedata-core/api/current.txt
diff --git a/lifecycle/livedata-core/api/res-2.1.0-alpha01.txt b/lifecycle/lifecycle-livedata-core/api/res-2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata-core/api/res-2.1.0-alpha01.txt
rename to lifecycle/lifecycle-livedata-core/api/res-2.1.0-alpha01.txt
diff --git a/lifecycle/livedata-core/api/res-2.1.0-alpha02.txt b/lifecycle/lifecycle-livedata-core/api/res-2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata-core/api/res-2.1.0-alpha02.txt
rename to lifecycle/lifecycle-livedata-core/api/res-2.1.0-alpha02.txt
diff --git a/lifecycle/livedata-core/api/res-2.1.0-alpha03.txt b/lifecycle/lifecycle-livedata-core/api/res-2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/livedata-core/api/res-2.1.0-alpha03.txt
rename to lifecycle/lifecycle-livedata-core/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/livedata-core/api/res-2.1.0-alpha04.txt b/lifecycle/lifecycle-livedata-core/api/res-2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/livedata-core/api/res-2.1.0-alpha04.txt
rename to lifecycle/lifecycle-livedata-core/api/res-2.1.0-alpha04.txt
diff --git a/lifecycle/livedata-core/api/res-2.1.0-alpha05.txt b/lifecycle/lifecycle-livedata-core/api/res-2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/livedata-core/api/res-2.1.0-alpha05.txt
rename to lifecycle/lifecycle-livedata-core/api/res-2.1.0-alpha05.txt
diff --git a/lifecycle/livedata-core/api/res-2.1.0-beta00.txt b/lifecycle/lifecycle-livedata-core/api/res-2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/livedata-core/api/res-2.1.0-beta00.txt
rename to lifecycle/lifecycle-livedata-core/api/res-2.1.0-beta00.txt
diff --git a/lifecycle/livedata-core/api/res-2.1.0-beta01.txt b/lifecycle/lifecycle-livedata-core/api/res-2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/livedata-core/api/res-2.1.0-beta01.txt
rename to lifecycle/lifecycle-livedata-core/api/res-2.1.0-beta01.txt
diff --git a/lifecycle/livedata-core/api/res-2.1.0-beta02.txt b/lifecycle/lifecycle-livedata-core/api/res-2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/livedata-core/api/res-2.1.0-beta02.txt
rename to lifecycle/lifecycle-livedata-core/api/res-2.1.0-beta02.txt
diff --git a/lifecycle/livedata-core/api/res-2.2.0-alpha01.txt b/lifecycle/lifecycle-livedata-core/api/res-2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata-core/api/res-2.2.0-alpha01.txt
rename to lifecycle/lifecycle-livedata-core/api/res-2.2.0-alpha01.txt
diff --git a/lifecycle/livedata-core/api/res-2.2.0-alpha02.txt b/lifecycle/lifecycle-livedata-core/api/res-2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata-core/api/res-2.2.0-alpha02.txt
rename to lifecycle/lifecycle-livedata-core/api/res-2.2.0-alpha02.txt
diff --git a/lifecycle/livedata-core/api/restricted_2.0.0.txt b/lifecycle/lifecycle-livedata-core/api/restricted_2.0.0.txt
similarity index 100%
rename from lifecycle/livedata-core/api/restricted_2.0.0.txt
rename to lifecycle/lifecycle-livedata-core/api/restricted_2.0.0.txt
diff --git a/lifecycle/livedata-core/api/restricted_2.1.0-alpha03.txt b/lifecycle/lifecycle-livedata-core/api/restricted_2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/livedata-core/api/restricted_2.1.0-alpha03.txt
rename to lifecycle/lifecycle-livedata-core/api/restricted_2.1.0-alpha03.txt
diff --git a/lifecycle/livedata-core/api/restricted_2.1.0-alpha04.txt b/lifecycle/lifecycle-livedata-core/api/restricted_2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/livedata-core/api/restricted_2.1.0-alpha04.txt
rename to lifecycle/lifecycle-livedata-core/api/restricted_2.1.0-alpha04.txt
diff --git a/lifecycle/livedata-core/api/restricted_2.1.0-alpha05.txt b/lifecycle/lifecycle-livedata-core/api/restricted_2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/livedata-core/api/restricted_2.1.0-alpha05.txt
rename to lifecycle/lifecycle-livedata-core/api/restricted_2.1.0-alpha05.txt
diff --git a/lifecycle/livedata-core/api/restricted_2.1.0-beta00.txt b/lifecycle/lifecycle-livedata-core/api/restricted_2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/livedata-core/api/restricted_2.1.0-beta00.txt
rename to lifecycle/lifecycle-livedata-core/api/restricted_2.1.0-beta00.txt
diff --git a/lifecycle/livedata-core/api/restricted_2.1.0-beta01.txt b/lifecycle/lifecycle-livedata-core/api/restricted_2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/livedata-core/api/restricted_2.1.0-beta01.txt
rename to lifecycle/lifecycle-livedata-core/api/restricted_2.1.0-beta01.txt
diff --git a/lifecycle/livedata-core/api/restricted_2.1.0-beta02.txt b/lifecycle/lifecycle-livedata-core/api/restricted_2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/livedata-core/api/restricted_2.1.0-beta02.txt
rename to lifecycle/lifecycle-livedata-core/api/restricted_2.1.0-beta02.txt
diff --git a/lifecycle/livedata-core/api/restricted_2.2.0-alpha01.txt b/lifecycle/lifecycle-livedata-core/api/restricted_2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata-core/api/restricted_2.2.0-alpha01.txt
rename to lifecycle/lifecycle-livedata-core/api/restricted_2.2.0-alpha01.txt
diff --git a/lifecycle/livedata-core/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-livedata-core/api/restricted_2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata-core/api/restricted_2.2.0-alpha02.txt
rename to lifecycle/lifecycle-livedata-core/api/restricted_2.2.0-alpha02.txt
diff --git a/lifecycle/livedata-core/api/restricted_current.txt b/lifecycle/lifecycle-livedata-core/api/restricted_current.txt
similarity index 100%
rename from lifecycle/livedata-core/api/restricted_current.txt
rename to lifecycle/lifecycle-livedata-core/api/restricted_current.txt
diff --git a/lifecycle/livedata-core/api_legacy/1.1.0.txt b/lifecycle/lifecycle-livedata-core/api_legacy/1.1.0.txt
similarity index 100%
rename from lifecycle/livedata-core/api_legacy/1.1.0.txt
rename to lifecycle/lifecycle-livedata-core/api_legacy/1.1.0.txt
diff --git a/lifecycle/livedata-core/api_legacy/current.txt b/lifecycle/lifecycle-livedata-core/api_legacy/current.txt
similarity index 100%
rename from lifecycle/livedata-core/api_legacy/current.txt
rename to lifecycle/lifecycle-livedata-core/api_legacy/current.txt
diff --git a/lifecycle/livedata-core/build.gradle b/lifecycle/lifecycle-livedata-core/build.gradle
similarity index 100%
rename from lifecycle/livedata-core/build.gradle
rename to lifecycle/lifecycle-livedata-core/build.gradle
diff --git a/lifecycle/livedata-core/src/main/AndroidManifest.xml b/lifecycle/lifecycle-livedata-core/src/main/AndroidManifest.xml
similarity index 100%
rename from lifecycle/livedata-core/src/main/AndroidManifest.xml
rename to lifecycle/lifecycle-livedata-core/src/main/AndroidManifest.xml
diff --git a/lifecycle/livedata-core/src/main/java/androidx/lifecycle/LiveData.java b/lifecycle/lifecycle-livedata-core/src/main/java/androidx/lifecycle/LiveData.java
similarity index 100%
rename from lifecycle/livedata-core/src/main/java/androidx/lifecycle/LiveData.java
rename to lifecycle/lifecycle-livedata-core/src/main/java/androidx/lifecycle/LiveData.java
diff --git a/lifecycle/livedata-core/src/main/java/androidx/lifecycle/MutableLiveData.java b/lifecycle/lifecycle-livedata-core/src/main/java/androidx/lifecycle/MutableLiveData.java
similarity index 100%
rename from lifecycle/livedata-core/src/main/java/androidx/lifecycle/MutableLiveData.java
rename to lifecycle/lifecycle-livedata-core/src/main/java/androidx/lifecycle/MutableLiveData.java
diff --git a/lifecycle/livedata-core/src/main/java/androidx/lifecycle/Observer.java b/lifecycle/lifecycle-livedata-core/src/main/java/androidx/lifecycle/Observer.java
similarity index 100%
rename from lifecycle/livedata-core/src/main/java/androidx/lifecycle/Observer.java
rename to lifecycle/lifecycle-livedata-core/src/main/java/androidx/lifecycle/Observer.java
diff --git a/lifecycle/livedata-core/src/test/java/androidx/lifecycle/LiveDataTest.java b/lifecycle/lifecycle-livedata-core/src/test/java/androidx/lifecycle/LiveDataTest.java
similarity index 99%
rename from lifecycle/livedata-core/src/test/java/androidx/lifecycle/LiveDataTest.java
rename to lifecycle/lifecycle-livedata-core/src/test/java/androidx/lifecycle/LiveDataTest.java
index f57d864..8098459 100644
--- a/lifecycle/livedata-core/src/test/java/androidx/lifecycle/LiveDataTest.java
+++ b/lifecycle/lifecycle-livedata-core/src/test/java/androidx/lifecycle/LiveDataTest.java
@@ -37,6 +37,7 @@
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
+import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.arch.core.executor.ArchTaskExecutor;
import androidx.arch.core.executor.testing.InstantTaskExecutorRule;
@@ -420,9 +421,9 @@
@Test
public void testDataChangeDuringStateChange() {
mRegistry.handleLifecycleEvent(ON_START);
- mRegistry.addObserver(new LifecycleObserver() {
- @OnLifecycleEvent(ON_STOP)
- public void onStop() {
+ mRegistry.addObserver(new DefaultLifecycleObserver() {
+ @Override
+ public void onStop(@NonNull LifecycleOwner owner) {
// change data in onStop, observer should not be called!
mLiveData.setValue("b");
}
diff --git a/lifecycle/livedata-core/src/test/java/androidx/lifecycle/ThreadedLiveDataTest.java b/lifecycle/lifecycle-livedata-core/src/test/java/androidx/lifecycle/ThreadedLiveDataTest.java
similarity index 100%
rename from lifecycle/livedata-core/src/test/java/androidx/lifecycle/ThreadedLiveDataTest.java
rename to lifecycle/lifecycle-livedata-core/src/test/java/androidx/lifecycle/ThreadedLiveDataTest.java
diff --git a/lifecycle/livedata/ktx/api/2.1.0-alpha01.txt b/lifecycle/lifecycle-livedata-ktx/api/2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata/ktx/api/2.1.0-alpha01.txt
rename to lifecycle/lifecycle-livedata-ktx/api/2.1.0-alpha01.txt
diff --git a/lifecycle/livedata/ktx/api/2.1.0-alpha02.txt b/lifecycle/lifecycle-livedata-ktx/api/2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata/ktx/api/2.1.0-alpha02.txt
rename to lifecycle/lifecycle-livedata-ktx/api/2.1.0-alpha02.txt
diff --git a/lifecycle/livedata/ktx/api/2.1.0-alpha03.txt b/lifecycle/lifecycle-livedata-ktx/api/2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/livedata/ktx/api/2.1.0-alpha03.txt
rename to lifecycle/lifecycle-livedata-ktx/api/2.1.0-alpha03.txt
diff --git a/lifecycle/livedata/ktx/api/2.1.0-alpha04.txt b/lifecycle/lifecycle-livedata-ktx/api/2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/livedata/ktx/api/2.1.0-alpha04.txt
rename to lifecycle/lifecycle-livedata-ktx/api/2.1.0-alpha04.txt
diff --git a/lifecycle/livedata/ktx/api/2.1.0-alpha05.txt b/lifecycle/lifecycle-livedata-ktx/api/2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/livedata/ktx/api/2.1.0-alpha05.txt
rename to lifecycle/lifecycle-livedata-ktx/api/2.1.0-alpha05.txt
diff --git a/lifecycle/livedata/ktx/api/2.1.0-beta00.txt b/lifecycle/lifecycle-livedata-ktx/api/2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/livedata/ktx/api/2.1.0-beta00.txt
rename to lifecycle/lifecycle-livedata-ktx/api/2.1.0-beta00.txt
diff --git a/lifecycle/livedata/ktx/api/2.1.0-beta01.txt b/lifecycle/lifecycle-livedata-ktx/api/2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/livedata/ktx/api/2.1.0-beta01.txt
rename to lifecycle/lifecycle-livedata-ktx/api/2.1.0-beta01.txt
diff --git a/lifecycle/livedata/ktx/api/2.1.0-beta02.txt b/lifecycle/lifecycle-livedata-ktx/api/2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/livedata/ktx/api/2.1.0-beta02.txt
rename to lifecycle/lifecycle-livedata-ktx/api/2.1.0-beta02.txt
diff --git a/lifecycle/livedata/ktx/api/2.2.0-alpha01.txt b/lifecycle/lifecycle-livedata-ktx/api/2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata/ktx/api/2.2.0-alpha01.txt
rename to lifecycle/lifecycle-livedata-ktx/api/2.2.0-alpha01.txt
diff --git a/lifecycle/livedata/ktx/api/2.2.0-alpha02.txt b/lifecycle/lifecycle-livedata-ktx/api/2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata/ktx/api/2.2.0-alpha02.txt
rename to lifecycle/lifecycle-livedata-ktx/api/2.2.0-alpha02.txt
diff --git a/lifecycle/livedata/ktx/api/current.txt b/lifecycle/lifecycle-livedata-ktx/api/current.txt
similarity index 100%
rename from lifecycle/livedata/ktx/api/current.txt
rename to lifecycle/lifecycle-livedata-ktx/api/current.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha01.txt b/lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha01.txt
rename to lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha02.txt b/lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha02.txt
rename to lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-alpha02.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha03.txt b/lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha03.txt
rename to lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha04.txt b/lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha04.txt
rename to lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-alpha04.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha05.txt b/lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha05.txt
rename to lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-alpha05.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-beta00.txt b/lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/res-2.1.0-beta00.txt
rename to lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-beta00.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-beta01.txt b/lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/res-2.1.0-beta01.txt
rename to lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-beta01.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-beta02.txt b/lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/res-2.1.0-beta02.txt
rename to lifecycle/lifecycle-livedata-ktx/api/res-2.1.0-beta02.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.2.0-alpha01.txt b/lifecycle/lifecycle-livedata-ktx/api/res-2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/res-2.2.0-alpha01.txt
rename to lifecycle/lifecycle-livedata-ktx/api/res-2.2.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.2.0-alpha02.txt b/lifecycle/lifecycle-livedata-ktx/api/res-2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/res-2.2.0-alpha02.txt
rename to lifecycle/lifecycle-livedata-ktx/api/res-2.2.0-alpha02.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha03.txt b/lifecycle/lifecycle-livedata-ktx/api/restricted_2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha03.txt
rename to lifecycle/lifecycle-livedata-ktx/api/restricted_2.1.0-alpha03.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha04.txt b/lifecycle/lifecycle-livedata-ktx/api/restricted_2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha04.txt
rename to lifecycle/lifecycle-livedata-ktx/api/restricted_2.1.0-alpha04.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha05.txt b/lifecycle/lifecycle-livedata-ktx/api/restricted_2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha05.txt
rename to lifecycle/lifecycle-livedata-ktx/api/restricted_2.1.0-alpha05.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta00.txt b/lifecycle/lifecycle-livedata-ktx/api/restricted_2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta00.txt
rename to lifecycle/lifecycle-livedata-ktx/api/restricted_2.1.0-beta00.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta01.txt b/lifecycle/lifecycle-livedata-ktx/api/restricted_2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta01.txt
rename to lifecycle/lifecycle-livedata-ktx/api/restricted_2.1.0-beta01.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta02.txt b/lifecycle/lifecycle-livedata-ktx/api/restricted_2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta02.txt
rename to lifecycle/lifecycle-livedata-ktx/api/restricted_2.1.0-beta02.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha01.txt b/lifecycle/lifecycle-livedata-ktx/api/restricted_2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha01.txt
rename to lifecycle/lifecycle-livedata-ktx/api/restricted_2.2.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-livedata-ktx/api/restricted_2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha02.txt
rename to lifecycle/lifecycle-livedata-ktx/api/restricted_2.2.0-alpha02.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_current.txt b/lifecycle/lifecycle-livedata-ktx/api/restricted_current.txt
similarity index 100%
rename from lifecycle/livedata-core/ktx/api/restricted_current.txt
rename to lifecycle/lifecycle-livedata-ktx/api/restricted_current.txt
diff --git a/lifecycle/livedata/ktx/build.gradle b/lifecycle/lifecycle-livedata-ktx/build.gradle
similarity index 100%
rename from lifecycle/livedata/ktx/build.gradle
rename to lifecycle/lifecycle-livedata-ktx/build.gradle
diff --git a/lifecycle/livedata/ktx/src/main/AndroidManifest.xml b/lifecycle/lifecycle-livedata-ktx/src/main/AndroidManifest.xml
similarity index 100%
rename from lifecycle/livedata/ktx/src/main/AndroidManifest.xml
rename to lifecycle/lifecycle-livedata-ktx/src/main/AndroidManifest.xml
diff --git a/lifecycle/livedata/ktx/src/main/java/androidx/lifecycle/CoroutineLiveData.kt b/lifecycle/lifecycle-livedata-ktx/src/main/java/androidx/lifecycle/CoroutineLiveData.kt
similarity index 100%
rename from lifecycle/livedata/ktx/src/main/java/androidx/lifecycle/CoroutineLiveData.kt
rename to lifecycle/lifecycle-livedata-ktx/src/main/java/androidx/lifecycle/CoroutineLiveData.kt
diff --git a/lifecycle/livedata/ktx/src/main/java/androidx/lifecycle/CoroutineLiveDataApi26.kt b/lifecycle/lifecycle-livedata-ktx/src/main/java/androidx/lifecycle/CoroutineLiveDataApi26.kt
similarity index 100%
rename from lifecycle/livedata/ktx/src/main/java/androidx/lifecycle/CoroutineLiveDataApi26.kt
rename to lifecycle/lifecycle-livedata-ktx/src/main/java/androidx/lifecycle/CoroutineLiveDataApi26.kt
diff --git a/lifecycle/livedata/ktx/src/main/java/androidx/lifecycle/Transformations.kt b/lifecycle/lifecycle-livedata-ktx/src/main/java/androidx/lifecycle/Transformations.kt
similarity index 100%
rename from lifecycle/livedata/ktx/src/main/java/androidx/lifecycle/Transformations.kt
rename to lifecycle/lifecycle-livedata-ktx/src/main/java/androidx/lifecycle/Transformations.kt
diff --git a/lifecycle/livedata/ktx/src/test/java/androidx/lifecycle/BuildLiveDataTest.kt b/lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/BuildLiveDataTest.kt
similarity index 100%
rename from lifecycle/livedata/ktx/src/test/java/androidx/lifecycle/BuildLiveDataTest.kt
rename to lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/BuildLiveDataTest.kt
diff --git a/lifecycle/livedata/ktx/src/test/java/androidx/lifecycle/TransformationsTest.kt b/lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/TransformationsTest.kt
similarity index 100%
rename from lifecycle/livedata/ktx/src/test/java/androidx/lifecycle/TransformationsTest.kt
rename to lifecycle/lifecycle-livedata-ktx/src/test/java/androidx/lifecycle/TransformationsTest.kt
diff --git a/lifecycle/livedata/api/2.0.0.txt b/lifecycle/lifecycle-livedata/api/2.0.0.txt
similarity index 100%
rename from lifecycle/livedata/api/2.0.0.txt
rename to lifecycle/lifecycle-livedata/api/2.0.0.txt
diff --git a/lifecycle/livedata/api/2.1.0-alpha01.txt b/lifecycle/lifecycle-livedata/api/2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata/api/2.1.0-alpha01.txt
rename to lifecycle/lifecycle-livedata/api/2.1.0-alpha01.txt
diff --git a/lifecycle/livedata/api/2.1.0-alpha02.txt b/lifecycle/lifecycle-livedata/api/2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata/api/2.1.0-alpha02.txt
rename to lifecycle/lifecycle-livedata/api/2.1.0-alpha02.txt
diff --git a/lifecycle/livedata/api/2.1.0-alpha03.txt b/lifecycle/lifecycle-livedata/api/2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/livedata/api/2.1.0-alpha03.txt
rename to lifecycle/lifecycle-livedata/api/2.1.0-alpha03.txt
diff --git a/lifecycle/livedata/api/2.1.0-alpha04.txt b/lifecycle/lifecycle-livedata/api/2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/livedata/api/2.1.0-alpha04.txt
rename to lifecycle/lifecycle-livedata/api/2.1.0-alpha04.txt
diff --git a/lifecycle/livedata/api/2.1.0-alpha05.txt b/lifecycle/lifecycle-livedata/api/2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/livedata/api/2.1.0-alpha05.txt
rename to lifecycle/lifecycle-livedata/api/2.1.0-alpha05.txt
diff --git a/lifecycle/livedata/api/2.1.0-beta00.txt b/lifecycle/lifecycle-livedata/api/2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/livedata/api/2.1.0-beta00.txt
rename to lifecycle/lifecycle-livedata/api/2.1.0-beta00.txt
diff --git a/lifecycle/livedata/api/2.1.0-beta01.txt b/lifecycle/lifecycle-livedata/api/2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/livedata/api/2.1.0-beta01.txt
rename to lifecycle/lifecycle-livedata/api/2.1.0-beta01.txt
diff --git a/lifecycle/livedata/api/2.1.0-beta02.txt b/lifecycle/lifecycle-livedata/api/2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/livedata/api/2.1.0-beta02.txt
rename to lifecycle/lifecycle-livedata/api/2.1.0-beta02.txt
diff --git a/lifecycle/livedata/api/2.2.0-alpha01.txt b/lifecycle/lifecycle-livedata/api/2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata/api/2.2.0-alpha01.txt
rename to lifecycle/lifecycle-livedata/api/2.2.0-alpha01.txt
diff --git a/lifecycle/livedata/api/2.2.0-alpha02.txt b/lifecycle/lifecycle-livedata/api/2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata/api/2.2.0-alpha02.txt
rename to lifecycle/lifecycle-livedata/api/2.2.0-alpha02.txt
diff --git a/lifecycle/livedata/api/current.txt b/lifecycle/lifecycle-livedata/api/current.txt
similarity index 100%
rename from lifecycle/livedata/api/current.txt
rename to lifecycle/lifecycle-livedata/api/current.txt
diff --git a/lifecycle/livedata/api/res-2.1.0-alpha01.txt b/lifecycle/lifecycle-livedata/api/res-2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata/api/res-2.1.0-alpha01.txt
rename to lifecycle/lifecycle-livedata/api/res-2.1.0-alpha01.txt
diff --git a/lifecycle/livedata/api/res-2.1.0-alpha02.txt b/lifecycle/lifecycle-livedata/api/res-2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata/api/res-2.1.0-alpha02.txt
rename to lifecycle/lifecycle-livedata/api/res-2.1.0-alpha02.txt
diff --git a/lifecycle/livedata/api/res-2.1.0-alpha03.txt b/lifecycle/lifecycle-livedata/api/res-2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/livedata/api/res-2.1.0-alpha03.txt
rename to lifecycle/lifecycle-livedata/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/livedata/api/res-2.1.0-alpha04.txt b/lifecycle/lifecycle-livedata/api/res-2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/livedata/api/res-2.1.0-alpha04.txt
rename to lifecycle/lifecycle-livedata/api/res-2.1.0-alpha04.txt
diff --git a/lifecycle/livedata/api/res-2.1.0-alpha05.txt b/lifecycle/lifecycle-livedata/api/res-2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/livedata/api/res-2.1.0-alpha05.txt
rename to lifecycle/lifecycle-livedata/api/res-2.1.0-alpha05.txt
diff --git a/lifecycle/livedata/api/res-2.1.0-beta00.txt b/lifecycle/lifecycle-livedata/api/res-2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/livedata/api/res-2.1.0-beta00.txt
rename to lifecycle/lifecycle-livedata/api/res-2.1.0-beta00.txt
diff --git a/lifecycle/livedata/api/res-2.1.0-beta01.txt b/lifecycle/lifecycle-livedata/api/res-2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/livedata/api/res-2.1.0-beta01.txt
rename to lifecycle/lifecycle-livedata/api/res-2.1.0-beta01.txt
diff --git a/lifecycle/livedata/api/res-2.1.0-beta02.txt b/lifecycle/lifecycle-livedata/api/res-2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/livedata/api/res-2.1.0-beta02.txt
rename to lifecycle/lifecycle-livedata/api/res-2.1.0-beta02.txt
diff --git a/lifecycle/livedata/api/res-2.2.0-alpha01.txt b/lifecycle/lifecycle-livedata/api/res-2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata/api/res-2.2.0-alpha01.txt
rename to lifecycle/lifecycle-livedata/api/res-2.2.0-alpha01.txt
diff --git a/lifecycle/livedata/api/res-2.2.0-alpha02.txt b/lifecycle/lifecycle-livedata/api/res-2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata/api/res-2.2.0-alpha02.txt
rename to lifecycle/lifecycle-livedata/api/res-2.2.0-alpha02.txt
diff --git a/lifecycle/livedata/api/restricted_2.0.0.txt b/lifecycle/lifecycle-livedata/api/restricted_2.0.0.txt
similarity index 100%
rename from lifecycle/livedata/api/restricted_2.0.0.txt
rename to lifecycle/lifecycle-livedata/api/restricted_2.0.0.txt
diff --git a/lifecycle/livedata/api/restricted_2.1.0-alpha03.txt b/lifecycle/lifecycle-livedata/api/restricted_2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/livedata/api/restricted_2.1.0-alpha03.txt
rename to lifecycle/lifecycle-livedata/api/restricted_2.1.0-alpha03.txt
diff --git a/lifecycle/livedata/api/restricted_2.1.0-alpha04.txt b/lifecycle/lifecycle-livedata/api/restricted_2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/livedata/api/restricted_2.1.0-alpha04.txt
rename to lifecycle/lifecycle-livedata/api/restricted_2.1.0-alpha04.txt
diff --git a/lifecycle/livedata/api/restricted_2.1.0-alpha05.txt b/lifecycle/lifecycle-livedata/api/restricted_2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/livedata/api/restricted_2.1.0-alpha05.txt
rename to lifecycle/lifecycle-livedata/api/restricted_2.1.0-alpha05.txt
diff --git a/lifecycle/livedata/api/restricted_2.1.0-beta00.txt b/lifecycle/lifecycle-livedata/api/restricted_2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/livedata/api/restricted_2.1.0-beta00.txt
rename to lifecycle/lifecycle-livedata/api/restricted_2.1.0-beta00.txt
diff --git a/lifecycle/livedata/api/restricted_2.1.0-beta01.txt b/lifecycle/lifecycle-livedata/api/restricted_2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/livedata/api/restricted_2.1.0-beta01.txt
rename to lifecycle/lifecycle-livedata/api/restricted_2.1.0-beta01.txt
diff --git a/lifecycle/livedata/api/restricted_2.1.0-beta02.txt b/lifecycle/lifecycle-livedata/api/restricted_2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/livedata/api/restricted_2.1.0-beta02.txt
rename to lifecycle/lifecycle-livedata/api/restricted_2.1.0-beta02.txt
diff --git a/lifecycle/livedata/api/restricted_2.2.0-alpha01.txt b/lifecycle/lifecycle-livedata/api/restricted_2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/livedata/api/restricted_2.2.0-alpha01.txt
rename to lifecycle/lifecycle-livedata/api/restricted_2.2.0-alpha01.txt
diff --git a/lifecycle/livedata/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-livedata/api/restricted_2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/livedata/api/restricted_2.2.0-alpha02.txt
rename to lifecycle/lifecycle-livedata/api/restricted_2.2.0-alpha02.txt
diff --git a/lifecycle/livedata/api/restricted_current.txt b/lifecycle/lifecycle-livedata/api/restricted_current.txt
similarity index 100%
rename from lifecycle/livedata/api/restricted_current.txt
rename to lifecycle/lifecycle-livedata/api/restricted_current.txt
diff --git a/lifecycle/livedata/api_legacy/1.1.0.txt b/lifecycle/lifecycle-livedata/api_legacy/1.1.0.txt
similarity index 100%
rename from lifecycle/livedata/api_legacy/1.1.0.txt
rename to lifecycle/lifecycle-livedata/api_legacy/1.1.0.txt
diff --git a/lifecycle/livedata/api_legacy/current.txt b/lifecycle/lifecycle-livedata/api_legacy/current.txt
similarity index 100%
rename from lifecycle/livedata/api_legacy/current.txt
rename to lifecycle/lifecycle-livedata/api_legacy/current.txt
diff --git a/lifecycle/livedata/build.gradle b/lifecycle/lifecycle-livedata/build.gradle
similarity index 100%
rename from lifecycle/livedata/build.gradle
rename to lifecycle/lifecycle-livedata/build.gradle
diff --git a/lifecycle/livedata/eap/api/current.txt b/lifecycle/lifecycle-livedata/eap/api/current.txt
similarity index 100%
rename from lifecycle/livedata/eap/api/current.txt
rename to lifecycle/lifecycle-livedata/eap/api/current.txt
diff --git a/lifecycle/livedata/src/main/AndroidManifest.xml b/lifecycle/lifecycle-livedata/src/main/AndroidManifest.xml
similarity index 100%
rename from lifecycle/livedata/src/main/AndroidManifest.xml
rename to lifecycle/lifecycle-livedata/src/main/AndroidManifest.xml
diff --git a/lifecycle/livedata/src/main/java/androidx/lifecycle/ComputableLiveData.java b/lifecycle/lifecycle-livedata/src/main/java/androidx/lifecycle/ComputableLiveData.java
similarity index 100%
rename from lifecycle/livedata/src/main/java/androidx/lifecycle/ComputableLiveData.java
rename to lifecycle/lifecycle-livedata/src/main/java/androidx/lifecycle/ComputableLiveData.java
diff --git a/lifecycle/livedata/src/main/java/androidx/lifecycle/MediatorLiveData.java b/lifecycle/lifecycle-livedata/src/main/java/androidx/lifecycle/MediatorLiveData.java
similarity index 100%
rename from lifecycle/livedata/src/main/java/androidx/lifecycle/MediatorLiveData.java
rename to lifecycle/lifecycle-livedata/src/main/java/androidx/lifecycle/MediatorLiveData.java
diff --git a/lifecycle/livedata/src/main/java/androidx/lifecycle/Transformations.java b/lifecycle/lifecycle-livedata/src/main/java/androidx/lifecycle/Transformations.java
similarity index 100%
rename from lifecycle/livedata/src/main/java/androidx/lifecycle/Transformations.java
rename to lifecycle/lifecycle-livedata/src/main/java/androidx/lifecycle/Transformations.java
diff --git a/lifecycle/livedata/src/test/java/androidx/lifecycle/ComputableLiveDataTest.java b/lifecycle/lifecycle-livedata/src/test/java/androidx/lifecycle/ComputableLiveDataTest.java
similarity index 100%
rename from lifecycle/livedata/src/test/java/androidx/lifecycle/ComputableLiveDataTest.java
rename to lifecycle/lifecycle-livedata/src/test/java/androidx/lifecycle/ComputableLiveDataTest.java
diff --git a/lifecycle/livedata/src/test/java/androidx/lifecycle/MediatorLiveDataTest.java b/lifecycle/lifecycle-livedata/src/test/java/androidx/lifecycle/MediatorLiveDataTest.java
similarity index 100%
rename from lifecycle/livedata/src/test/java/androidx/lifecycle/MediatorLiveDataTest.java
rename to lifecycle/lifecycle-livedata/src/test/java/androidx/lifecycle/MediatorLiveDataTest.java
diff --git a/lifecycle/livedata/src/test/java/androidx/lifecycle/TransformationsTest.java b/lifecycle/lifecycle-livedata/src/test/java/androidx/lifecycle/TransformationsTest.java
similarity index 100%
rename from lifecycle/livedata/src/test/java/androidx/lifecycle/TransformationsTest.java
rename to lifecycle/lifecycle-livedata/src/test/java/androidx/lifecycle/TransformationsTest.java
diff --git a/lifecycle/livedata/src/test/java/androidx/lifecycle/util/InstantTaskExecutor.java b/lifecycle/lifecycle-livedata/src/test/java/androidx/lifecycle/util/InstantTaskExecutor.java
similarity index 100%
rename from lifecycle/livedata/src/test/java/androidx/lifecycle/util/InstantTaskExecutor.java
rename to lifecycle/lifecycle-livedata/src/test/java/androidx/lifecycle/util/InstantTaskExecutor.java
diff --git a/lifecycle/process/.gitignore b/lifecycle/lifecycle-process/.gitignore
similarity index 100%
rename from lifecycle/process/.gitignore
rename to lifecycle/lifecycle-process/.gitignore
diff --git a/lifecycle/process/api/2.0.0.txt b/lifecycle/lifecycle-process/api/2.0.0.txt
similarity index 100%
rename from lifecycle/process/api/2.0.0.txt
rename to lifecycle/lifecycle-process/api/2.0.0.txt
diff --git a/lifecycle/process/api/2.1.0-alpha01.txt b/lifecycle/lifecycle-process/api/2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/process/api/2.1.0-alpha01.txt
rename to lifecycle/lifecycle-process/api/2.1.0-alpha01.txt
diff --git a/lifecycle/process/api/2.1.0-alpha02.txt b/lifecycle/lifecycle-process/api/2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/process/api/2.1.0-alpha02.txt
rename to lifecycle/lifecycle-process/api/2.1.0-alpha02.txt
diff --git a/lifecycle/process/api/2.1.0-alpha03.txt b/lifecycle/lifecycle-process/api/2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/process/api/2.1.0-alpha03.txt
rename to lifecycle/lifecycle-process/api/2.1.0-alpha03.txt
diff --git a/lifecycle/process/api/2.1.0-alpha04.txt b/lifecycle/lifecycle-process/api/2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/process/api/2.1.0-alpha04.txt
rename to lifecycle/lifecycle-process/api/2.1.0-alpha04.txt
diff --git a/lifecycle/process/api/2.1.0-alpha05.txt b/lifecycle/lifecycle-process/api/2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/process/api/2.1.0-alpha05.txt
rename to lifecycle/lifecycle-process/api/2.1.0-alpha05.txt
diff --git a/lifecycle/process/api/2.1.0-beta00.txt b/lifecycle/lifecycle-process/api/2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/process/api/2.1.0-beta00.txt
rename to lifecycle/lifecycle-process/api/2.1.0-beta00.txt
diff --git a/lifecycle/process/api/2.1.0-beta01.txt b/lifecycle/lifecycle-process/api/2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/process/api/2.1.0-beta01.txt
rename to lifecycle/lifecycle-process/api/2.1.0-beta01.txt
diff --git a/lifecycle/process/api/2.1.0-beta02.txt b/lifecycle/lifecycle-process/api/2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/process/api/2.1.0-beta02.txt
rename to lifecycle/lifecycle-process/api/2.1.0-beta02.txt
diff --git a/lifecycle/process/api/2.2.0-alpha01.txt b/lifecycle/lifecycle-process/api/2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/process/api/2.2.0-alpha01.txt
rename to lifecycle/lifecycle-process/api/2.2.0-alpha01.txt
diff --git a/lifecycle/process/api/2.2.0-alpha02.txt b/lifecycle/lifecycle-process/api/2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/process/api/2.2.0-alpha02.txt
rename to lifecycle/lifecycle-process/api/2.2.0-alpha02.txt
diff --git a/lifecycle/process/api/current.txt b/lifecycle/lifecycle-process/api/current.txt
similarity index 100%
rename from lifecycle/process/api/current.txt
rename to lifecycle/lifecycle-process/api/current.txt
diff --git a/lifecycle/process/api/res-2.1.0-alpha01.txt b/lifecycle/lifecycle-process/api/res-2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/process/api/res-2.1.0-alpha01.txt
rename to lifecycle/lifecycle-process/api/res-2.1.0-alpha01.txt
diff --git a/lifecycle/process/api/res-2.1.0-alpha02.txt b/lifecycle/lifecycle-process/api/res-2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/process/api/res-2.1.0-alpha02.txt
rename to lifecycle/lifecycle-process/api/res-2.1.0-alpha02.txt
diff --git a/lifecycle/process/api/res-2.1.0-alpha03.txt b/lifecycle/lifecycle-process/api/res-2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/process/api/res-2.1.0-alpha03.txt
rename to lifecycle/lifecycle-process/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/process/api/res-2.1.0-alpha04.txt b/lifecycle/lifecycle-process/api/res-2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/process/api/res-2.1.0-alpha04.txt
rename to lifecycle/lifecycle-process/api/res-2.1.0-alpha04.txt
diff --git a/lifecycle/process/api/res-2.1.0-alpha05.txt b/lifecycle/lifecycle-process/api/res-2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/process/api/res-2.1.0-alpha05.txt
rename to lifecycle/lifecycle-process/api/res-2.1.0-alpha05.txt
diff --git a/lifecycle/process/api/res-2.1.0-beta00.txt b/lifecycle/lifecycle-process/api/res-2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/process/api/res-2.1.0-beta00.txt
rename to lifecycle/lifecycle-process/api/res-2.1.0-beta00.txt
diff --git a/lifecycle/process/api/res-2.1.0-beta01.txt b/lifecycle/lifecycle-process/api/res-2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/process/api/res-2.1.0-beta01.txt
rename to lifecycle/lifecycle-process/api/res-2.1.0-beta01.txt
diff --git a/lifecycle/process/api/res-2.1.0-beta02.txt b/lifecycle/lifecycle-process/api/res-2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/process/api/res-2.1.0-beta02.txt
rename to lifecycle/lifecycle-process/api/res-2.1.0-beta02.txt
diff --git a/lifecycle/process/api/res-2.2.0-alpha01.txt b/lifecycle/lifecycle-process/api/res-2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/process/api/res-2.2.0-alpha01.txt
rename to lifecycle/lifecycle-process/api/res-2.2.0-alpha01.txt
diff --git a/lifecycle/process/api/res-2.2.0-alpha02.txt b/lifecycle/lifecycle-process/api/res-2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/process/api/res-2.2.0-alpha02.txt
rename to lifecycle/lifecycle-process/api/res-2.2.0-alpha02.txt
diff --git a/lifecycle/process/api/restricted_2.0.0.txt b/lifecycle/lifecycle-process/api/restricted_2.0.0.txt
similarity index 100%
rename from lifecycle/process/api/restricted_2.0.0.txt
rename to lifecycle/lifecycle-process/api/restricted_2.0.0.txt
diff --git a/lifecycle/process/api/restricted_2.1.0-alpha03.txt b/lifecycle/lifecycle-process/api/restricted_2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/process/api/restricted_2.1.0-alpha03.txt
rename to lifecycle/lifecycle-process/api/restricted_2.1.0-alpha03.txt
diff --git a/lifecycle/process/api/restricted_2.1.0-alpha04.txt b/lifecycle/lifecycle-process/api/restricted_2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/process/api/restricted_2.1.0-alpha04.txt
rename to lifecycle/lifecycle-process/api/restricted_2.1.0-alpha04.txt
diff --git a/lifecycle/process/api/restricted_2.1.0-alpha05.txt b/lifecycle/lifecycle-process/api/restricted_2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/process/api/restricted_2.1.0-alpha05.txt
rename to lifecycle/lifecycle-process/api/restricted_2.1.0-alpha05.txt
diff --git a/lifecycle/process/api/restricted_2.1.0-beta00.txt b/lifecycle/lifecycle-process/api/restricted_2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/process/api/restricted_2.1.0-beta00.txt
rename to lifecycle/lifecycle-process/api/restricted_2.1.0-beta00.txt
diff --git a/lifecycle/process/api/restricted_2.1.0-beta01.txt b/lifecycle/lifecycle-process/api/restricted_2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/process/api/restricted_2.1.0-beta01.txt
rename to lifecycle/lifecycle-process/api/restricted_2.1.0-beta01.txt
diff --git a/lifecycle/process/api/restricted_2.1.0-beta02.txt b/lifecycle/lifecycle-process/api/restricted_2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/process/api/restricted_2.1.0-beta02.txt
rename to lifecycle/lifecycle-process/api/restricted_2.1.0-beta02.txt
diff --git a/lifecycle/process/api/restricted_2.2.0-alpha01.txt b/lifecycle/lifecycle-process/api/restricted_2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/process/api/restricted_2.2.0-alpha01.txt
rename to lifecycle/lifecycle-process/api/restricted_2.2.0-alpha01.txt
diff --git a/lifecycle/process/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-process/api/restricted_2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/process/api/restricted_2.2.0-alpha02.txt
rename to lifecycle/lifecycle-process/api/restricted_2.2.0-alpha02.txt
diff --git a/lifecycle/process/api/restricted_current.txt b/lifecycle/lifecycle-process/api/restricted_current.txt
similarity index 100%
rename from lifecycle/process/api/restricted_current.txt
rename to lifecycle/lifecycle-process/api/restricted_current.txt
diff --git a/lifecycle/process/api_legacy/current.txt b/lifecycle/lifecycle-process/api_legacy/current.txt
similarity index 100%
rename from lifecycle/process/api_legacy/current.txt
rename to lifecycle/lifecycle-process/api_legacy/current.txt
diff --git a/lifecycle/process/build.gradle b/lifecycle/lifecycle-process/build.gradle
similarity index 100%
rename from lifecycle/process/build.gradle
rename to lifecycle/lifecycle-process/build.gradle
diff --git a/lifecycle/process/src/main/AndroidManifest.xml b/lifecycle/lifecycle-process/src/main/AndroidManifest.xml
similarity index 100%
rename from lifecycle/process/src/main/AndroidManifest.xml
rename to lifecycle/lifecycle-process/src/main/AndroidManifest.xml
diff --git a/lifecycle/process/src/main/java/androidx/lifecycle/EmptyActivityLifecycleCallbacks.java b/lifecycle/lifecycle-process/src/main/java/androidx/lifecycle/EmptyActivityLifecycleCallbacks.java
similarity index 100%
rename from lifecycle/process/src/main/java/androidx/lifecycle/EmptyActivityLifecycleCallbacks.java
rename to lifecycle/lifecycle-process/src/main/java/androidx/lifecycle/EmptyActivityLifecycleCallbacks.java
diff --git a/lifecycle/process/src/main/java/androidx/lifecycle/LifecycleDispatcher.java b/lifecycle/lifecycle-process/src/main/java/androidx/lifecycle/LifecycleDispatcher.java
similarity index 100%
rename from lifecycle/process/src/main/java/androidx/lifecycle/LifecycleDispatcher.java
rename to lifecycle/lifecycle-process/src/main/java/androidx/lifecycle/LifecycleDispatcher.java
diff --git a/lifecycle/process/src/main/java/androidx/lifecycle/ProcessLifecycleOwner.java b/lifecycle/lifecycle-process/src/main/java/androidx/lifecycle/ProcessLifecycleOwner.java
similarity index 100%
rename from lifecycle/process/src/main/java/androidx/lifecycle/ProcessLifecycleOwner.java
rename to lifecycle/lifecycle-process/src/main/java/androidx/lifecycle/ProcessLifecycleOwner.java
diff --git a/lifecycle/process/src/main/java/androidx/lifecycle/ProcessLifecycleOwnerInitializer.java b/lifecycle/lifecycle-process/src/main/java/androidx/lifecycle/ProcessLifecycleOwnerInitializer.java
similarity index 100%
rename from lifecycle/process/src/main/java/androidx/lifecycle/ProcessLifecycleOwnerInitializer.java
rename to lifecycle/lifecycle-process/src/main/java/androidx/lifecycle/ProcessLifecycleOwnerInitializer.java
diff --git a/lifecycle/process/src/test/java/androidx/lifecycle/DispatcherActivityCallbackTest.java b/lifecycle/lifecycle-process/src/test/java/androidx/lifecycle/DispatcherActivityCallbackTest.java
similarity index 100%
rename from lifecycle/process/src/test/java/androidx/lifecycle/DispatcherActivityCallbackTest.java
rename to lifecycle/lifecycle-process/src/test/java/androidx/lifecycle/DispatcherActivityCallbackTest.java
diff --git a/lifecycle/reactivestreams/ktx/OWNERS b/lifecycle/lifecycle-reactivestreams-ktx/OWNERS
similarity index 100%
rename from lifecycle/reactivestreams/ktx/OWNERS
rename to lifecycle/lifecycle-reactivestreams-ktx/OWNERS
diff --git a/lifecycle/reactivestreams/ktx/api/2.0.0.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/2.0.0.txt
similarity index 100%
rename from lifecycle/reactivestreams/ktx/api/2.0.0.txt
rename to lifecycle/lifecycle-reactivestreams-ktx/api/2.0.0.txt
diff --git a/lifecycle/reactivestreams/ktx/api/2.1.0-alpha01.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/reactivestreams/ktx/api/2.1.0-alpha01.txt
rename to lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-alpha01.txt
diff --git a/lifecycle/reactivestreams/ktx/api/2.1.0-alpha02.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/reactivestreams/ktx/api/2.1.0-alpha02.txt
rename to lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-alpha02.txt
diff --git a/lifecycle/reactivestreams/ktx/api/2.1.0-alpha03.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/reactivestreams/ktx/api/2.1.0-alpha03.txt
rename to lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-alpha03.txt
diff --git a/lifecycle/reactivestreams/ktx/api/2.1.0-alpha04.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/reactivestreams/ktx/api/2.1.0-alpha04.txt
rename to lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-alpha04.txt
diff --git a/lifecycle/reactivestreams/ktx/api/2.1.0-alpha05.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/reactivestreams/ktx/api/2.1.0-alpha05.txt
rename to lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-alpha05.txt
diff --git a/lifecycle/reactivestreams/ktx/api/2.1.0-beta00.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/reactivestreams/ktx/api/2.1.0-beta00.txt
rename to lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-beta00.txt
diff --git a/lifecycle/reactivestreams/ktx/api/2.1.0-beta01.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/reactivestreams/ktx/api/2.1.0-beta01.txt
rename to lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-beta01.txt
diff --git a/lifecycle/reactivestreams/ktx/api/2.1.0-beta02.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/reactivestreams/ktx/api/2.1.0-beta02.txt
rename to lifecycle/lifecycle-reactivestreams-ktx/api/2.1.0-beta02.txt
diff --git a/lifecycle/reactivestreams/ktx/api/2.2.0-alpha01.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/reactivestreams/ktx/api/2.2.0-alpha01.txt
rename to lifecycle/lifecycle-reactivestreams-ktx/api/2.2.0-alpha01.txt
diff --git a/lifecycle/reactivestreams/ktx/api/2.2.0-alpha02.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/reactivestreams/ktx/api/2.2.0-alpha02.txt
rename to lifecycle/lifecycle-reactivestreams-ktx/api/2.2.0-alpha02.txt
diff --git a/lifecycle/reactivestreams/ktx/api/current.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/current.txt
similarity index 100%
rename from lifecycle/reactivestreams/ktx/api/current.txt
rename to lifecycle/lifecycle-reactivestreams-ktx/api/current.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha01.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-alpha01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha01.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha02.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-alpha02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha02.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-alpha02.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha03.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-alpha03.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha03.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha04.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-alpha04.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha04.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-alpha04.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha05.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-alpha05.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha05.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-alpha05.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-beta00.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-beta00.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-beta00.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-beta00.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-beta01.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-beta01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-beta01.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-beta01.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-beta02.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-beta02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-beta02.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/res-2.1.0-beta02.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.2.0-alpha01.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.2.0-alpha01.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/res-2.2.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.2.0-alpha02.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/res-2.2.0-alpha02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.2.0-alpha02.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/res-2.2.0-alpha02.txt
diff --git a/lifecycle/reactivestreams/ktx/api/restricted_2.0.0.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.0.0.txt
similarity index 100%
rename from lifecycle/reactivestreams/ktx/api/restricted_2.0.0.txt
rename to lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.0.0.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha03.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.1.0-alpha03.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha03.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.1.0-alpha03.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha04.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.1.0-alpha04.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha04.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.1.0-alpha04.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha05.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.1.0-alpha05.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha05.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.1.0-alpha05.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta00.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.1.0-beta00.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta00.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.1.0-beta00.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta01.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.1.0-beta01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta01.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.1.0-beta01.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta02.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.1.0-beta02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta02.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.1.0-beta02.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha01.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.2.0-alpha01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha01.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.2.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.2.0-alpha02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha02.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/restricted_2.2.0-alpha02.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_current.txt b/lifecycle/lifecycle-reactivestreams-ktx/api/restricted_current.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_current.txt
copy to lifecycle/lifecycle-reactivestreams-ktx/api/restricted_current.txt
diff --git a/lifecycle/reactivestreams/ktx/build.gradle b/lifecycle/lifecycle-reactivestreams-ktx/build.gradle
similarity index 100%
rename from lifecycle/reactivestreams/ktx/build.gradle
rename to lifecycle/lifecycle-reactivestreams-ktx/build.gradle
diff --git a/lifecycle/reactivestreams/ktx/src/main/AndroidManifest.xml b/lifecycle/lifecycle-reactivestreams-ktx/src/main/AndroidManifest.xml
similarity index 100%
rename from lifecycle/reactivestreams/ktx/src/main/AndroidManifest.xml
rename to lifecycle/lifecycle-reactivestreams-ktx/src/main/AndroidManifest.xml
diff --git a/lifecycle/reactivestreams/ktx/src/main/java/androidx/lifecycle/LiveDataReactiveSteams.kt b/lifecycle/lifecycle-reactivestreams-ktx/src/main/java/androidx/lifecycle/LiveDataReactiveSteams.kt
similarity index 100%
rename from lifecycle/reactivestreams/ktx/src/main/java/androidx/lifecycle/LiveDataReactiveSteams.kt
rename to lifecycle/lifecycle-reactivestreams-ktx/src/main/java/androidx/lifecycle/LiveDataReactiveSteams.kt
diff --git a/lifecycle/reactivestreams/ktx/src/test/java/androidx/lifecycle/LiveDataReactiveStreamsTest.kt b/lifecycle/lifecycle-reactivestreams-ktx/src/test/java/androidx/lifecycle/LiveDataReactiveStreamsTest.kt
similarity index 100%
rename from lifecycle/reactivestreams/ktx/src/test/java/androidx/lifecycle/LiveDataReactiveStreamsTest.kt
rename to lifecycle/lifecycle-reactivestreams-ktx/src/test/java/androidx/lifecycle/LiveDataReactiveStreamsTest.kt
diff --git a/lifecycle/reactivestreams/.gitignore b/lifecycle/lifecycle-reactivestreams/.gitignore
similarity index 100%
rename from lifecycle/reactivestreams/.gitignore
rename to lifecycle/lifecycle-reactivestreams/.gitignore
diff --git a/lifecycle/reactivestreams/api/2.0.0.txt b/lifecycle/lifecycle-reactivestreams/api/2.0.0.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/2.0.0.txt
rename to lifecycle/lifecycle-reactivestreams/api/2.0.0.txt
diff --git a/lifecycle/reactivestreams/api/2.1.0-alpha01.txt b/lifecycle/lifecycle-reactivestreams/api/2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/2.1.0-alpha01.txt
rename to lifecycle/lifecycle-reactivestreams/api/2.1.0-alpha01.txt
diff --git a/lifecycle/reactivestreams/api/2.1.0-alpha02.txt b/lifecycle/lifecycle-reactivestreams/api/2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/2.1.0-alpha02.txt
rename to lifecycle/lifecycle-reactivestreams/api/2.1.0-alpha02.txt
diff --git a/lifecycle/reactivestreams/api/2.1.0-alpha03.txt b/lifecycle/lifecycle-reactivestreams/api/2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/2.1.0-alpha03.txt
rename to lifecycle/lifecycle-reactivestreams/api/2.1.0-alpha03.txt
diff --git a/lifecycle/reactivestreams/api/2.1.0-alpha04.txt b/lifecycle/lifecycle-reactivestreams/api/2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/2.1.0-alpha04.txt
rename to lifecycle/lifecycle-reactivestreams/api/2.1.0-alpha04.txt
diff --git a/lifecycle/reactivestreams/api/2.1.0-alpha05.txt b/lifecycle/lifecycle-reactivestreams/api/2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/2.1.0-alpha05.txt
rename to lifecycle/lifecycle-reactivestreams/api/2.1.0-alpha05.txt
diff --git a/lifecycle/reactivestreams/api/2.1.0-beta00.txt b/lifecycle/lifecycle-reactivestreams/api/2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/2.1.0-beta00.txt
rename to lifecycle/lifecycle-reactivestreams/api/2.1.0-beta00.txt
diff --git a/lifecycle/reactivestreams/api/2.1.0-beta01.txt b/lifecycle/lifecycle-reactivestreams/api/2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/2.1.0-beta01.txt
rename to lifecycle/lifecycle-reactivestreams/api/2.1.0-beta01.txt
diff --git a/lifecycle/reactivestreams/api/2.1.0-beta02.txt b/lifecycle/lifecycle-reactivestreams/api/2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/2.1.0-beta02.txt
rename to lifecycle/lifecycle-reactivestreams/api/2.1.0-beta02.txt
diff --git a/lifecycle/reactivestreams/api/2.2.0-alpha01.txt b/lifecycle/lifecycle-reactivestreams/api/2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/2.2.0-alpha01.txt
rename to lifecycle/lifecycle-reactivestreams/api/2.2.0-alpha01.txt
diff --git a/lifecycle/reactivestreams/api/2.2.0-alpha02.txt b/lifecycle/lifecycle-reactivestreams/api/2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/2.2.0-alpha02.txt
rename to lifecycle/lifecycle-reactivestreams/api/2.2.0-alpha02.txt
diff --git a/lifecycle/reactivestreams/api/current.txt b/lifecycle/lifecycle-reactivestreams/api/current.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/current.txt
rename to lifecycle/lifecycle-reactivestreams/api/current.txt
diff --git a/lifecycle/reactivestreams/api/res-2.1.0-alpha01.txt b/lifecycle/lifecycle-reactivestreams/api/res-2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/res-2.1.0-alpha01.txt
rename to lifecycle/lifecycle-reactivestreams/api/res-2.1.0-alpha01.txt
diff --git a/lifecycle/reactivestreams/api/res-2.1.0-alpha02.txt b/lifecycle/lifecycle-reactivestreams/api/res-2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/res-2.1.0-alpha02.txt
rename to lifecycle/lifecycle-reactivestreams/api/res-2.1.0-alpha02.txt
diff --git a/lifecycle/reactivestreams/api/res-2.1.0-alpha03.txt b/lifecycle/lifecycle-reactivestreams/api/res-2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/res-2.1.0-alpha03.txt
rename to lifecycle/lifecycle-reactivestreams/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/reactivestreams/api/res-2.1.0-alpha04.txt b/lifecycle/lifecycle-reactivestreams/api/res-2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/res-2.1.0-alpha04.txt
rename to lifecycle/lifecycle-reactivestreams/api/res-2.1.0-alpha04.txt
diff --git a/lifecycle/reactivestreams/api/res-2.1.0-alpha05.txt b/lifecycle/lifecycle-reactivestreams/api/res-2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/res-2.1.0-alpha05.txt
rename to lifecycle/lifecycle-reactivestreams/api/res-2.1.0-alpha05.txt
diff --git a/lifecycle/reactivestreams/api/res-2.1.0-beta00.txt b/lifecycle/lifecycle-reactivestreams/api/res-2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/res-2.1.0-beta00.txt
rename to lifecycle/lifecycle-reactivestreams/api/res-2.1.0-beta00.txt
diff --git a/lifecycle/reactivestreams/api/res-2.1.0-beta01.txt b/lifecycle/lifecycle-reactivestreams/api/res-2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/res-2.1.0-beta01.txt
rename to lifecycle/lifecycle-reactivestreams/api/res-2.1.0-beta01.txt
diff --git a/lifecycle/reactivestreams/api/res-2.1.0-beta02.txt b/lifecycle/lifecycle-reactivestreams/api/res-2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/res-2.1.0-beta02.txt
rename to lifecycle/lifecycle-reactivestreams/api/res-2.1.0-beta02.txt
diff --git a/lifecycle/reactivestreams/api/res-2.2.0-alpha01.txt b/lifecycle/lifecycle-reactivestreams/api/res-2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/res-2.2.0-alpha01.txt
rename to lifecycle/lifecycle-reactivestreams/api/res-2.2.0-alpha01.txt
diff --git a/lifecycle/reactivestreams/api/res-2.2.0-alpha02.txt b/lifecycle/lifecycle-reactivestreams/api/res-2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/res-2.2.0-alpha02.txt
rename to lifecycle/lifecycle-reactivestreams/api/res-2.2.0-alpha02.txt
diff --git a/lifecycle/reactivestreams/api/restricted_2.0.0.txt b/lifecycle/lifecycle-reactivestreams/api/restricted_2.0.0.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/restricted_2.0.0.txt
rename to lifecycle/lifecycle-reactivestreams/api/restricted_2.0.0.txt
diff --git a/lifecycle/reactivestreams/api/restricted_2.1.0-alpha03.txt b/lifecycle/lifecycle-reactivestreams/api/restricted_2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/restricted_2.1.0-alpha03.txt
rename to lifecycle/lifecycle-reactivestreams/api/restricted_2.1.0-alpha03.txt
diff --git a/lifecycle/reactivestreams/api/restricted_2.1.0-alpha04.txt b/lifecycle/lifecycle-reactivestreams/api/restricted_2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/restricted_2.1.0-alpha04.txt
rename to lifecycle/lifecycle-reactivestreams/api/restricted_2.1.0-alpha04.txt
diff --git a/lifecycle/reactivestreams/api/restricted_2.1.0-alpha05.txt b/lifecycle/lifecycle-reactivestreams/api/restricted_2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/restricted_2.1.0-alpha05.txt
rename to lifecycle/lifecycle-reactivestreams/api/restricted_2.1.0-alpha05.txt
diff --git a/lifecycle/reactivestreams/api/restricted_2.1.0-beta00.txt b/lifecycle/lifecycle-reactivestreams/api/restricted_2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/restricted_2.1.0-beta00.txt
rename to lifecycle/lifecycle-reactivestreams/api/restricted_2.1.0-beta00.txt
diff --git a/lifecycle/reactivestreams/api/restricted_2.1.0-beta01.txt b/lifecycle/lifecycle-reactivestreams/api/restricted_2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/restricted_2.1.0-beta01.txt
rename to lifecycle/lifecycle-reactivestreams/api/restricted_2.1.0-beta01.txt
diff --git a/lifecycle/reactivestreams/api/restricted_2.1.0-beta02.txt b/lifecycle/lifecycle-reactivestreams/api/restricted_2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/restricted_2.1.0-beta02.txt
rename to lifecycle/lifecycle-reactivestreams/api/restricted_2.1.0-beta02.txt
diff --git a/lifecycle/reactivestreams/api/restricted_2.2.0-alpha01.txt b/lifecycle/lifecycle-reactivestreams/api/restricted_2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/restricted_2.2.0-alpha01.txt
rename to lifecycle/lifecycle-reactivestreams/api/restricted_2.2.0-alpha01.txt
diff --git a/lifecycle/reactivestreams/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-reactivestreams/api/restricted_2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/restricted_2.2.0-alpha02.txt
rename to lifecycle/lifecycle-reactivestreams/api/restricted_2.2.0-alpha02.txt
diff --git a/lifecycle/reactivestreams/api/restricted_current.txt b/lifecycle/lifecycle-reactivestreams/api/restricted_current.txt
similarity index 100%
rename from lifecycle/reactivestreams/api/restricted_current.txt
rename to lifecycle/lifecycle-reactivestreams/api/restricted_current.txt
diff --git a/lifecycle/reactivestreams/api_legacy/1.0.0.txt b/lifecycle/lifecycle-reactivestreams/api_legacy/1.0.0.txt
similarity index 100%
rename from lifecycle/reactivestreams/api_legacy/1.0.0.txt
rename to lifecycle/lifecycle-reactivestreams/api_legacy/1.0.0.txt
diff --git a/lifecycle/reactivestreams/api_legacy/1.1.0.txt b/lifecycle/lifecycle-reactivestreams/api_legacy/1.1.0.txt
similarity index 100%
rename from lifecycle/reactivestreams/api_legacy/1.1.0.txt
rename to lifecycle/lifecycle-reactivestreams/api_legacy/1.1.0.txt
diff --git a/lifecycle/reactivestreams/api_legacy/current.txt b/lifecycle/lifecycle-reactivestreams/api_legacy/current.txt
similarity index 100%
rename from lifecycle/reactivestreams/api_legacy/current.txt
rename to lifecycle/lifecycle-reactivestreams/api_legacy/current.txt
diff --git a/lifecycle/reactivestreams/build.gradle b/lifecycle/lifecycle-reactivestreams/build.gradle
similarity index 100%
rename from lifecycle/reactivestreams/build.gradle
rename to lifecycle/lifecycle-reactivestreams/build.gradle
diff --git a/lifecycle/reactivestreams/lint-baseline.xml b/lifecycle/lifecycle-reactivestreams/lint-baseline.xml
similarity index 100%
rename from lifecycle/reactivestreams/lint-baseline.xml
rename to lifecycle/lifecycle-reactivestreams/lint-baseline.xml
diff --git a/lifecycle/reactivestreams/src/main/AndroidManifest.xml b/lifecycle/lifecycle-reactivestreams/src/main/AndroidManifest.xml
similarity index 100%
rename from lifecycle/reactivestreams/src/main/AndroidManifest.xml
rename to lifecycle/lifecycle-reactivestreams/src/main/AndroidManifest.xml
diff --git a/lifecycle/reactivestreams/src/main/java/androidx/lifecycle/LiveDataReactiveStreams.java b/lifecycle/lifecycle-reactivestreams/src/main/java/androidx/lifecycle/LiveDataReactiveStreams.java
similarity index 100%
rename from lifecycle/reactivestreams/src/main/java/androidx/lifecycle/LiveDataReactiveStreams.java
rename to lifecycle/lifecycle-reactivestreams/src/main/java/androidx/lifecycle/LiveDataReactiveStreams.java
diff --git a/lifecycle/reactivestreams/src/test/java/androidx/lifecycle/LiveDataReactiveStreamsTest.java b/lifecycle/lifecycle-reactivestreams/src/test/java/androidx/lifecycle/LiveDataReactiveStreamsTest.java
similarity index 100%
rename from lifecycle/reactivestreams/src/test/java/androidx/lifecycle/LiveDataReactiveStreamsTest.java
rename to lifecycle/lifecycle-reactivestreams/src/test/java/androidx/lifecycle/LiveDataReactiveStreamsTest.java
diff --git a/lifecycle/runtime/ktx/lint/build.gradle b/lifecycle/lifecycle-runtime-ktx-lint/build.gradle
similarity index 100%
rename from lifecycle/runtime/ktx/lint/build.gradle
rename to lifecycle/lifecycle-runtime-ktx-lint/build.gradle
diff --git a/lifecycle/runtime/ktx/lint/src/main/java/androidx/lifecycle/lint/LifecycleRuntimeIssueRegistry.kt b/lifecycle/lifecycle-runtime-ktx-lint/src/main/java/androidx/lifecycle/lint/LifecycleRuntimeIssueRegistry.kt
similarity index 100%
rename from lifecycle/runtime/ktx/lint/src/main/java/androidx/lifecycle/lint/LifecycleRuntimeIssueRegistry.kt
rename to lifecycle/lifecycle-runtime-ktx-lint/src/main/java/androidx/lifecycle/lint/LifecycleRuntimeIssueRegistry.kt
diff --git a/lifecycle/runtime/ktx/lint/src/main/java/androidx/lifecycle/lint/LifecycleWhenChecks.kt b/lifecycle/lifecycle-runtime-ktx-lint/src/main/java/androidx/lifecycle/lint/LifecycleWhenChecks.kt
similarity index 100%
rename from lifecycle/runtime/ktx/lint/src/main/java/androidx/lifecycle/lint/LifecycleWhenChecks.kt
rename to lifecycle/lifecycle-runtime-ktx-lint/src/main/java/androidx/lifecycle/lint/LifecycleWhenChecks.kt
diff --git a/lifecycle/runtime/ktx/lint/src/main/resources/META-INF/services/com.android.tools.lint.client.api.IssueRegistry b/lifecycle/lifecycle-runtime-ktx-lint/src/main/resources/META-INF/services/com.android.tools.lint.client.api.IssueRegistry
similarity index 100%
rename from lifecycle/runtime/ktx/lint/src/main/resources/META-INF/services/com.android.tools.lint.client.api.IssueRegistry
rename to lifecycle/lifecycle-runtime-ktx-lint/src/main/resources/META-INF/services/com.android.tools.lint.client.api.IssueRegistry
diff --git a/lifecycle/runtime/ktx/lint/src/test/java/androidx/lifecycle/lint/ApiLintVersionsTest.kt b/lifecycle/lifecycle-runtime-ktx-lint/src/test/java/androidx/lifecycle/lint/ApiLintVersionsTest.kt
similarity index 100%
rename from lifecycle/runtime/ktx/lint/src/test/java/androidx/lifecycle/lint/ApiLintVersionsTest.kt
rename to lifecycle/lifecycle-runtime-ktx-lint/src/test/java/androidx/lifecycle/lint/ApiLintVersionsTest.kt
diff --git a/lifecycle/runtime/ktx/lint/src/test/java/androidx/lifecycle/lint/LifecycleWhenChecksTest.kt b/lifecycle/lifecycle-runtime-ktx-lint/src/test/java/androidx/lifecycle/lint/LifecycleWhenChecksTest.kt
similarity index 100%
rename from lifecycle/runtime/ktx/lint/src/test/java/androidx/lifecycle/lint/LifecycleWhenChecksTest.kt
rename to lifecycle/lifecycle-runtime-ktx-lint/src/test/java/androidx/lifecycle/lint/LifecycleWhenChecksTest.kt
diff --git a/lifecycle/runtime/ktx/lint/src/test/java/androidx/lifecycle/lint/WhenMethodsTest.kt b/lifecycle/lifecycle-runtime-ktx-lint/src/test/java/androidx/lifecycle/lint/WhenMethodsTest.kt
similarity index 100%
rename from lifecycle/runtime/ktx/lint/src/test/java/androidx/lifecycle/lint/WhenMethodsTest.kt
rename to lifecycle/lifecycle-runtime-ktx-lint/src/test/java/androidx/lifecycle/lint/WhenMethodsTest.kt
diff --git a/lifecycle/runtime/ktx/lint/src/test/java/androidx/lifecycle/lint/stubs/Stubs.kt b/lifecycle/lifecycle-runtime-ktx-lint/src/test/java/androidx/lifecycle/lint/stubs/Stubs.kt
similarity index 100%
rename from lifecycle/runtime/ktx/lint/src/test/java/androidx/lifecycle/lint/stubs/Stubs.kt
rename to lifecycle/lifecycle-runtime-ktx-lint/src/test/java/androidx/lifecycle/lint/stubs/Stubs.kt
diff --git a/lifecycle/runtime/ktx/api/1.0.0-alpha01.txt b/lifecycle/lifecycle-runtime-ktx/api/1.0.0-alpha01.txt
similarity index 100%
rename from lifecycle/runtime/ktx/api/1.0.0-alpha01.txt
rename to lifecycle/lifecycle-runtime-ktx/api/1.0.0-alpha01.txt
diff --git a/lifecycle/runtime/ktx/api/2.2.0-alpha01.txt b/lifecycle/lifecycle-runtime-ktx/api/2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/runtime/ktx/api/2.2.0-alpha01.txt
rename to lifecycle/lifecycle-runtime-ktx/api/2.2.0-alpha01.txt
diff --git a/lifecycle/runtime/ktx/api/2.2.0-alpha02.txt b/lifecycle/lifecycle-runtime-ktx/api/2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/runtime/ktx/api/2.2.0-alpha02.txt
rename to lifecycle/lifecycle-runtime-ktx/api/2.2.0-alpha02.txt
diff --git a/lifecycle/runtime/ktx/api/current.txt b/lifecycle/lifecycle-runtime-ktx/api/current.txt
similarity index 100%
rename from lifecycle/runtime/ktx/api/current.txt
rename to lifecycle/lifecycle-runtime-ktx/api/current.txt
diff --git a/lifecycle/runtime/ktx/api/res-1.0.0-alpha01.txt b/lifecycle/lifecycle-runtime-ktx/api/res-1.0.0-alpha01.txt
similarity index 100%
rename from lifecycle/runtime/ktx/api/res-1.0.0-alpha01.txt
rename to lifecycle/lifecycle-runtime-ktx/api/res-1.0.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.2.0-alpha01.txt b/lifecycle/lifecycle-runtime-ktx/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.2.0-alpha01.txt
copy to lifecycle/lifecycle-runtime-ktx/api/res-2.2.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.2.0-alpha02.txt b/lifecycle/lifecycle-runtime-ktx/api/res-2.2.0-alpha02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.2.0-alpha02.txt
copy to lifecycle/lifecycle-runtime-ktx/api/res-2.2.0-alpha02.txt
diff --git a/lifecycle/runtime/ktx/api/restricted_1.0.0-alpha01.txt b/lifecycle/lifecycle-runtime-ktx/api/restricted_1.0.0-alpha01.txt
similarity index 100%
rename from lifecycle/runtime/ktx/api/restricted_1.0.0-alpha01.txt
rename to lifecycle/lifecycle-runtime-ktx/api/restricted_1.0.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha01.txt b/lifecycle/lifecycle-runtime-ktx/api/restricted_2.2.0-alpha01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha01.txt
copy to lifecycle/lifecycle-runtime-ktx/api/restricted_2.2.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-runtime-ktx/api/restricted_2.2.0-alpha02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha02.txt
copy to lifecycle/lifecycle-runtime-ktx/api/restricted_2.2.0-alpha02.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_current.txt b/lifecycle/lifecycle-runtime-ktx/api/restricted_current.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_current.txt
copy to lifecycle/lifecycle-runtime-ktx/api/restricted_current.txt
diff --git a/lifecycle/runtime/ktx/build.gradle b/lifecycle/lifecycle-runtime-ktx/build.gradle
similarity index 100%
rename from lifecycle/runtime/ktx/build.gradle
rename to lifecycle/lifecycle-runtime-ktx/build.gradle
diff --git a/lifecycle/runtime/ktx/src/androidTest/java/androidx/lifecycle/Expectations.kt b/lifecycle/lifecycle-runtime-ktx/src/androidTest/java/androidx/lifecycle/Expectations.kt
similarity index 100%
rename from lifecycle/runtime/ktx/src/androidTest/java/androidx/lifecycle/Expectations.kt
rename to lifecycle/lifecycle-runtime-ktx/src/androidTest/java/androidx/lifecycle/Expectations.kt
diff --git a/lifecycle/runtime/ktx/src/androidTest/java/androidx/lifecycle/FakeLifecycleOwner.kt b/lifecycle/lifecycle-runtime-ktx/src/androidTest/java/androidx/lifecycle/FakeLifecycleOwner.kt
similarity index 100%
rename from lifecycle/runtime/ktx/src/androidTest/java/androidx/lifecycle/FakeLifecycleOwner.kt
rename to lifecycle/lifecycle-runtime-ktx/src/androidTest/java/androidx/lifecycle/FakeLifecycleOwner.kt
diff --git a/lifecycle/runtime/ktx/src/androidTest/java/androidx/lifecycle/PausingDispatcherTest.kt b/lifecycle/lifecycle-runtime-ktx/src/androidTest/java/androidx/lifecycle/PausingDispatcherTest.kt
similarity index 100%
rename from lifecycle/runtime/ktx/src/androidTest/java/androidx/lifecycle/PausingDispatcherTest.kt
rename to lifecycle/lifecycle-runtime-ktx/src/androidTest/java/androidx/lifecycle/PausingDispatcherTest.kt
diff --git a/lifecycle/runtime/ktx/src/androidTest/java/androidx/lifecycle/TaskTracker.kt b/lifecycle/lifecycle-runtime-ktx/src/androidTest/java/androidx/lifecycle/TaskTracker.kt
similarity index 100%
rename from lifecycle/runtime/ktx/src/androidTest/java/androidx/lifecycle/TaskTracker.kt
rename to lifecycle/lifecycle-runtime-ktx/src/androidTest/java/androidx/lifecycle/TaskTracker.kt
diff --git a/lifecycle/runtime/ktx/src/androidTest/java/androidx/lifecycle/TrackedExecutor.kt b/lifecycle/lifecycle-runtime-ktx/src/androidTest/java/androidx/lifecycle/TrackedExecutor.kt
similarity index 100%
rename from lifecycle/runtime/ktx/src/androidTest/java/androidx/lifecycle/TrackedExecutor.kt
rename to lifecycle/lifecycle-runtime-ktx/src/androidTest/java/androidx/lifecycle/TrackedExecutor.kt
diff --git a/lifecycle/runtime/ktx/src/main/AndroidManifest.xml b/lifecycle/lifecycle-runtime-ktx/src/main/AndroidManifest.xml
similarity index 100%
rename from lifecycle/runtime/ktx/src/main/AndroidManifest.xml
rename to lifecycle/lifecycle-runtime-ktx/src/main/AndroidManifest.xml
diff --git a/lifecycle/runtime/ktx/src/main/java/androidx/lifecycle/DispatchQueue.kt b/lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/DispatchQueue.kt
similarity index 100%
rename from lifecycle/runtime/ktx/src/main/java/androidx/lifecycle/DispatchQueue.kt
rename to lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/DispatchQueue.kt
diff --git a/lifecycle/runtime/ktx/src/main/java/androidx/lifecycle/Lifecycle.kt b/lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/Lifecycle.kt
similarity index 100%
rename from lifecycle/runtime/ktx/src/main/java/androidx/lifecycle/Lifecycle.kt
rename to lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/Lifecycle.kt
diff --git a/lifecycle/runtime/ktx/src/main/java/androidx/lifecycle/LifecycleController.kt b/lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/LifecycleController.kt
similarity index 100%
rename from lifecycle/runtime/ktx/src/main/java/androidx/lifecycle/LifecycleController.kt
rename to lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/LifecycleController.kt
diff --git a/lifecycle/runtime/ktx/src/main/java/androidx/lifecycle/LifecycleOwner.kt b/lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/LifecycleOwner.kt
similarity index 100%
rename from lifecycle/runtime/ktx/src/main/java/androidx/lifecycle/LifecycleOwner.kt
rename to lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/LifecycleOwner.kt
diff --git a/lifecycle/runtime/ktx/src/main/java/androidx/lifecycle/PausingDispatcher.kt b/lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/PausingDispatcher.kt
similarity index 100%
rename from lifecycle/runtime/ktx/src/main/java/androidx/lifecycle/PausingDispatcher.kt
rename to lifecycle/lifecycle-runtime-ktx/src/main/java/androidx/lifecycle/PausingDispatcher.kt
diff --git a/lifecycle/runtime/.gitignore b/lifecycle/lifecycle-runtime/.gitignore
similarity index 100%
rename from lifecycle/runtime/.gitignore
rename to lifecycle/lifecycle-runtime/.gitignore
diff --git a/lifecycle/runtime/api/2.0.0.txt b/lifecycle/lifecycle-runtime/api/2.0.0.txt
similarity index 100%
rename from lifecycle/runtime/api/2.0.0.txt
rename to lifecycle/lifecycle-runtime/api/2.0.0.txt
diff --git a/lifecycle/runtime/api/2.1.0-alpha01.txt b/lifecycle/lifecycle-runtime/api/2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/runtime/api/2.1.0-alpha01.txt
rename to lifecycle/lifecycle-runtime/api/2.1.0-alpha01.txt
diff --git a/lifecycle/runtime/api/2.1.0-alpha02.txt b/lifecycle/lifecycle-runtime/api/2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/runtime/api/2.1.0-alpha02.txt
rename to lifecycle/lifecycle-runtime/api/2.1.0-alpha02.txt
diff --git a/lifecycle/runtime/api/2.1.0-alpha03.txt b/lifecycle/lifecycle-runtime/api/2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/runtime/api/2.1.0-alpha03.txt
rename to lifecycle/lifecycle-runtime/api/2.1.0-alpha03.txt
diff --git a/lifecycle/runtime/api/2.1.0-alpha04.txt b/lifecycle/lifecycle-runtime/api/2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/runtime/api/2.1.0-alpha04.txt
rename to lifecycle/lifecycle-runtime/api/2.1.0-alpha04.txt
diff --git a/lifecycle/runtime/api/2.1.0-alpha05.txt b/lifecycle/lifecycle-runtime/api/2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/runtime/api/2.1.0-alpha05.txt
rename to lifecycle/lifecycle-runtime/api/2.1.0-alpha05.txt
diff --git a/lifecycle/runtime/api/2.1.0-beta00.txt b/lifecycle/lifecycle-runtime/api/2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/runtime/api/2.1.0-beta00.txt
rename to lifecycle/lifecycle-runtime/api/2.1.0-beta00.txt
diff --git a/lifecycle/runtime/api/2.1.0-beta01.txt b/lifecycle/lifecycle-runtime/api/2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/runtime/api/2.1.0-beta01.txt
rename to lifecycle/lifecycle-runtime/api/2.1.0-beta01.txt
diff --git a/lifecycle/runtime/api/2.1.0-beta02.txt b/lifecycle/lifecycle-runtime/api/2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/runtime/api/2.1.0-beta02.txt
rename to lifecycle/lifecycle-runtime/api/2.1.0-beta02.txt
diff --git a/lifecycle/runtime/api/2.2.0-alpha01.txt b/lifecycle/lifecycle-runtime/api/2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/runtime/api/2.2.0-alpha01.txt
rename to lifecycle/lifecycle-runtime/api/2.2.0-alpha01.txt
diff --git a/lifecycle/runtime/api/2.2.0-alpha02.txt b/lifecycle/lifecycle-runtime/api/2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/runtime/api/2.2.0-alpha02.txt
rename to lifecycle/lifecycle-runtime/api/2.2.0-alpha02.txt
diff --git a/lifecycle/runtime/api/current.txt b/lifecycle/lifecycle-runtime/api/current.txt
similarity index 100%
rename from lifecycle/runtime/api/current.txt
rename to lifecycle/lifecycle-runtime/api/current.txt
diff --git a/lifecycle/runtime/api/res-2.1.0-alpha01.txt b/lifecycle/lifecycle-runtime/api/res-2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/runtime/api/res-2.1.0-alpha01.txt
rename to lifecycle/lifecycle-runtime/api/res-2.1.0-alpha01.txt
diff --git a/lifecycle/runtime/api/res-2.1.0-alpha02.txt b/lifecycle/lifecycle-runtime/api/res-2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/runtime/api/res-2.1.0-alpha02.txt
rename to lifecycle/lifecycle-runtime/api/res-2.1.0-alpha02.txt
diff --git a/lifecycle/runtime/api/res-2.1.0-alpha03.txt b/lifecycle/lifecycle-runtime/api/res-2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/runtime/api/res-2.1.0-alpha03.txt
rename to lifecycle/lifecycle-runtime/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/runtime/api/res-2.1.0-alpha04.txt b/lifecycle/lifecycle-runtime/api/res-2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/runtime/api/res-2.1.0-alpha04.txt
rename to lifecycle/lifecycle-runtime/api/res-2.1.0-alpha04.txt
diff --git a/lifecycle/runtime/api/res-2.1.0-alpha05.txt b/lifecycle/lifecycle-runtime/api/res-2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/runtime/api/res-2.1.0-alpha05.txt
rename to lifecycle/lifecycle-runtime/api/res-2.1.0-alpha05.txt
diff --git a/lifecycle/runtime/api/res-2.1.0-beta00.txt b/lifecycle/lifecycle-runtime/api/res-2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/runtime/api/res-2.1.0-beta00.txt
rename to lifecycle/lifecycle-runtime/api/res-2.1.0-beta00.txt
diff --git a/lifecycle/runtime/api/res-2.1.0-beta01.txt b/lifecycle/lifecycle-runtime/api/res-2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/runtime/api/res-2.1.0-beta01.txt
rename to lifecycle/lifecycle-runtime/api/res-2.1.0-beta01.txt
diff --git a/lifecycle/runtime/api/res-2.1.0-beta02.txt b/lifecycle/lifecycle-runtime/api/res-2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/runtime/api/res-2.1.0-beta02.txt
rename to lifecycle/lifecycle-runtime/api/res-2.1.0-beta02.txt
diff --git a/lifecycle/runtime/api/res-2.2.0-alpha01.txt b/lifecycle/lifecycle-runtime/api/res-2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/runtime/api/res-2.2.0-alpha01.txt
rename to lifecycle/lifecycle-runtime/api/res-2.2.0-alpha01.txt
diff --git a/lifecycle/runtime/api/res-2.2.0-alpha02.txt b/lifecycle/lifecycle-runtime/api/res-2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/runtime/api/res-2.2.0-alpha02.txt
rename to lifecycle/lifecycle-runtime/api/res-2.2.0-alpha02.txt
diff --git a/lifecycle/runtime/api/restricted_2.0.0.txt b/lifecycle/lifecycle-runtime/api/restricted_2.0.0.txt
similarity index 100%
rename from lifecycle/runtime/api/restricted_2.0.0.txt
rename to lifecycle/lifecycle-runtime/api/restricted_2.0.0.txt
diff --git a/lifecycle/runtime/api/restricted_2.1.0-alpha03.txt b/lifecycle/lifecycle-runtime/api/restricted_2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/runtime/api/restricted_2.1.0-alpha03.txt
rename to lifecycle/lifecycle-runtime/api/restricted_2.1.0-alpha03.txt
diff --git a/lifecycle/runtime/api/restricted_2.1.0-alpha04.txt b/lifecycle/lifecycle-runtime/api/restricted_2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/runtime/api/restricted_2.1.0-alpha04.txt
rename to lifecycle/lifecycle-runtime/api/restricted_2.1.0-alpha04.txt
diff --git a/lifecycle/runtime/api/restricted_2.1.0-alpha05.txt b/lifecycle/lifecycle-runtime/api/restricted_2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/runtime/api/restricted_2.1.0-alpha05.txt
rename to lifecycle/lifecycle-runtime/api/restricted_2.1.0-alpha05.txt
diff --git a/lifecycle/runtime/api/restricted_2.1.0-beta00.txt b/lifecycle/lifecycle-runtime/api/restricted_2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/runtime/api/restricted_2.1.0-beta00.txt
rename to lifecycle/lifecycle-runtime/api/restricted_2.1.0-beta00.txt
diff --git a/lifecycle/runtime/api/restricted_2.1.0-beta01.txt b/lifecycle/lifecycle-runtime/api/restricted_2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/runtime/api/restricted_2.1.0-beta01.txt
rename to lifecycle/lifecycle-runtime/api/restricted_2.1.0-beta01.txt
diff --git a/lifecycle/runtime/api/restricted_2.1.0-beta02.txt b/lifecycle/lifecycle-runtime/api/restricted_2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/runtime/api/restricted_2.1.0-beta02.txt
rename to lifecycle/lifecycle-runtime/api/restricted_2.1.0-beta02.txt
diff --git a/lifecycle/runtime/api/restricted_2.2.0-alpha01.txt b/lifecycle/lifecycle-runtime/api/restricted_2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/runtime/api/restricted_2.2.0-alpha01.txt
rename to lifecycle/lifecycle-runtime/api/restricted_2.2.0-alpha01.txt
diff --git a/lifecycle/runtime/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-runtime/api/restricted_2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/runtime/api/restricted_2.2.0-alpha02.txt
rename to lifecycle/lifecycle-runtime/api/restricted_2.2.0-alpha02.txt
diff --git a/lifecycle/runtime/api/restricted_current.txt b/lifecycle/lifecycle-runtime/api/restricted_current.txt
similarity index 100%
rename from lifecycle/runtime/api/restricted_current.txt
rename to lifecycle/lifecycle-runtime/api/restricted_current.txt
diff --git a/lifecycle/runtime/api_legacy/0.0.0.txt b/lifecycle/lifecycle-runtime/api_legacy/0.0.0.txt
similarity index 100%
rename from lifecycle/runtime/api_legacy/0.0.0.txt
rename to lifecycle/lifecycle-runtime/api_legacy/0.0.0.txt
diff --git a/lifecycle/runtime/api_legacy/1.0.0.txt b/lifecycle/lifecycle-runtime/api_legacy/1.0.0.txt
similarity index 100%
rename from lifecycle/runtime/api_legacy/1.0.0.txt
rename to lifecycle/lifecycle-runtime/api_legacy/1.0.0.txt
diff --git a/lifecycle/runtime/api_legacy/1.1.0.txt b/lifecycle/lifecycle-runtime/api_legacy/1.1.0.txt
similarity index 100%
rename from lifecycle/runtime/api_legacy/1.1.0.txt
rename to lifecycle/lifecycle-runtime/api_legacy/1.1.0.txt
diff --git a/lifecycle/runtime/api_legacy/current.txt b/lifecycle/lifecycle-runtime/api_legacy/current.txt
similarity index 100%
rename from lifecycle/runtime/api_legacy/current.txt
rename to lifecycle/lifecycle-runtime/api_legacy/current.txt
diff --git a/lifecycle/runtime/build.gradle b/lifecycle/lifecycle-runtime/build.gradle
similarity index 100%
rename from lifecycle/runtime/build.gradle
rename to lifecycle/lifecycle-runtime/build.gradle
diff --git a/lifecycle/runtime/proguard-rules.pro b/lifecycle/lifecycle-runtime/proguard-rules.pro
similarity index 100%
rename from lifecycle/runtime/proguard-rules.pro
rename to lifecycle/lifecycle-runtime/proguard-rules.pro
diff --git a/lifecycle/runtime/src/androidTest/java/androidx/lifecycle/MissingClassTest.java b/lifecycle/lifecycle-runtime/src/androidTest/java/androidx/lifecycle/MissingClassTest.java
similarity index 100%
rename from lifecycle/runtime/src/androidTest/java/androidx/lifecycle/MissingClassTest.java
rename to lifecycle/lifecycle-runtime/src/androidTest/java/androidx/lifecycle/MissingClassTest.java
diff --git a/lifecycle/runtime/src/main/AndroidManifest.xml b/lifecycle/lifecycle-runtime/src/main/AndroidManifest.xml
similarity index 100%
rename from lifecycle/runtime/src/main/AndroidManifest.xml
rename to lifecycle/lifecycle-runtime/src/main/AndroidManifest.xml
diff --git a/lifecycle/runtime/src/main/java/androidx/lifecycle/LifecycleRegistry.java b/lifecycle/lifecycle-runtime/src/main/java/androidx/lifecycle/LifecycleRegistry.java
similarity index 100%
rename from lifecycle/runtime/src/main/java/androidx/lifecycle/LifecycleRegistry.java
rename to lifecycle/lifecycle-runtime/src/main/java/androidx/lifecycle/LifecycleRegistry.java
diff --git a/lifecycle/runtime/src/main/java/androidx/lifecycle/LifecycleRegistryOwner.java b/lifecycle/lifecycle-runtime/src/main/java/androidx/lifecycle/LifecycleRegistryOwner.java
similarity index 100%
rename from lifecycle/runtime/src/main/java/androidx/lifecycle/LifecycleRegistryOwner.java
rename to lifecycle/lifecycle-runtime/src/main/java/androidx/lifecycle/LifecycleRegistryOwner.java
diff --git a/lifecycle/runtime/src/main/java/androidx/lifecycle/ReportFragment.java b/lifecycle/lifecycle-runtime/src/main/java/androidx/lifecycle/ReportFragment.java
similarity index 100%
rename from lifecycle/runtime/src/main/java/androidx/lifecycle/ReportFragment.java
rename to lifecycle/lifecycle-runtime/src/main/java/androidx/lifecycle/ReportFragment.java
diff --git a/lifecycle/runtime/src/test/java/NoPackageObserver.java b/lifecycle/lifecycle-runtime/src/test/java/NoPackageObserver.java
similarity index 100%
rename from lifecycle/runtime/src/test/java/NoPackageObserver.java
rename to lifecycle/lifecycle-runtime/src/test/java/NoPackageObserver.java
diff --git a/lifecycle/runtime/src/test/java/NoPackageTest.java b/lifecycle/lifecycle-runtime/src/test/java/NoPackageTest.java
similarity index 100%
rename from lifecycle/runtime/src/test/java/NoPackageTest.java
rename to lifecycle/lifecycle-runtime/src/test/java/NoPackageTest.java
diff --git a/lifecycle/runtime/src/test/java/androidx/lifecycle/LifecycleRegistryTest.java b/lifecycle/lifecycle-runtime/src/test/java/androidx/lifecycle/LifecycleRegistryTest.java
similarity index 100%
rename from lifecycle/runtime/src/test/java/androidx/lifecycle/LifecycleRegistryTest.java
rename to lifecycle/lifecycle-runtime/src/test/java/androidx/lifecycle/LifecycleRegistryTest.java
diff --git a/lifecycle/savedstate-core/api/res-1.0.0-alpha01.txt b/lifecycle/lifecycle-savedstate-core/api/res-1.0.0-alpha01.txt
similarity index 100%
rename from lifecycle/savedstate-core/api/res-1.0.0-alpha01.txt
rename to lifecycle/lifecycle-savedstate-core/api/res-1.0.0-alpha01.txt
diff --git a/lifecycle/service/.gitignore b/lifecycle/lifecycle-service/.gitignore
similarity index 100%
rename from lifecycle/service/.gitignore
rename to lifecycle/lifecycle-service/.gitignore
diff --git a/lifecycle/service/api/2.0.0.txt b/lifecycle/lifecycle-service/api/2.0.0.txt
similarity index 100%
rename from lifecycle/service/api/2.0.0.txt
rename to lifecycle/lifecycle-service/api/2.0.0.txt
diff --git a/lifecycle/service/api/2.1.0-alpha01.txt b/lifecycle/lifecycle-service/api/2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/service/api/2.1.0-alpha01.txt
rename to lifecycle/lifecycle-service/api/2.1.0-alpha01.txt
diff --git a/lifecycle/service/api/2.1.0-alpha02.txt b/lifecycle/lifecycle-service/api/2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/service/api/2.1.0-alpha02.txt
rename to lifecycle/lifecycle-service/api/2.1.0-alpha02.txt
diff --git a/lifecycle/service/api/2.1.0-alpha03.txt b/lifecycle/lifecycle-service/api/2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/service/api/2.1.0-alpha03.txt
rename to lifecycle/lifecycle-service/api/2.1.0-alpha03.txt
diff --git a/lifecycle/service/api/2.1.0-alpha04.txt b/lifecycle/lifecycle-service/api/2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/service/api/2.1.0-alpha04.txt
rename to lifecycle/lifecycle-service/api/2.1.0-alpha04.txt
diff --git a/lifecycle/service/api/2.1.0-alpha05.txt b/lifecycle/lifecycle-service/api/2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/service/api/2.1.0-alpha05.txt
rename to lifecycle/lifecycle-service/api/2.1.0-alpha05.txt
diff --git a/lifecycle/service/api/2.1.0-beta00.txt b/lifecycle/lifecycle-service/api/2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/service/api/2.1.0-beta00.txt
rename to lifecycle/lifecycle-service/api/2.1.0-beta00.txt
diff --git a/lifecycle/service/api/2.1.0-beta01.txt b/lifecycle/lifecycle-service/api/2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/service/api/2.1.0-beta01.txt
rename to lifecycle/lifecycle-service/api/2.1.0-beta01.txt
diff --git a/lifecycle/service/api/2.1.0-beta02.txt b/lifecycle/lifecycle-service/api/2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/service/api/2.1.0-beta02.txt
rename to lifecycle/lifecycle-service/api/2.1.0-beta02.txt
diff --git a/lifecycle/service/api/2.2.0-alpha01.txt b/lifecycle/lifecycle-service/api/2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/service/api/2.2.0-alpha01.txt
rename to lifecycle/lifecycle-service/api/2.2.0-alpha01.txt
diff --git a/lifecycle/service/api/2.2.0-alpha02.txt b/lifecycle/lifecycle-service/api/2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/service/api/2.2.0-alpha02.txt
rename to lifecycle/lifecycle-service/api/2.2.0-alpha02.txt
diff --git a/lifecycle/service/api/current.txt b/lifecycle/lifecycle-service/api/current.txt
similarity index 100%
rename from lifecycle/service/api/current.txt
rename to lifecycle/lifecycle-service/api/current.txt
diff --git a/lifecycle/service/api/res-2.1.0-alpha01.txt b/lifecycle/lifecycle-service/api/res-2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/service/api/res-2.1.0-alpha01.txt
rename to lifecycle/lifecycle-service/api/res-2.1.0-alpha01.txt
diff --git a/lifecycle/service/api/res-2.1.0-alpha02.txt b/lifecycle/lifecycle-service/api/res-2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/service/api/res-2.1.0-alpha02.txt
rename to lifecycle/lifecycle-service/api/res-2.1.0-alpha02.txt
diff --git a/lifecycle/service/api/res-2.1.0-alpha03.txt b/lifecycle/lifecycle-service/api/res-2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/service/api/res-2.1.0-alpha03.txt
rename to lifecycle/lifecycle-service/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/service/api/res-2.1.0-alpha04.txt b/lifecycle/lifecycle-service/api/res-2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/service/api/res-2.1.0-alpha04.txt
rename to lifecycle/lifecycle-service/api/res-2.1.0-alpha04.txt
diff --git a/lifecycle/service/api/res-2.1.0-alpha05.txt b/lifecycle/lifecycle-service/api/res-2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/service/api/res-2.1.0-alpha05.txt
rename to lifecycle/lifecycle-service/api/res-2.1.0-alpha05.txt
diff --git a/lifecycle/service/api/res-2.1.0-beta00.txt b/lifecycle/lifecycle-service/api/res-2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/service/api/res-2.1.0-beta00.txt
rename to lifecycle/lifecycle-service/api/res-2.1.0-beta00.txt
diff --git a/lifecycle/service/api/res-2.1.0-beta01.txt b/lifecycle/lifecycle-service/api/res-2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/service/api/res-2.1.0-beta01.txt
rename to lifecycle/lifecycle-service/api/res-2.1.0-beta01.txt
diff --git a/lifecycle/service/api/res-2.1.0-beta02.txt b/lifecycle/lifecycle-service/api/res-2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/service/api/res-2.1.0-beta02.txt
rename to lifecycle/lifecycle-service/api/res-2.1.0-beta02.txt
diff --git a/lifecycle/service/api/res-2.2.0-alpha01.txt b/lifecycle/lifecycle-service/api/res-2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/service/api/res-2.2.0-alpha01.txt
rename to lifecycle/lifecycle-service/api/res-2.2.0-alpha01.txt
diff --git a/lifecycle/service/api/res-2.2.0-alpha02.txt b/lifecycle/lifecycle-service/api/res-2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/service/api/res-2.2.0-alpha02.txt
rename to lifecycle/lifecycle-service/api/res-2.2.0-alpha02.txt
diff --git a/lifecycle/service/api/restricted_2.0.0.txt b/lifecycle/lifecycle-service/api/restricted_2.0.0.txt
similarity index 100%
rename from lifecycle/service/api/restricted_2.0.0.txt
rename to lifecycle/lifecycle-service/api/restricted_2.0.0.txt
diff --git a/lifecycle/service/api/restricted_2.1.0-alpha03.txt b/lifecycle/lifecycle-service/api/restricted_2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/service/api/restricted_2.1.0-alpha03.txt
rename to lifecycle/lifecycle-service/api/restricted_2.1.0-alpha03.txt
diff --git a/lifecycle/service/api/restricted_2.1.0-alpha04.txt b/lifecycle/lifecycle-service/api/restricted_2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/service/api/restricted_2.1.0-alpha04.txt
rename to lifecycle/lifecycle-service/api/restricted_2.1.0-alpha04.txt
diff --git a/lifecycle/service/api/restricted_2.1.0-alpha05.txt b/lifecycle/lifecycle-service/api/restricted_2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/service/api/restricted_2.1.0-alpha05.txt
rename to lifecycle/lifecycle-service/api/restricted_2.1.0-alpha05.txt
diff --git a/lifecycle/service/api/restricted_2.1.0-beta00.txt b/lifecycle/lifecycle-service/api/restricted_2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/service/api/restricted_2.1.0-beta00.txt
rename to lifecycle/lifecycle-service/api/restricted_2.1.0-beta00.txt
diff --git a/lifecycle/service/api/restricted_2.1.0-beta01.txt b/lifecycle/lifecycle-service/api/restricted_2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/service/api/restricted_2.1.0-beta01.txt
rename to lifecycle/lifecycle-service/api/restricted_2.1.0-beta01.txt
diff --git a/lifecycle/service/api/restricted_2.1.0-beta02.txt b/lifecycle/lifecycle-service/api/restricted_2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/service/api/restricted_2.1.0-beta02.txt
rename to lifecycle/lifecycle-service/api/restricted_2.1.0-beta02.txt
diff --git a/lifecycle/service/api/restricted_2.2.0-alpha01.txt b/lifecycle/lifecycle-service/api/restricted_2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/service/api/restricted_2.2.0-alpha01.txt
rename to lifecycle/lifecycle-service/api/restricted_2.2.0-alpha01.txt
diff --git a/lifecycle/service/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-service/api/restricted_2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/service/api/restricted_2.2.0-alpha02.txt
rename to lifecycle/lifecycle-service/api/restricted_2.2.0-alpha02.txt
diff --git a/lifecycle/service/api/restricted_current.txt b/lifecycle/lifecycle-service/api/restricted_current.txt
similarity index 100%
rename from lifecycle/service/api/restricted_current.txt
rename to lifecycle/lifecycle-service/api/restricted_current.txt
diff --git a/lifecycle/service/api_legacy/current.txt b/lifecycle/lifecycle-service/api_legacy/current.txt
similarity index 100%
rename from lifecycle/service/api_legacy/current.txt
rename to lifecycle/lifecycle-service/api_legacy/current.txt
diff --git a/lifecycle/service/build.gradle b/lifecycle/lifecycle-service/build.gradle
similarity index 100%
rename from lifecycle/service/build.gradle
rename to lifecycle/lifecycle-service/build.gradle
diff --git a/lifecycle/service/src/androidTest/AndroidManifest.xml b/lifecycle/lifecycle-service/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from lifecycle/service/src/androidTest/AndroidManifest.xml
rename to lifecycle/lifecycle-service/src/androidTest/AndroidManifest.xml
diff --git a/lifecycle/service/src/androidTest/java/androidx/lifecycle/ServiceLifecycleTest.java b/lifecycle/lifecycle-service/src/androidTest/java/androidx/lifecycle/ServiceLifecycleTest.java
similarity index 100%
rename from lifecycle/service/src/androidTest/java/androidx/lifecycle/ServiceLifecycleTest.java
rename to lifecycle/lifecycle-service/src/androidTest/java/androidx/lifecycle/ServiceLifecycleTest.java
diff --git a/lifecycle/service/src/androidTest/java/androidx/lifecycle/service/TestService.java b/lifecycle/lifecycle-service/src/androidTest/java/androidx/lifecycle/service/TestService.java
similarity index 68%
rename from lifecycle/service/src/androidTest/java/androidx/lifecycle/service/TestService.java
rename to lifecycle/lifecycle-service/src/androidTest/java/androidx/lifecycle/service/TestService.java
index afc9dc8..b8d023f 100644
--- a/lifecycle/service/src/androidTest/java/androidx/lifecycle/service/TestService.java
+++ b/lifecycle/lifecycle-service/src/androidTest/java/androidx/lifecycle/service/TestService.java
@@ -22,11 +22,8 @@
import android.os.IBinder;
import androidx.annotation.Nullable;
-import androidx.lifecycle.Lifecycle;
-import androidx.lifecycle.LifecycleObserver;
-import androidx.lifecycle.LifecycleOwner;
+import androidx.lifecycle.LifecycleEventObserver;
import androidx.lifecycle.LifecycleService;
-import androidx.lifecycle.OnLifecycleEvent;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
public class TestService extends LifecycleService {
@@ -37,14 +34,11 @@
private final IBinder mBinder = new Binder();
public TestService() {
- getLifecycle().addObserver(new LifecycleObserver() {
- @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
- public void anyEvent(LifecycleOwner owner, Lifecycle.Event event) {
- Context context = (TestService) owner;
- Intent intent = new Intent(ACTION_LOG_EVENT);
- intent.putExtra(EXTRA_KEY_EVENT, event);
- LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
- }
+ getLifecycle().addObserver((LifecycleEventObserver) (owner, event) -> {
+ Context context = (TestService) owner;
+ Intent intent = new Intent(ACTION_LOG_EVENT);
+ intent.putExtra(EXTRA_KEY_EVENT, event);
+ LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
});
}
diff --git a/lifecycle/service/src/main/AndroidManifest.xml b/lifecycle/lifecycle-service/src/main/AndroidManifest.xml
similarity index 100%
rename from lifecycle/service/src/main/AndroidManifest.xml
rename to lifecycle/lifecycle-service/src/main/AndroidManifest.xml
diff --git a/lifecycle/service/src/main/java/androidx/lifecycle/LifecycleService.java b/lifecycle/lifecycle-service/src/main/java/androidx/lifecycle/LifecycleService.java
similarity index 100%
rename from lifecycle/service/src/main/java/androidx/lifecycle/LifecycleService.java
rename to lifecycle/lifecycle-service/src/main/java/androidx/lifecycle/LifecycleService.java
diff --git a/lifecycle/service/src/main/java/androidx/lifecycle/ServiceLifecycleDispatcher.java b/lifecycle/lifecycle-service/src/main/java/androidx/lifecycle/ServiceLifecycleDispatcher.java
similarity index 100%
rename from lifecycle/service/src/main/java/androidx/lifecycle/ServiceLifecycleDispatcher.java
rename to lifecycle/lifecycle-service/src/main/java/androidx/lifecycle/ServiceLifecycleDispatcher.java
diff --git a/lifecycle/viewmodel/ktx/api/2.0.0.txt b/lifecycle/lifecycle-viewmodel-ktx/api/2.0.0.txt
similarity index 100%
rename from lifecycle/viewmodel/ktx/api/2.0.0.txt
rename to lifecycle/lifecycle-viewmodel-ktx/api/2.0.0.txt
diff --git a/lifecycle/viewmodel/ktx/api/2.1.0-alpha01.txt b/lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/viewmodel/ktx/api/2.1.0-alpha01.txt
rename to lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-alpha01.txt
diff --git a/lifecycle/viewmodel/ktx/api/2.1.0-alpha02.txt b/lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/viewmodel/ktx/api/2.1.0-alpha02.txt
rename to lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-alpha02.txt
diff --git a/lifecycle/viewmodel/ktx/api/2.1.0-alpha03.txt b/lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/viewmodel/ktx/api/2.1.0-alpha03.txt
rename to lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-alpha03.txt
diff --git a/lifecycle/viewmodel/ktx/api/2.1.0-alpha04.txt b/lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/viewmodel/ktx/api/2.1.0-alpha04.txt
rename to lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-alpha04.txt
diff --git a/lifecycle/viewmodel/ktx/api/2.1.0-alpha05.txt b/lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/viewmodel/ktx/api/2.1.0-alpha05.txt
rename to lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-alpha05.txt
diff --git a/lifecycle/viewmodel/ktx/api/2.1.0-beta01.txt b/lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/viewmodel/ktx/api/2.1.0-beta01.txt
rename to lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-beta01.txt
diff --git a/lifecycle/viewmodel/ktx/api/2.1.0-beta02.ignore b/lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-beta02.ignore
similarity index 100%
rename from lifecycle/viewmodel/ktx/api/2.1.0-beta02.ignore
rename to lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-beta02.ignore
diff --git a/lifecycle/viewmodel/ktx/api/2.1.0-beta02.txt b/lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/viewmodel/ktx/api/2.1.0-beta02.txt
rename to lifecycle/lifecycle-viewmodel-ktx/api/2.1.0-beta02.txt
diff --git a/lifecycle/viewmodel/ktx/api/2.2.0-alpha01.ignore b/lifecycle/lifecycle-viewmodel-ktx/api/2.2.0-alpha01.ignore
similarity index 100%
rename from lifecycle/viewmodel/ktx/api/2.2.0-alpha01.ignore
rename to lifecycle/lifecycle-viewmodel-ktx/api/2.2.0-alpha01.ignore
diff --git a/lifecycle/viewmodel/ktx/api/2.2.0-alpha01.txt b/lifecycle/lifecycle-viewmodel-ktx/api/2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/viewmodel/ktx/api/2.2.0-alpha01.txt
rename to lifecycle/lifecycle-viewmodel-ktx/api/2.2.0-alpha01.txt
diff --git a/lifecycle/viewmodel/ktx/api/2.2.0-alpha02.ignore b/lifecycle/lifecycle-viewmodel-ktx/api/2.2.0-alpha02.ignore
similarity index 100%
rename from lifecycle/viewmodel/ktx/api/2.2.0-alpha02.ignore
rename to lifecycle/lifecycle-viewmodel-ktx/api/2.2.0-alpha02.ignore
diff --git a/lifecycle/viewmodel/ktx/api/2.2.0-alpha02.txt b/lifecycle/lifecycle-viewmodel-ktx/api/2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/viewmodel/ktx/api/2.2.0-alpha02.txt
rename to lifecycle/lifecycle-viewmodel-ktx/api/2.2.0-alpha02.txt
diff --git a/lifecycle/viewmodel/ktx/api/current.txt b/lifecycle/lifecycle-viewmodel-ktx/api/current.txt
similarity index 100%
rename from lifecycle/viewmodel/ktx/api/current.txt
rename to lifecycle/lifecycle-viewmodel-ktx/api/current.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha01.txt b/lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-alpha01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha01.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha02.txt b/lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-alpha02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha02.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-alpha02.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha03.txt b/lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-alpha03.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha03.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha04.txt b/lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-alpha04.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha04.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-alpha04.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-alpha05.txt b/lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-alpha05.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-alpha05.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-alpha05.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-beta00.txt b/lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-beta00.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-beta00.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-beta00.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-beta01.txt b/lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-beta01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-beta01.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-beta01.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.1.0-beta02.txt b/lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-beta02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.1.0-beta02.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/res-2.1.0-beta02.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.2.0-alpha01.txt b/lifecycle/lifecycle-viewmodel-ktx/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.2.0-alpha01.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/res-2.2.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/res-2.2.0-alpha02.txt b/lifecycle/lifecycle-viewmodel-ktx/api/res-2.2.0-alpha02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/res-2.2.0-alpha02.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/res-2.2.0-alpha02.txt
diff --git a/lifecycle/livedata-core/api/restricted_2.0.0.txt b/lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.0.0.txt
similarity index 100%
copy from lifecycle/livedata-core/api/restricted_2.0.0.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.0.0.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha03.txt b/lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.1.0-alpha03.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha03.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.1.0-alpha03.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha04.txt b/lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.1.0-alpha04.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha04.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.1.0-alpha04.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha05.txt b/lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.1.0-alpha05.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-alpha05.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.1.0-alpha05.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta00.txt b/lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.1.0-beta00.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta00.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.1.0-beta00.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta01.txt b/lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.1.0-beta01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta01.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.1.0-beta01.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta02.txt b/lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.1.0-beta02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.1.0-beta02.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.1.0-beta02.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha01.txt b/lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.2.0-alpha01.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha01.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.2.0-alpha01.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.2.0-alpha02.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_2.2.0-alpha02.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/restricted_2.2.0-alpha02.txt
diff --git a/lifecycle/livedata-core/ktx/api/restricted_current.txt b/lifecycle/lifecycle-viewmodel-ktx/api/restricted_current.txt
similarity index 100%
copy from lifecycle/livedata-core/ktx/api/restricted_current.txt
copy to lifecycle/lifecycle-viewmodel-ktx/api/restricted_current.txt
diff --git a/lifecycle/viewmodel/ktx/build.gradle b/lifecycle/lifecycle-viewmodel-ktx/build.gradle
similarity index 100%
rename from lifecycle/viewmodel/ktx/build.gradle
rename to lifecycle/lifecycle-viewmodel-ktx/build.gradle
diff --git a/lifecycle/viewmodel/ktx/src/androidTest/java/androidx/lifecycle/ViewModelTest.kt b/lifecycle/lifecycle-viewmodel-ktx/src/androidTest/java/androidx/lifecycle/ViewModelTest.kt
similarity index 100%
rename from lifecycle/viewmodel/ktx/src/androidTest/java/androidx/lifecycle/ViewModelTest.kt
rename to lifecycle/lifecycle-viewmodel-ktx/src/androidTest/java/androidx/lifecycle/ViewModelTest.kt
diff --git a/lifecycle/viewmodel/ktx/src/main/AndroidManifest.xml b/lifecycle/lifecycle-viewmodel-ktx/src/main/AndroidManifest.xml
similarity index 100%
rename from lifecycle/viewmodel/ktx/src/main/AndroidManifest.xml
rename to lifecycle/lifecycle-viewmodel-ktx/src/main/AndroidManifest.xml
diff --git a/lifecycle/viewmodel/ktx/src/main/java/androidx/lifecycle/ViewModel.kt b/lifecycle/lifecycle-viewmodel-ktx/src/main/java/androidx/lifecycle/ViewModel.kt
similarity index 100%
rename from lifecycle/viewmodel/ktx/src/main/java/androidx/lifecycle/ViewModel.kt
rename to lifecycle/lifecycle-viewmodel-ktx/src/main/java/androidx/lifecycle/ViewModel.kt
diff --git a/lifecycle/viewmodel/ktx/src/main/java/androidx/lifecycle/ViewModelProvider.kt b/lifecycle/lifecycle-viewmodel-ktx/src/main/java/androidx/lifecycle/ViewModelProvider.kt
similarity index 100%
rename from lifecycle/viewmodel/ktx/src/main/java/androidx/lifecycle/ViewModelProvider.kt
rename to lifecycle/lifecycle-viewmodel-ktx/src/main/java/androidx/lifecycle/ViewModelProvider.kt
diff --git a/lifecycle/viewmodel/ktx/src/test/java/androidx/lifecycle/ViewModelLazyTest.kt b/lifecycle/lifecycle-viewmodel-ktx/src/test/java/androidx/lifecycle/ViewModelLazyTest.kt
similarity index 100%
rename from lifecycle/viewmodel/ktx/src/test/java/androidx/lifecycle/ViewModelLazyTest.kt
rename to lifecycle/lifecycle-viewmodel-ktx/src/test/java/androidx/lifecycle/ViewModelLazyTest.kt
diff --git a/lifecycle/viewmodel/ktx/src/test/java/androidx/lifecycle/ViewModelProviderTest.kt b/lifecycle/lifecycle-viewmodel-ktx/src/test/java/androidx/lifecycle/ViewModelProviderTest.kt
similarity index 100%
rename from lifecycle/viewmodel/ktx/src/test/java/androidx/lifecycle/ViewModelProviderTest.kt
rename to lifecycle/lifecycle-viewmodel-ktx/src/test/java/androidx/lifecycle/ViewModelProviderTest.kt
diff --git a/lifecycle/viewmodel-savedstate/api/1.0.0-alpha01.txt b/lifecycle/lifecycle-viewmodel-savedstate/api/1.0.0-alpha01.txt
similarity index 100%
rename from lifecycle/viewmodel-savedstate/api/1.0.0-alpha01.txt
rename to lifecycle/lifecycle-viewmodel-savedstate/api/1.0.0-alpha01.txt
diff --git a/lifecycle/viewmodel-savedstate/api/current.txt b/lifecycle/lifecycle-viewmodel-savedstate/api/current.txt
similarity index 100%
rename from lifecycle/viewmodel-savedstate/api/current.txt
rename to lifecycle/lifecycle-viewmodel-savedstate/api/current.txt
diff --git a/lifecycle/viewmodel-savedstate/api/res-1.0.0-alpha01.txt b/lifecycle/lifecycle-viewmodel-savedstate/api/res-1.0.0-alpha01.txt
similarity index 100%
rename from lifecycle/viewmodel-savedstate/api/res-1.0.0-alpha01.txt
rename to lifecycle/lifecycle-viewmodel-savedstate/api/res-1.0.0-alpha01.txt
diff --git a/lifecycle/viewmodel-savedstate/api/restricted_1.0.0-alpha01.txt b/lifecycle/lifecycle-viewmodel-savedstate/api/restricted_1.0.0-alpha01.txt
similarity index 100%
rename from lifecycle/viewmodel-savedstate/api/restricted_1.0.0-alpha01.txt
rename to lifecycle/lifecycle-viewmodel-savedstate/api/restricted_1.0.0-alpha01.txt
diff --git a/lifecycle/viewmodel-savedstate/api/restricted_current.txt b/lifecycle/lifecycle-viewmodel-savedstate/api/restricted_current.txt
similarity index 100%
rename from lifecycle/viewmodel-savedstate/api/restricted_current.txt
rename to lifecycle/lifecycle-viewmodel-savedstate/api/restricted_current.txt
diff --git a/lifecycle/viewmodel-savedstate/build.gradle b/lifecycle/lifecycle-viewmodel-savedstate/build.gradle
similarity index 100%
rename from lifecycle/viewmodel-savedstate/build.gradle
rename to lifecycle/lifecycle-viewmodel-savedstate/build.gradle
diff --git a/lifecycle/viewmodel-savedstate/lint-baseline.xml b/lifecycle/lifecycle-viewmodel-savedstate/lint-baseline.xml
similarity index 100%
rename from lifecycle/viewmodel-savedstate/lint-baseline.xml
rename to lifecycle/lifecycle-viewmodel-savedstate/lint-baseline.xml
diff --git a/lifecycle/viewmodel-savedstate/proguard-rules.pro b/lifecycle/lifecycle-viewmodel-savedstate/proguard-rules.pro
similarity index 100%
rename from lifecycle/viewmodel-savedstate/proguard-rules.pro
rename to lifecycle/lifecycle-viewmodel-savedstate/proguard-rules.pro
diff --git a/lifecycle/viewmodel-savedstate/src/androidTest/AndroidManifest.xml b/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from lifecycle/viewmodel-savedstate/src/androidTest/AndroidManifest.xml
rename to lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/AndroidManifest.xml
diff --git a/lifecycle/viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/SavedStateHandleParcelingTest.java b/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/SavedStateHandleParcelingTest.java
similarity index 100%
rename from lifecycle/viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/SavedStateHandleParcelingTest.java
rename to lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/SavedStateHandleParcelingTest.java
diff --git a/lifecycle/viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/SavedStateFactoryTest.kt b/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/SavedStateFactoryTest.kt
similarity index 100%
rename from lifecycle/viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/SavedStateFactoryTest.kt
rename to lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/SavedStateFactoryTest.kt
diff --git a/lifecycle/viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/SavedStateHandleTest.kt b/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/SavedStateHandleTest.kt
similarity index 100%
rename from lifecycle/viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/SavedStateHandleTest.kt
rename to lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/SavedStateHandleTest.kt
diff --git a/lifecycle/viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/ViewModelsWithStateTests.java b/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/ViewModelsWithStateTests.java
similarity index 100%
rename from lifecycle/viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/ViewModelsWithStateTests.java
rename to lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/ViewModelsWithStateTests.java
diff --git a/lifecycle/viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/activity/FakingSavedStateActivity.java b/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/activity/FakingSavedStateActivity.java
similarity index 100%
rename from lifecycle/viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/activity/FakingSavedStateActivity.java
rename to lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/viewmodel/savedstate/activity/FakingSavedStateActivity.java
diff --git a/lifecycle/viewmodel-savedstate/src/main/AndroidManifest.xml b/lifecycle/lifecycle-viewmodel-savedstate/src/main/AndroidManifest.xml
similarity index 100%
rename from lifecycle/viewmodel-savedstate/src/main/AndroidManifest.xml
rename to lifecycle/lifecycle-viewmodel-savedstate/src/main/AndroidManifest.xml
diff --git a/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/AbstractSavedStateVMFactory.java b/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/AbstractSavedStateVMFactory.java
similarity index 100%
rename from lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/AbstractSavedStateVMFactory.java
rename to lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/AbstractSavedStateVMFactory.java
diff --git a/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateHandle.java b/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateHandle.java
similarity index 100%
rename from lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateHandle.java
rename to lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateHandle.java
diff --git a/lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateVMFactory.java b/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateVMFactory.java
similarity index 100%
rename from lifecycle/viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateVMFactory.java
rename to lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateVMFactory.java
diff --git a/lifecycle/viewmodel/api/2.0.0.txt b/lifecycle/lifecycle-viewmodel/api/2.0.0.txt
similarity index 100%
rename from lifecycle/viewmodel/api/2.0.0.txt
rename to lifecycle/lifecycle-viewmodel/api/2.0.0.txt
diff --git a/lifecycle/viewmodel/api/2.1.0-alpha01.txt b/lifecycle/lifecycle-viewmodel/api/2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/viewmodel/api/2.1.0-alpha01.txt
rename to lifecycle/lifecycle-viewmodel/api/2.1.0-alpha01.txt
diff --git a/lifecycle/viewmodel/api/2.1.0-alpha02.txt b/lifecycle/lifecycle-viewmodel/api/2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/viewmodel/api/2.1.0-alpha02.txt
rename to lifecycle/lifecycle-viewmodel/api/2.1.0-alpha02.txt
diff --git a/lifecycle/viewmodel/api/2.1.0-alpha03.txt b/lifecycle/lifecycle-viewmodel/api/2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/viewmodel/api/2.1.0-alpha03.txt
rename to lifecycle/lifecycle-viewmodel/api/2.1.0-alpha03.txt
diff --git a/lifecycle/viewmodel/api/2.1.0-alpha04.txt b/lifecycle/lifecycle-viewmodel/api/2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/viewmodel/api/2.1.0-alpha04.txt
rename to lifecycle/lifecycle-viewmodel/api/2.1.0-alpha04.txt
diff --git a/lifecycle/viewmodel/api/2.1.0-alpha05.txt b/lifecycle/lifecycle-viewmodel/api/2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/viewmodel/api/2.1.0-alpha05.txt
rename to lifecycle/lifecycle-viewmodel/api/2.1.0-alpha05.txt
diff --git a/lifecycle/viewmodel/api/2.1.0-beta00.txt b/lifecycle/lifecycle-viewmodel/api/2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/viewmodel/api/2.1.0-beta00.txt
rename to lifecycle/lifecycle-viewmodel/api/2.1.0-beta00.txt
diff --git a/lifecycle/viewmodel/api/2.1.0-beta01.txt b/lifecycle/lifecycle-viewmodel/api/2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/viewmodel/api/2.1.0-beta01.txt
rename to lifecycle/lifecycle-viewmodel/api/2.1.0-beta01.txt
diff --git a/lifecycle/viewmodel/api/2.1.0-beta02.txt b/lifecycle/lifecycle-viewmodel/api/2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/viewmodel/api/2.1.0-beta02.txt
rename to lifecycle/lifecycle-viewmodel/api/2.1.0-beta02.txt
diff --git a/lifecycle/viewmodel/api/2.2.0-alpha01.txt b/lifecycle/lifecycle-viewmodel/api/2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/viewmodel/api/2.2.0-alpha01.txt
rename to lifecycle/lifecycle-viewmodel/api/2.2.0-alpha01.txt
diff --git a/lifecycle/viewmodel/api/2.2.0-alpha02.txt b/lifecycle/lifecycle-viewmodel/api/2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/viewmodel/api/2.2.0-alpha02.txt
rename to lifecycle/lifecycle-viewmodel/api/2.2.0-alpha02.txt
diff --git a/lifecycle/viewmodel/api/current.txt b/lifecycle/lifecycle-viewmodel/api/current.txt
similarity index 100%
rename from lifecycle/viewmodel/api/current.txt
rename to lifecycle/lifecycle-viewmodel/api/current.txt
diff --git a/lifecycle/viewmodel/api/res-2.1.0-alpha01.txt b/lifecycle/lifecycle-viewmodel/api/res-2.1.0-alpha01.txt
similarity index 100%
rename from lifecycle/viewmodel/api/res-2.1.0-alpha01.txt
rename to lifecycle/lifecycle-viewmodel/api/res-2.1.0-alpha01.txt
diff --git a/lifecycle/viewmodel/api/res-2.1.0-alpha02.txt b/lifecycle/lifecycle-viewmodel/api/res-2.1.0-alpha02.txt
similarity index 100%
rename from lifecycle/viewmodel/api/res-2.1.0-alpha02.txt
rename to lifecycle/lifecycle-viewmodel/api/res-2.1.0-alpha02.txt
diff --git a/lifecycle/viewmodel/api/res-2.1.0-alpha03.txt b/lifecycle/lifecycle-viewmodel/api/res-2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/viewmodel/api/res-2.1.0-alpha03.txt
rename to lifecycle/lifecycle-viewmodel/api/res-2.1.0-alpha03.txt
diff --git a/lifecycle/viewmodel/api/res-2.1.0-alpha04.txt b/lifecycle/lifecycle-viewmodel/api/res-2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/viewmodel/api/res-2.1.0-alpha04.txt
rename to lifecycle/lifecycle-viewmodel/api/res-2.1.0-alpha04.txt
diff --git a/lifecycle/viewmodel/api/res-2.1.0-alpha05.txt b/lifecycle/lifecycle-viewmodel/api/res-2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/viewmodel/api/res-2.1.0-alpha05.txt
rename to lifecycle/lifecycle-viewmodel/api/res-2.1.0-alpha05.txt
diff --git a/lifecycle/viewmodel/api/res-2.1.0-beta00.txt b/lifecycle/lifecycle-viewmodel/api/res-2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/viewmodel/api/res-2.1.0-beta00.txt
rename to lifecycle/lifecycle-viewmodel/api/res-2.1.0-beta00.txt
diff --git a/lifecycle/viewmodel/api/res-2.1.0-beta01.txt b/lifecycle/lifecycle-viewmodel/api/res-2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/viewmodel/api/res-2.1.0-beta01.txt
rename to lifecycle/lifecycle-viewmodel/api/res-2.1.0-beta01.txt
diff --git a/lifecycle/viewmodel/api/res-2.1.0-beta02.txt b/lifecycle/lifecycle-viewmodel/api/res-2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/viewmodel/api/res-2.1.0-beta02.txt
rename to lifecycle/lifecycle-viewmodel/api/res-2.1.0-beta02.txt
diff --git a/lifecycle/viewmodel/api/res-2.2.0-alpha01.txt b/lifecycle/lifecycle-viewmodel/api/res-2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/viewmodel/api/res-2.2.0-alpha01.txt
rename to lifecycle/lifecycle-viewmodel/api/res-2.2.0-alpha01.txt
diff --git a/lifecycle/viewmodel/api/res-2.2.0-alpha02.txt b/lifecycle/lifecycle-viewmodel/api/res-2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/viewmodel/api/res-2.2.0-alpha02.txt
rename to lifecycle/lifecycle-viewmodel/api/res-2.2.0-alpha02.txt
diff --git a/lifecycle/viewmodel/api/restricted_2.0.0.txt b/lifecycle/lifecycle-viewmodel/api/restricted_2.0.0.txt
similarity index 100%
rename from lifecycle/viewmodel/api/restricted_2.0.0.txt
rename to lifecycle/lifecycle-viewmodel/api/restricted_2.0.0.txt
diff --git a/lifecycle/viewmodel/api/restricted_2.1.0-alpha03.txt b/lifecycle/lifecycle-viewmodel/api/restricted_2.1.0-alpha03.txt
similarity index 100%
rename from lifecycle/viewmodel/api/restricted_2.1.0-alpha03.txt
rename to lifecycle/lifecycle-viewmodel/api/restricted_2.1.0-alpha03.txt
diff --git a/lifecycle/viewmodel/api/restricted_2.1.0-alpha04.txt b/lifecycle/lifecycle-viewmodel/api/restricted_2.1.0-alpha04.txt
similarity index 100%
rename from lifecycle/viewmodel/api/restricted_2.1.0-alpha04.txt
rename to lifecycle/lifecycle-viewmodel/api/restricted_2.1.0-alpha04.txt
diff --git a/lifecycle/viewmodel/api/restricted_2.1.0-alpha05.txt b/lifecycle/lifecycle-viewmodel/api/restricted_2.1.0-alpha05.txt
similarity index 100%
rename from lifecycle/viewmodel/api/restricted_2.1.0-alpha05.txt
rename to lifecycle/lifecycle-viewmodel/api/restricted_2.1.0-alpha05.txt
diff --git a/lifecycle/viewmodel/api/restricted_2.1.0-beta00.txt b/lifecycle/lifecycle-viewmodel/api/restricted_2.1.0-beta00.txt
similarity index 100%
rename from lifecycle/viewmodel/api/restricted_2.1.0-beta00.txt
rename to lifecycle/lifecycle-viewmodel/api/restricted_2.1.0-beta00.txt
diff --git a/lifecycle/viewmodel/api/restricted_2.1.0-beta01.txt b/lifecycle/lifecycle-viewmodel/api/restricted_2.1.0-beta01.txt
similarity index 100%
rename from lifecycle/viewmodel/api/restricted_2.1.0-beta01.txt
rename to lifecycle/lifecycle-viewmodel/api/restricted_2.1.0-beta01.txt
diff --git a/lifecycle/viewmodel/api/restricted_2.1.0-beta02.txt b/lifecycle/lifecycle-viewmodel/api/restricted_2.1.0-beta02.txt
similarity index 100%
rename from lifecycle/viewmodel/api/restricted_2.1.0-beta02.txt
rename to lifecycle/lifecycle-viewmodel/api/restricted_2.1.0-beta02.txt
diff --git a/lifecycle/viewmodel/api/restricted_2.2.0-alpha01.txt b/lifecycle/lifecycle-viewmodel/api/restricted_2.2.0-alpha01.txt
similarity index 100%
rename from lifecycle/viewmodel/api/restricted_2.2.0-alpha01.txt
rename to lifecycle/lifecycle-viewmodel/api/restricted_2.2.0-alpha01.txt
diff --git a/lifecycle/viewmodel/api/restricted_2.2.0-alpha02.txt b/lifecycle/lifecycle-viewmodel/api/restricted_2.2.0-alpha02.txt
similarity index 100%
rename from lifecycle/viewmodel/api/restricted_2.2.0-alpha02.txt
rename to lifecycle/lifecycle-viewmodel/api/restricted_2.2.0-alpha02.txt
diff --git a/lifecycle/viewmodel/api/restricted_current.txt b/lifecycle/lifecycle-viewmodel/api/restricted_current.txt
similarity index 100%
rename from lifecycle/viewmodel/api/restricted_current.txt
rename to lifecycle/lifecycle-viewmodel/api/restricted_current.txt
diff --git a/lifecycle/viewmodel/api_legacy/1.1.0.txt b/lifecycle/lifecycle-viewmodel/api_legacy/1.1.0.txt
similarity index 100%
rename from lifecycle/viewmodel/api_legacy/1.1.0.txt
rename to lifecycle/lifecycle-viewmodel/api_legacy/1.1.0.txt
diff --git a/lifecycle/viewmodel/api_legacy/current.txt b/lifecycle/lifecycle-viewmodel/api_legacy/current.txt
similarity index 100%
rename from lifecycle/viewmodel/api_legacy/current.txt
rename to lifecycle/lifecycle-viewmodel/api_legacy/current.txt
diff --git a/lifecycle/viewmodel/build.gradle b/lifecycle/lifecycle-viewmodel/build.gradle
similarity index 100%
rename from lifecycle/viewmodel/build.gradle
rename to lifecycle/lifecycle-viewmodel/build.gradle
diff --git a/lifecycle/viewmodel/proguard-rules.pro b/lifecycle/lifecycle-viewmodel/proguard-rules.pro
similarity index 100%
rename from lifecycle/viewmodel/proguard-rules.pro
rename to lifecycle/lifecycle-viewmodel/proguard-rules.pro
diff --git a/lifecycle/viewmodel/src/main/AndroidManifest.xml b/lifecycle/lifecycle-viewmodel/src/main/AndroidManifest.xml
similarity index 100%
rename from lifecycle/viewmodel/src/main/AndroidManifest.xml
rename to lifecycle/lifecycle-viewmodel/src/main/AndroidManifest.xml
diff --git a/lifecycle/viewmodel/src/main/java/androidx/lifecycle/AndroidViewModel.java b/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/AndroidViewModel.java
similarity index 100%
rename from lifecycle/viewmodel/src/main/java/androidx/lifecycle/AndroidViewModel.java
rename to lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/AndroidViewModel.java
diff --git a/lifecycle/viewmodel/src/main/java/androidx/lifecycle/ViewModel.java b/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModel.java
similarity index 100%
rename from lifecycle/viewmodel/src/main/java/androidx/lifecycle/ViewModel.java
rename to lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModel.java
diff --git a/lifecycle/viewmodel/src/main/java/androidx/lifecycle/ViewModelProvider.java b/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModelProvider.java
similarity index 100%
rename from lifecycle/viewmodel/src/main/java/androidx/lifecycle/ViewModelProvider.java
rename to lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModelProvider.java
diff --git a/lifecycle/viewmodel/src/main/java/androidx/lifecycle/ViewModelStore.java b/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModelStore.java
similarity index 100%
rename from lifecycle/viewmodel/src/main/java/androidx/lifecycle/ViewModelStore.java
rename to lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModelStore.java
diff --git a/lifecycle/viewmodel/src/main/java/androidx/lifecycle/ViewModelStoreOwner.java b/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModelStoreOwner.java
similarity index 100%
rename from lifecycle/viewmodel/src/main/java/androidx/lifecycle/ViewModelStoreOwner.java
rename to lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModelStoreOwner.java
diff --git a/lifecycle/viewmodel/src/test/java/androidx/lifecycle/ViewModelProviderTest.java b/lifecycle/lifecycle-viewmodel/src/test/java/androidx/lifecycle/ViewModelProviderTest.java
similarity index 100%
rename from lifecycle/viewmodel/src/test/java/androidx/lifecycle/ViewModelProviderTest.java
rename to lifecycle/lifecycle-viewmodel/src/test/java/androidx/lifecycle/ViewModelProviderTest.java
diff --git a/lifecycle/viewmodel/src/test/java/androidx/lifecycle/ViewModelStoreTest.java b/lifecycle/lifecycle-viewmodel/src/test/java/androidx/lifecycle/ViewModelStoreTest.java
similarity index 100%
rename from lifecycle/viewmodel/src/test/java/androidx/lifecycle/ViewModelStoreTest.java
rename to lifecycle/lifecycle-viewmodel/src/test/java/androidx/lifecycle/ViewModelStoreTest.java
diff --git a/lifecycle/viewmodel/src/test/java/androidx/lifecycle/ViewModelTest.java b/lifecycle/lifecycle-viewmodel/src/test/java/androidx/lifecycle/ViewModelTest.java
similarity index 100%
rename from lifecycle/viewmodel/src/test/java/androidx/lifecycle/ViewModelTest.java
rename to lifecycle/lifecycle-viewmodel/src/test/java/androidx/lifecycle/ViewModelTest.java
diff --git a/lifecycle/livedata/ktx/api/res-2.1.0-alpha01.txt b/lifecycle/livedata/ktx/api/res-2.1.0-alpha01.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/livedata/ktx/api/res-2.1.0-alpha01.txt
+++ /dev/null
diff --git a/lifecycle/livedata/ktx/api/res-2.1.0-alpha02.txt b/lifecycle/livedata/ktx/api/res-2.1.0-alpha02.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/livedata/ktx/api/res-2.1.0-alpha02.txt
+++ /dev/null
diff --git a/lifecycle/livedata/ktx/api/res-2.1.0-alpha03.txt b/lifecycle/livedata/ktx/api/res-2.1.0-alpha03.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/livedata/ktx/api/res-2.1.0-alpha03.txt
+++ /dev/null
diff --git a/lifecycle/livedata/ktx/api/res-2.1.0-alpha04.txt b/lifecycle/livedata/ktx/api/res-2.1.0-alpha04.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/livedata/ktx/api/res-2.1.0-alpha04.txt
+++ /dev/null
diff --git a/lifecycle/livedata/ktx/api/res-2.1.0-alpha05.txt b/lifecycle/livedata/ktx/api/res-2.1.0-alpha05.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/livedata/ktx/api/res-2.1.0-alpha05.txt
+++ /dev/null
diff --git a/lifecycle/livedata/ktx/api/res-2.1.0-beta00.txt b/lifecycle/livedata/ktx/api/res-2.1.0-beta00.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/livedata/ktx/api/res-2.1.0-beta00.txt
+++ /dev/null
diff --git a/lifecycle/livedata/ktx/api/res-2.1.0-beta01.txt b/lifecycle/livedata/ktx/api/res-2.1.0-beta01.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/livedata/ktx/api/res-2.1.0-beta01.txt
+++ /dev/null
diff --git a/lifecycle/livedata/ktx/api/res-2.1.0-beta02.txt b/lifecycle/livedata/ktx/api/res-2.1.0-beta02.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/livedata/ktx/api/res-2.1.0-beta02.txt
+++ /dev/null
diff --git a/lifecycle/livedata/ktx/api/res-2.2.0-alpha01.txt b/lifecycle/livedata/ktx/api/res-2.2.0-alpha01.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/livedata/ktx/api/res-2.2.0-alpha01.txt
+++ /dev/null
diff --git a/lifecycle/livedata/ktx/api/res-2.2.0-alpha02.txt b/lifecycle/livedata/ktx/api/res-2.2.0-alpha02.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/livedata/ktx/api/res-2.2.0-alpha02.txt
+++ /dev/null
diff --git a/lifecycle/livedata/ktx/api/restricted_2.1.0-alpha03.txt b/lifecycle/livedata/ktx/api/restricted_2.1.0-alpha03.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/livedata/ktx/api/restricted_2.1.0-alpha03.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/livedata/ktx/api/restricted_2.1.0-alpha04.txt b/lifecycle/livedata/ktx/api/restricted_2.1.0-alpha04.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/livedata/ktx/api/restricted_2.1.0-alpha04.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/livedata/ktx/api/restricted_2.1.0-alpha05.txt b/lifecycle/livedata/ktx/api/restricted_2.1.0-alpha05.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/livedata/ktx/api/restricted_2.1.0-alpha05.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/livedata/ktx/api/restricted_2.1.0-beta00.txt b/lifecycle/livedata/ktx/api/restricted_2.1.0-beta00.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/livedata/ktx/api/restricted_2.1.0-beta00.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/livedata/ktx/api/restricted_2.1.0-beta01.txt b/lifecycle/livedata/ktx/api/restricted_2.1.0-beta01.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/livedata/ktx/api/restricted_2.1.0-beta01.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/livedata/ktx/api/restricted_2.1.0-beta02.txt b/lifecycle/livedata/ktx/api/restricted_2.1.0-beta02.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/livedata/ktx/api/restricted_2.1.0-beta02.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/livedata/ktx/api/restricted_2.2.0-alpha01.txt b/lifecycle/livedata/ktx/api/restricted_2.2.0-alpha01.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/livedata/ktx/api/restricted_2.2.0-alpha01.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/livedata/ktx/api/restricted_2.2.0-alpha02.txt b/lifecycle/livedata/ktx/api/restricted_2.2.0-alpha02.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/livedata/ktx/api/restricted_2.2.0-alpha02.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/livedata/ktx/api/restricted_current.txt b/lifecycle/livedata/ktx/api/restricted_current.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/livedata/ktx/api/restricted_current.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha01.txt b/lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha01.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha01.txt
+++ /dev/null
diff --git a/lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha02.txt b/lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha02.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha02.txt
+++ /dev/null
diff --git a/lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha03.txt b/lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha03.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha03.txt
+++ /dev/null
diff --git a/lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha04.txt b/lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha04.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha04.txt
+++ /dev/null
diff --git a/lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha05.txt b/lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha05.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/reactivestreams/ktx/api/res-2.1.0-alpha05.txt
+++ /dev/null
diff --git a/lifecycle/reactivestreams/ktx/api/res-2.1.0-beta00.txt b/lifecycle/reactivestreams/ktx/api/res-2.1.0-beta00.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/reactivestreams/ktx/api/res-2.1.0-beta00.txt
+++ /dev/null
diff --git a/lifecycle/reactivestreams/ktx/api/res-2.1.0-beta01.txt b/lifecycle/reactivestreams/ktx/api/res-2.1.0-beta01.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/reactivestreams/ktx/api/res-2.1.0-beta01.txt
+++ /dev/null
diff --git a/lifecycle/reactivestreams/ktx/api/res-2.1.0-beta02.txt b/lifecycle/reactivestreams/ktx/api/res-2.1.0-beta02.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/reactivestreams/ktx/api/res-2.1.0-beta02.txt
+++ /dev/null
diff --git a/lifecycle/reactivestreams/ktx/api/res-2.2.0-alpha01.txt b/lifecycle/reactivestreams/ktx/api/res-2.2.0-alpha01.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/reactivestreams/ktx/api/res-2.2.0-alpha01.txt
+++ /dev/null
diff --git a/lifecycle/reactivestreams/ktx/api/res-2.2.0-alpha02.txt b/lifecycle/reactivestreams/ktx/api/res-2.2.0-alpha02.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/reactivestreams/ktx/api/res-2.2.0-alpha02.txt
+++ /dev/null
diff --git a/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-alpha03.txt b/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-alpha03.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-alpha03.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-alpha04.txt b/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-alpha04.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-alpha04.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-alpha05.txt b/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-alpha05.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-alpha05.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-beta00.txt b/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-beta00.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-beta00.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-beta01.txt b/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-beta01.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-beta01.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-beta02.txt b/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-beta02.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/reactivestreams/ktx/api/restricted_2.1.0-beta02.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/reactivestreams/ktx/api/restricted_2.2.0-alpha01.txt b/lifecycle/reactivestreams/ktx/api/restricted_2.2.0-alpha01.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/reactivestreams/ktx/api/restricted_2.2.0-alpha01.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/reactivestreams/ktx/api/restricted_2.2.0-alpha02.txt b/lifecycle/reactivestreams/ktx/api/restricted_2.2.0-alpha02.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/reactivestreams/ktx/api/restricted_2.2.0-alpha02.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/reactivestreams/ktx/api/restricted_current.txt b/lifecycle/reactivestreams/ktx/api/restricted_current.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/reactivestreams/ktx/api/restricted_current.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/runtime/ktx/api/res-2.2.0-alpha01.txt b/lifecycle/runtime/ktx/api/res-2.2.0-alpha01.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/runtime/ktx/api/res-2.2.0-alpha01.txt
+++ /dev/null
diff --git a/lifecycle/runtime/ktx/api/res-2.2.0-alpha02.txt b/lifecycle/runtime/ktx/api/res-2.2.0-alpha02.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/runtime/ktx/api/res-2.2.0-alpha02.txt
+++ /dev/null
diff --git a/lifecycle/runtime/ktx/api/restricted_2.2.0-alpha01.txt b/lifecycle/runtime/ktx/api/restricted_2.2.0-alpha01.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/runtime/ktx/api/restricted_2.2.0-alpha01.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/runtime/ktx/api/restricted_2.2.0-alpha02.txt b/lifecycle/runtime/ktx/api/restricted_2.2.0-alpha02.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/runtime/ktx/api/restricted_2.2.0-alpha02.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/runtime/ktx/api/restricted_current.txt b/lifecycle/runtime/ktx/api/restricted_current.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/runtime/ktx/api/restricted_current.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/viewmodel/ktx/api/res-2.1.0-alpha01.txt b/lifecycle/viewmodel/ktx/api/res-2.1.0-alpha01.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/viewmodel/ktx/api/res-2.1.0-alpha01.txt
+++ /dev/null
diff --git a/lifecycle/viewmodel/ktx/api/res-2.1.0-alpha02.txt b/lifecycle/viewmodel/ktx/api/res-2.1.0-alpha02.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/viewmodel/ktx/api/res-2.1.0-alpha02.txt
+++ /dev/null
diff --git a/lifecycle/viewmodel/ktx/api/res-2.1.0-alpha03.txt b/lifecycle/viewmodel/ktx/api/res-2.1.0-alpha03.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/viewmodel/ktx/api/res-2.1.0-alpha03.txt
+++ /dev/null
diff --git a/lifecycle/viewmodel/ktx/api/res-2.1.0-alpha04.txt b/lifecycle/viewmodel/ktx/api/res-2.1.0-alpha04.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/viewmodel/ktx/api/res-2.1.0-alpha04.txt
+++ /dev/null
diff --git a/lifecycle/viewmodel/ktx/api/res-2.1.0-alpha05.txt b/lifecycle/viewmodel/ktx/api/res-2.1.0-alpha05.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/viewmodel/ktx/api/res-2.1.0-alpha05.txt
+++ /dev/null
diff --git a/lifecycle/viewmodel/ktx/api/res-2.1.0-beta00.txt b/lifecycle/viewmodel/ktx/api/res-2.1.0-beta00.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/viewmodel/ktx/api/res-2.1.0-beta00.txt
+++ /dev/null
diff --git a/lifecycle/viewmodel/ktx/api/res-2.1.0-beta01.txt b/lifecycle/viewmodel/ktx/api/res-2.1.0-beta01.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/viewmodel/ktx/api/res-2.1.0-beta01.txt
+++ /dev/null
diff --git a/lifecycle/viewmodel/ktx/api/res-2.1.0-beta02.txt b/lifecycle/viewmodel/ktx/api/res-2.1.0-beta02.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/viewmodel/ktx/api/res-2.1.0-beta02.txt
+++ /dev/null
diff --git a/lifecycle/viewmodel/ktx/api/res-2.2.0-alpha01.txt b/lifecycle/viewmodel/ktx/api/res-2.2.0-alpha01.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/viewmodel/ktx/api/res-2.2.0-alpha01.txt
+++ /dev/null
diff --git a/lifecycle/viewmodel/ktx/api/res-2.2.0-alpha02.txt b/lifecycle/viewmodel/ktx/api/res-2.2.0-alpha02.txt
deleted file mode 100644
index e69de29..0000000
--- a/lifecycle/viewmodel/ktx/api/res-2.2.0-alpha02.txt
+++ /dev/null
diff --git a/lifecycle/viewmodel/ktx/api/restricted_2.0.0.txt b/lifecycle/viewmodel/ktx/api/restricted_2.0.0.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/viewmodel/ktx/api/restricted_2.0.0.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/viewmodel/ktx/api/restricted_2.1.0-alpha03.txt b/lifecycle/viewmodel/ktx/api/restricted_2.1.0-alpha03.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/viewmodel/ktx/api/restricted_2.1.0-alpha03.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/viewmodel/ktx/api/restricted_2.1.0-alpha04.txt b/lifecycle/viewmodel/ktx/api/restricted_2.1.0-alpha04.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/viewmodel/ktx/api/restricted_2.1.0-alpha04.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/viewmodel/ktx/api/restricted_2.1.0-alpha05.txt b/lifecycle/viewmodel/ktx/api/restricted_2.1.0-alpha05.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/viewmodel/ktx/api/restricted_2.1.0-alpha05.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/viewmodel/ktx/api/restricted_2.1.0-beta00.txt b/lifecycle/viewmodel/ktx/api/restricted_2.1.0-beta00.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/viewmodel/ktx/api/restricted_2.1.0-beta00.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/viewmodel/ktx/api/restricted_2.1.0-beta01.txt b/lifecycle/viewmodel/ktx/api/restricted_2.1.0-beta01.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/viewmodel/ktx/api/restricted_2.1.0-beta01.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/viewmodel/ktx/api/restricted_2.1.0-beta02.txt b/lifecycle/viewmodel/ktx/api/restricted_2.1.0-beta02.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/viewmodel/ktx/api/restricted_2.1.0-beta02.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/viewmodel/ktx/api/restricted_2.2.0-alpha01.txt b/lifecycle/viewmodel/ktx/api/restricted_2.2.0-alpha01.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/viewmodel/ktx/api/restricted_2.2.0-alpha01.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/viewmodel/ktx/api/restricted_2.2.0-alpha02.txt b/lifecycle/viewmodel/ktx/api/restricted_2.2.0-alpha02.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/viewmodel/ktx/api/restricted_2.2.0-alpha02.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/lifecycle/viewmodel/ktx/api/restricted_current.txt b/lifecycle/viewmodel/ktx/api/restricted_current.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/lifecycle/viewmodel/ktx/api/restricted_current.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/paging/runtime/api/2.2.0-alpha01.txt b/paging/runtime/api/2.2.0-alpha01.txt
index bca6b7a..a3f5310 100644
--- a/paging/runtime/api/2.2.0-alpha01.txt
+++ b/paging/runtime/api/2.2.0-alpha01.txt
@@ -30,6 +30,12 @@
method public androidx.paging.LivePagedListBuilder<Key,Value> setInitialLoadKey(Key? key);
}
+ public final class LivePagedListKt {
+ ctor public LivePagedListKt();
+ method public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, java.util.concurrent.Executor fetchExecutor = ArchTaskExecutor.getIOThreadExecutor());
+ method public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, java.util.concurrent.Executor fetchExecutor = ArchTaskExecutor.getIOThreadExecutor());
+ }
+
public abstract class PagedListAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
ctor protected PagedListAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
ctor protected PagedListAdapter(androidx.recyclerview.widget.AsyncDifferConfig<T> config);
diff --git a/paging/runtime/api/current.txt b/paging/runtime/api/current.txt
index bca6b7a..a3f5310 100644
--- a/paging/runtime/api/current.txt
+++ b/paging/runtime/api/current.txt
@@ -30,6 +30,12 @@
method public androidx.paging.LivePagedListBuilder<Key,Value> setInitialLoadKey(Key? key);
}
+ public final class LivePagedListKt {
+ ctor public LivePagedListKt();
+ method public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, java.util.concurrent.Executor fetchExecutor = ArchTaskExecutor.getIOThreadExecutor());
+ method public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, java.util.concurrent.Executor fetchExecutor = ArchTaskExecutor.getIOThreadExecutor());
+ }
+
public abstract class PagedListAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
ctor protected PagedListAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
ctor protected PagedListAdapter(androidx.recyclerview.widget.AsyncDifferConfig<T> config);
diff --git a/paging/runtime/build.gradle b/paging/runtime/build.gradle
index 582fb7c..6b083c7 100644
--- a/paging/runtime/build.gradle
+++ b/paging/runtime/build.gradle
@@ -37,6 +37,8 @@
dependencies {
api(project(":paging:paging-common"))
+ // Ensure that the -ktx dependency graph mirrors the Java dependency graph
+ api(project(":paging:paging-common-ktx"))
api(project(":arch:core-runtime"))
api(ARCH_LIFECYCLE_RUNTIME)
@@ -45,15 +47,17 @@
api(KOTLIN_STDLIB)
androidTestImplementation project(':internal-testutils-common')
+ androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
+ androidTestImplementation(ANDROIDX_TEST_CORE)
+ androidTestImplementation(ANDROIDX_TEST_RUNNER)
+ androidTestImplementation(ARCH_CORE_TESTING)
+ androidTestImplementation(ESPRESSO_CORE)
androidTestImplementation(JUNIT)
androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
androidTestImplementation MOCKITO_KOTLIN, {
exclude group: 'org.mockito' // to keep control on the mockito version
}
- androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
- androidTestImplementation(ANDROIDX_TEST_CORE)
- androidTestImplementation(ANDROIDX_TEST_RUNNER)
}
androidx {
diff --git a/paging/runtime/ktx/api/2.2.0-alpha01.ignore b/paging/runtime/ktx/api/2.2.0-alpha01.ignore
new file mode 100644
index 0000000..ffce0e5
--- /dev/null
+++ b/paging/runtime/ktx/api/2.2.0-alpha01.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedPackage: androidx.paging:
+ Removed package androidx.paging
diff --git a/paging/runtime/ktx/api/2.2.0-alpha01.txt b/paging/runtime/ktx/api/2.2.0-alpha01.txt
index 9d5a1df..da4f6cc 100644
--- a/paging/runtime/ktx/api/2.2.0-alpha01.txt
+++ b/paging/runtime/ktx/api/2.2.0-alpha01.txt
@@ -1,11 +1 @@
// Signature format: 3.0
-package androidx.paging {
-
- public final class LivePagedListKt {
- ctor public LivePagedListKt();
- method public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, java.util.concurrent.Executor fetchExecutor = ArchTaskExecutor.getIOThreadExecutor());
- method public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, java.util.concurrent.Executor fetchExecutor = ArchTaskExecutor.getIOThreadExecutor());
- }
-
-}
-
diff --git a/paging/runtime/ktx/api/current.txt b/paging/runtime/ktx/api/current.txt
index 9d5a1df..da4f6cc 100644
--- a/paging/runtime/ktx/api/current.txt
+++ b/paging/runtime/ktx/api/current.txt
@@ -1,11 +1 @@
// Signature format: 3.0
-package androidx.paging {
-
- public final class LivePagedListKt {
- ctor public LivePagedListKt();
- method public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, java.util.concurrent.Executor fetchExecutor = ArchTaskExecutor.getIOThreadExecutor());
- method public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, java.util.concurrent.Executor fetchExecutor = ArchTaskExecutor.getIOThreadExecutor());
- }
-
-}
-
diff --git a/paging/runtime/ktx/api/restricted_2.2.0-alpha01.ignore b/paging/runtime/ktx/api/restricted_2.2.0-alpha01.ignore
new file mode 100644
index 0000000..9a97707
--- /dev/null
+++ b/paging/runtime/ktx/api/restricted_2.2.0-alpha01.ignore
@@ -0,0 +1 @@
+// Baseline format: 1.0
diff --git a/paging/runtime/ktx/build.gradle b/paging/runtime/ktx/build.gradle
index 7113572..af1684c 100644
--- a/paging/runtime/ktx/build.gradle
+++ b/paging/runtime/ktx/build.gradle
@@ -37,14 +37,7 @@
dependencies {
api(project(":paging:paging-runtime"))
// Ensure that the -ktx dependency graph mirrors the Java dependency graph
- api(project(":paging:paging-common-ktx"))
- implementation(KOTLIN_STDLIB)
-
- androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
- androidTestImplementation(ANDROIDX_TEST_CORE)
- androidTestImplementation(ANDROIDX_TEST_RUNNER)
- androidTestImplementation(ARCH_CORE_TESTING)
- androidTestImplementation(ESPRESSO_CORE)
+ implementation(project(":paging:paging-common-ktx"))
}
androidx {
diff --git a/paging/runtime/ktx/src/main/AndroidManifest.xml b/paging/runtime/ktx/src/main/AndroidManifest.xml
index 9746b1a..344917f 100644
--- a/paging/runtime/ktx/src/main/AndroidManifest.xml
+++ b/paging/runtime/ktx/src/main/AndroidManifest.xml
@@ -1,16 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
+<!--
+ Copyright 2019 The Android Open Source Project
- 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
+ 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
+ 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.
--->
+ 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.
+ -->
<manifest package="androidx.paging.runtime.ktx"/>
diff --git a/paging/runtime/ktx/src/main/java/androidx/paging/LivePagedList.kt b/paging/runtime/ktx/src/main/java/androidx/paging/LivePagedList.kt
deleted file mode 100644
index 52343f4..0000000
--- a/paging/runtime/ktx/src/main/java/androidx/paging/LivePagedList.kt
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * 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 androidx.paging
-
-import androidx.arch.core.executor.ArchTaskExecutor
-import androidx.lifecycle.LiveData
-import java.util.concurrent.Executor
-
-/**
- * Constructs a `LiveData<PagedList>`, from this `DataSource.Factory`, convenience for
- * [LivePagedListBuilder].
- *
- * No work (such as loading) is done immediately, the creation of the first PagedList is is
- * deferred until the LiveData is observed.
- *
- * @param config Paging configuration.
- * @param initialLoadKey Initial load key passed to the first PagedList/DataSource.
- * @param boundaryCallback The boundary callback for listening to PagedList load state.
- * @param fetchExecutor Executor for fetching data from DataSources.
- *
- * @see LivePagedListBuilder
- */
-fun <Key : Any, Value : Any> DataSource.Factory<Key, Value>.toLiveData(
- config: PagedList.Config,
- initialLoadKey: Key? = null,
- boundaryCallback: PagedList.BoundaryCallback<Value>? = null,
- fetchExecutor: Executor = ArchTaskExecutor.getIOThreadExecutor()
-): LiveData<PagedList<Value>> {
- return LivePagedListBuilder(this, config)
- .setInitialLoadKey(initialLoadKey)
- .setBoundaryCallback(boundaryCallback)
- .setFetchExecutor(fetchExecutor)
- .build()
-}
-
-/**
- * Constructs a `LiveData<PagedList>`, from this `DataSource.Factory`, convenience for
- * [LivePagedListBuilder].
- *
- * No work (such as loading) is done immediately, the creation of the first PagedList is is
- * deferred until the LiveData is observed.
- *
- * @param pageSize Page size.
- * @param initialLoadKey Initial load key passed to the first PagedList/DataSource.
- * @param boundaryCallback The boundary callback for listening to PagedList load state.
- * @param fetchExecutor Executor for fetching data from DataSources.
- *
- * @see LivePagedListBuilder
- */
-fun <Key : Any, Value : Any> DataSource.Factory<Key, Value>.toLiveData(
- pageSize: Int,
- initialLoadKey: Key? = null,
- boundaryCallback: PagedList.BoundaryCallback<Value>? = null,
- fetchExecutor: Executor = ArchTaskExecutor.getIOThreadExecutor()
-): LiveData<PagedList<Value>> {
- return LivePagedListBuilder(this, Config(pageSize))
- .setInitialLoadKey(initialLoadKey)
- .setBoundaryCallback(boundaryCallback)
- .setFetchExecutor(fetchExecutor)
- .build()
-}
diff --git a/paging/runtime/ktx/src/androidTest/java/androidx/paging/LivePagedListTest.kt b/paging/runtime/src/androidTest/java/androidx/paging/LivePagedListTest.kt
similarity index 97%
rename from paging/runtime/ktx/src/androidTest/java/androidx/paging/LivePagedListTest.kt
rename to paging/runtime/src/androidTest/java/androidx/paging/LivePagedListTest.kt
index c913e98..1d48562 100644
--- a/paging/runtime/ktx/src/androidTest/java/androidx/paging/LivePagedListTest.kt
+++ b/paging/runtime/src/androidTest/java/androidx/paging/LivePagedListTest.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2018 The Android Open Source Project
+ * Copyright 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/paging/runtime/src/main/java/androidx/paging/LivePagedList.kt b/paging/runtime/src/main/java/androidx/paging/LivePagedList.kt
index a68a7c9..c2514b5 100644
--- a/paging/runtime/src/main/java/androidx/paging/LivePagedList.kt
+++ b/paging/runtime/src/main/java/androidx/paging/LivePagedList.kt
@@ -16,6 +16,7 @@
package androidx.paging
+import androidx.arch.core.executor.ArchTaskExecutor
import androidx.lifecycle.LiveData
import androidx.paging.futures.FutureCallback
import androidx.paging.futures.addCallback
@@ -99,3 +100,57 @@
)
}
}
+
+/**
+ * Constructs a `LiveData<PagedList>`, from this `DataSource.Factory`, convenience for
+ * [LivePagedListBuilder].
+ *
+ * No work (such as loading) is done immediately, the creation of the first PagedList is is
+ * deferred until the LiveData is observed.
+ *
+ * @param config Paging configuration.
+ * @param initialLoadKey Initial load key passed to the first PagedList/DataSource.
+ * @param boundaryCallback The boundary callback for listening to PagedList load state.
+ * @param fetchExecutor Executor for fetching data from DataSources.
+ *
+ * @see LivePagedListBuilder
+ */
+fun <Key : Any, Value : Any> DataSource.Factory<Key, Value>.toLiveData(
+ config: PagedList.Config,
+ initialLoadKey: Key? = null,
+ boundaryCallback: PagedList.BoundaryCallback<Value>? = null,
+ fetchExecutor: Executor = ArchTaskExecutor.getIOThreadExecutor()
+): LiveData<PagedList<Value>> {
+ return LivePagedListBuilder(this, config)
+ .setInitialLoadKey(initialLoadKey)
+ .setBoundaryCallback(boundaryCallback)
+ .setFetchExecutor(fetchExecutor)
+ .build()
+}
+
+/**
+ * Constructs a `LiveData<PagedList>`, from this `DataSource.Factory`, convenience for
+ * [LivePagedListBuilder].
+ *
+ * No work (such as loading) is done immediately, the creation of the first PagedList is is
+ * deferred until the LiveData is observed.
+ *
+ * @param pageSize Page size.
+ * @param initialLoadKey Initial load key passed to the first PagedList/DataSource.
+ * @param boundaryCallback The boundary callback for listening to PagedList load state.
+ * @param fetchExecutor Executor for fetching data from DataSources.
+ *
+ * @see LivePagedListBuilder
+ */
+fun <Key : Any, Value : Any> DataSource.Factory<Key, Value>.toLiveData(
+ pageSize: Int,
+ initialLoadKey: Key? = null,
+ boundaryCallback: PagedList.BoundaryCallback<Value>? = null,
+ fetchExecutor: Executor = ArchTaskExecutor.getIOThreadExecutor()
+): LiveData<PagedList<Value>> {
+ return LivePagedListBuilder(this, Config(pageSize))
+ .setInitialLoadKey(initialLoadKey)
+ .setBoundaryCallback(boundaryCallback)
+ .setFetchExecutor(fetchExecutor)
+ .build()
+}
diff --git a/paging/rxjava2/api/2.2.0-alpha01.txt b/paging/rxjava2/api/2.2.0-alpha01.txt
index b6cb673..0517d76 100644
--- a/paging/rxjava2/api/2.2.0-alpha01.txt
+++ b/paging/rxjava2/api/2.2.0-alpha01.txt
@@ -1,15 +1,19 @@
// Signature format: 3.0
package androidx.paging {
+ public final class RxDataSourceUtilKt {
+ ctor public RxDataSourceUtilKt();
+ }
+
public final class RxPagedListBuilder<Key, Value> {
- ctor public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key!,Value!>, androidx.paging.PagedList.Config);
- ctor public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key!,Value!>, int);
- method public io.reactivex.Flowable<androidx.paging.PagedList<Value!>!> buildFlowable(io.reactivex.BackpressureStrategy);
- method public io.reactivex.Observable<androidx.paging.PagedList<Value!>!> buildObservable();
- method public androidx.paging.RxPagedListBuilder<Key!,Value!> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value!>?);
- method public androidx.paging.RxPagedListBuilder<Key!,Value!> setFetchScheduler(io.reactivex.Scheduler);
- method public androidx.paging.RxPagedListBuilder<Key!,Value!> setInitialLoadKey(Key?);
- method public androidx.paging.RxPagedListBuilder<Key!,Value!> setNotifyScheduler(io.reactivex.Scheduler);
+ ctor public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, androidx.paging.PagedList.Config config);
+ ctor public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, int pageSize);
+ method public io.reactivex.Flowable<androidx.paging.PagedList<Value>> buildFlowable(io.reactivex.BackpressureStrategy backpressureStrategy);
+ method public io.reactivex.Observable<androidx.paging.PagedList<Value>> buildObservable();
+ method public androidx.paging.RxPagedListBuilder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
+ method public androidx.paging.RxPagedListBuilder<Key,Value> setFetchScheduler(io.reactivex.Scheduler scheduler);
+ method public androidx.paging.RxPagedListBuilder<Key,Value> setInitialLoadKey(Key? key);
+ method public androidx.paging.RxPagedListBuilder<Key,Value> setNotifyScheduler(io.reactivex.Scheduler scheduler);
}
}
diff --git a/paging/rxjava2/api/current.txt b/paging/rxjava2/api/current.txt
index b6cb673..0517d76 100644
--- a/paging/rxjava2/api/current.txt
+++ b/paging/rxjava2/api/current.txt
@@ -1,15 +1,19 @@
// Signature format: 3.0
package androidx.paging {
+ public final class RxDataSourceUtilKt {
+ ctor public RxDataSourceUtilKt();
+ }
+
public final class RxPagedListBuilder<Key, Value> {
- ctor public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key!,Value!>, androidx.paging.PagedList.Config);
- ctor public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key!,Value!>, int);
- method public io.reactivex.Flowable<androidx.paging.PagedList<Value!>!> buildFlowable(io.reactivex.BackpressureStrategy);
- method public io.reactivex.Observable<androidx.paging.PagedList<Value!>!> buildObservable();
- method public androidx.paging.RxPagedListBuilder<Key!,Value!> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value!>?);
- method public androidx.paging.RxPagedListBuilder<Key!,Value!> setFetchScheduler(io.reactivex.Scheduler);
- method public androidx.paging.RxPagedListBuilder<Key!,Value!> setInitialLoadKey(Key?);
- method public androidx.paging.RxPagedListBuilder<Key!,Value!> setNotifyScheduler(io.reactivex.Scheduler);
+ ctor public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, androidx.paging.PagedList.Config config);
+ ctor public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, int pageSize);
+ method public io.reactivex.Flowable<androidx.paging.PagedList<Value>> buildFlowable(io.reactivex.BackpressureStrategy backpressureStrategy);
+ method public io.reactivex.Observable<androidx.paging.PagedList<Value>> buildObservable();
+ method public androidx.paging.RxPagedListBuilder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
+ method public androidx.paging.RxPagedListBuilder<Key,Value> setFetchScheduler(io.reactivex.Scheduler scheduler);
+ method public androidx.paging.RxPagedListBuilder<Key,Value> setInitialLoadKey(Key? key);
+ method public androidx.paging.RxPagedListBuilder<Key,Value> setNotifyScheduler(io.reactivex.Scheduler scheduler);
}
}
diff --git a/paging/rxjava2/build.gradle b/paging/rxjava2/build.gradle
index bec9e53..913c946 100644
--- a/paging/rxjava2/build.gradle
+++ b/paging/rxjava2/build.gradle
@@ -36,9 +36,10 @@
api(project(":paging:paging-common"))
api(project(":arch:core-runtime"))
api(RX_JAVA)
+ implementation(KOTLIN_STDLIB)
+ testImplementation project(':internal-testutils-common')
testImplementation(JUNIT)
- testImplementation(KOTLIN_STDLIB)
testImplementation(KOTLIN_TEST_COMMON)
}
diff --git a/paging/rxjava2/src/main/java/androidx/paging/RxDataSourceUtil.java b/paging/rxjava2/src/main/java/androidx/paging/RxDataSourceUtil.java
deleted file mode 100644
index b51cc105..0000000
--- a/paging/rxjava2/src/main/java/androidx/paging/RxDataSourceUtil.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * 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 androidx.paging;
-
-import android.annotation.SuppressLint;
-
-import androidx.annotation.NonNull;
-import androidx.concurrent.futures.ResolvableFuture;
-
-import com.google.common.util.concurrent.ListenableFuture;
-
-import java.util.concurrent.Executor;
-
-import io.reactivex.Scheduler;
-import io.reactivex.Single;
-import io.reactivex.disposables.CompositeDisposable;
-import io.reactivex.disposables.Disposable;
-import io.reactivex.functions.Action;
-import io.reactivex.functions.BiConsumer;
-import io.reactivex.functions.Consumer;
-
-class RxDataSourceUtil {
- private static class ListenableFutureDisposeListener implements Runnable {
- private final ListenableFuture mFuture;
- private final Disposable mDisposable;
-
- ListenableFutureDisposeListener(@NonNull ListenableFuture future,
- @NonNull Disposable disposable) {
- mFuture = future;
- mDisposable = disposable;
- }
-
- @Override
- public void run() {
- if (mFuture.isCancelled()) {
- mDisposable.dispose();
- }
- }
- }
-
- private static class ListenableFutureSubscribeConsumer implements Consumer<Disposable> {
- private CompositeDisposable mCompositeDisposable;
-
- ListenableFutureSubscribeConsumer(CompositeDisposable compositeDisposable) {
- mCompositeDisposable = compositeDisposable;
- }
-
- @Override
- public void accept(Disposable disposable) {
- mCompositeDisposable.add(disposable);
- }
- }
-
- private static class ListenableFutureDisposeAction<T> implements Action {
- private ResolvableFuture<T> mFuture;
-
- ListenableFutureDisposeAction(ResolvableFuture<T> future) {
- mFuture = future;
- }
-
- @Override
- public void run() {
- mFuture.cancel(true);
- }
- }
-
- private static class ListenableFutureBiConsumer<T> implements BiConsumer<T, Throwable> {
- private ResolvableFuture<T> mFuture;
-
- ListenableFutureBiConsumer(ResolvableFuture<T> future) {
- mFuture = future;
- }
-
- @Override
- public void accept(T data, Throwable throwable) {
- if (throwable != null) {
- mFuture.setException(throwable);
- } else {
- mFuture.set(data);
- }
- }
- }
-
- @SuppressLint("CheckResult")
- @SuppressWarnings("ResultOfMethodCallIgnored")
- @NonNull
- static <T> ListenableFuture<T> singleToListenableFuture(@NonNull Single<T> single,
- @NonNull Executor executor, @NonNull Scheduler scheduler) {
- final CompositeDisposable compositeDisposable = new CompositeDisposable();
- final ResolvableFuture<T> future = ResolvableFuture.create();
-
- future.addListener(new ListenableFutureDisposeListener(future, compositeDisposable),
- executor);
-
- single.subscribeOn(scheduler)
- .observeOn(scheduler)
- .doOnSubscribe(new ListenableFutureSubscribeConsumer(compositeDisposable))
- .doOnDispose(new ListenableFutureDisposeAction<>(future))
- .subscribe(new ListenableFutureBiConsumer<>(future));
-
- return future;
- }
-}
diff --git a/paging/rxjava2/src/main/java/androidx/paging/RxDataSourceUtil.kt b/paging/rxjava2/src/main/java/androidx/paging/RxDataSourceUtil.kt
new file mode 100644
index 0000000..596a76c
--- /dev/null
+++ b/paging/rxjava2/src/main/java/androidx/paging/RxDataSourceUtil.kt
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * 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 androidx.paging
+
+import android.annotation.SuppressLint
+import androidx.concurrent.futures.ResolvableFuture
+import com.google.common.util.concurrent.ListenableFuture
+import io.reactivex.Scheduler
+import io.reactivex.Single
+import io.reactivex.disposables.CompositeDisposable
+import io.reactivex.disposables.Disposable
+import io.reactivex.functions.Action
+import io.reactivex.functions.Consumer
+import java.util.concurrent.Executor
+
+private class ListenableFutureDisposeListener internal constructor(
+ private val future: ListenableFuture<*>,
+ private val disposable: Disposable
+) : Runnable {
+ override fun run() {
+ if (future.isCancelled) {
+ disposable.dispose()
+ }
+ }
+}
+
+private class ListenableFutureSubscribeConsumer internal constructor(
+ private val compositeDisposable: CompositeDisposable
+) : Consumer<Disposable> {
+ override fun accept(disposable: Disposable) {
+ compositeDisposable.add(disposable)
+ }
+}
+
+private class ListenableFutureDisposeAction<T> internal constructor(
+ private val future: ResolvableFuture<T>
+) : Action {
+ override fun run() {
+ future.cancel(true)
+ }
+}
+
+private class ListenableFutureSuccessConsumer<T> internal constructor(
+ private val future: ResolvableFuture<T>
+) : Consumer<T> {
+ override fun accept(data: T) {
+ future.set(data)
+ }
+}
+
+private class ListenableFutureErrorConsumer<T>
+internal constructor(private val future: ResolvableFuture<T>) : Consumer<Throwable> {
+ override fun accept(e: Throwable) {
+ future.setException(e)
+ }
+}
+
+@SuppressLint("CheckResult")
+internal fun <T> Single<T>.asListenableFuture(
+ executor: Executor,
+ scheduler: Scheduler
+): ListenableFuture<T> {
+ val compositeDisposable = CompositeDisposable()
+ val future = ResolvableFuture.create<T>()
+
+ future.addListener(ListenableFutureDisposeListener(future, compositeDisposable), executor)
+
+ val successConsumer = ListenableFutureSuccessConsumer(future)
+ val errorConsumer = ListenableFutureErrorConsumer(future)
+ subscribeOn(scheduler)
+ .observeOn(scheduler)
+ .doOnSubscribe(ListenableFutureSubscribeConsumer(compositeDisposable))
+ .doOnDispose(ListenableFutureDisposeAction(future))
+ .subscribe(successConsumer, errorConsumer)
+
+ return future
+}
diff --git a/paging/rxjava2/src/main/java/androidx/paging/RxItemKeyedDataSource.java b/paging/rxjava2/src/main/java/androidx/paging/RxItemKeyedDataSource.java
deleted file mode 100644
index 325a08e..0000000
--- a/paging/rxjava2/src/main/java/androidx/paging/RxItemKeyedDataSource.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * 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 androidx.paging;
-
-import androidx.annotation.NonNull;
-
-import com.google.common.util.concurrent.ListenableFuture;
-
-import java.util.concurrent.Executor;
-
-import io.reactivex.Scheduler;
-import io.reactivex.Single;
-
-abstract class RxItemKeyedDataSource<Key, Value> extends ListenableItemKeyedDataSource<Key, Value> {
- private Scheduler mScheduler;
-
- @Override
- @NonNull
- public final ListenableFuture<InitialResult<Value>> loadInitial(
- @NonNull LoadInitialParams<Key> params) {
- return RxDataSourceUtil.singleToListenableFuture(onLoadInitial(params),
- getExecutor(), getScheduler());
- }
-
- @Override
- @NonNull
- public final ListenableFuture<Result<Value>> loadAfter(@NonNull LoadParams<Key> params) {
- return RxDataSourceUtil.singleToListenableFuture(onLoadAfter(params),
- getExecutor(), getScheduler());
- }
-
- @Override
- @NonNull
- public final ListenableFuture<Result<Value>> loadBefore(@NonNull LoadParams<Key> params) {
- return RxDataSourceUtil.singleToListenableFuture(onLoadBefore(params),
- getExecutor(), getScheduler());
- }
-
- /**
- * An explicit getter is necessary to lazily init mScheduler as {@link DataSource#getExecutor()}
- * throws an error if it is accessed before this DataSource is added to a {@link PagedList} and
- * assigned an {@link Executor}.
- */
- private Scheduler getScheduler() {
- final Executor executor = getExecutor();
- if (mScheduler == null && executor instanceof Scheduler) {
- mScheduler = (Scheduler) getExecutor();
- } else if (mScheduler == null) {
- mScheduler = new ScheduledExecutor(getExecutor());
- }
-
- return mScheduler;
- }
-
- /**
- * Invoked to load initial data from this DataSource as a {@link Single}, e.g., when
- * initializing or resuming state of a {@link PagedList}.
- *
- * Rx-extension of the parent method:
- * {@link ListenableItemKeyedDataSource#loadInitial(
- *ListenableItemKeyedDataSource.LoadInitialParams)}.
- * <p>
- * The {@link Single} returned by this method will be
- * subscribed on this DataSource's executor, which is normally supplied via
- * {@link RxPagedListBuilder#setFetchScheduler(Scheduler)} or
- * {@link LivePagedListBuilder#setFetchExecutor(Executor)}.
- *
- * @param params Parameters for initial load, including initial key and requested size.
- * @return {@link Single} that receives the loaded data, its size, and any adjacent page keys.
- */
- @NonNull
- public abstract Single<InitialResult<Value>> onLoadInitial(
- @NonNull LoadInitialParams<Key> params);
-
- /**
- * Invoked to load a page of data to be appended to this DataSource as a {@link Single} with
- * the key specified by {@link ItemKeyedDataSource.LoadParams#key LoadParams.key}
- *
- * Rx-extension of the parent method:
- * {@link ListenableItemKeyedDataSource#loadAfter(ListenableItemKeyedDataSource.LoadParams)}.
- * <p>
- * It's valid to return a different list size than the page size if it's easier, e.g. if your
- * backend defines page sizes. It is generally preferred to increase the number loaded than
- * reduce.
- * <p>
- * If data cannot be loaded (for example, if the request is invalid, or the data would be stale
- * and inconsistent), it is valid to call {@link #invalidate()} to invalidate the data source,
- * and prevent further loading.
- * <p>
- * The {@link Single} returned by this method will be
- * subscribed on this DataSource's executor, which is normally supplied via
- * {@link RxPagedListBuilder#setFetchScheduler(Scheduler)} or
- * {@link LivePagedListBuilder#setFetchExecutor(Executor)}.
- *
- * @param params Parameters for the load, including the key to load after, and requested size.
- * @return {@link Single} that receives the loaded data.
- */
- @NonNull
- public abstract Single<Result<Value>> onLoadAfter(@NonNull LoadParams<Key> params);
-
- /**
- * Invoked to load a page of data to be prepended to this DataSource as a {@link Single} with
- * the key specified by {@link ItemKeyedDataSource.LoadParams#key LoadParams.key}.
- *
- * Rx-extension of the parent method:
- * {@link ListenableItemKeyedDataSource#loadBefore(ListenableItemKeyedDataSource.LoadParams)}.
- * <p>
- * It's valid to return a different list size than the page size if it's easier, e.g. if your
- * backend defines page sizes. It is generally preferred to increase the number loaded than
- * reduce.
- * <p>
- * <p class="note"><strong>Note:</strong> Data returned will be prepended just before the key
- * passed, so if you don't return a page of the requested size, ensure that the last item is
- * adjacent to the passed key.
- * It's valid to return a different list size than the page size if it's easier, e.g. if your
- * backend defines page sizes. It is generally preferred to increase the number loaded than
- * reduce.
- * <p>
- * If data cannot be loaded (for example, if the request is invalid, or the data would be stale
- * and inconsistent), it is valid to call {@link #invalidate()} to invalidate the data source,
- * and prevent further loading.
- * <p>
- * The {@link Single} returned by this method will be
- * subscribed on this DataSource's executor, which is normally supplied via
- * {@link RxPagedListBuilder#setFetchScheduler(Scheduler)} or
- * {@link LivePagedListBuilder#setFetchExecutor(Executor)}.
- *
- * @param params Parameters for the load, including the key to load before, and requested size.
- * @return {@link Single} that receives the loaded data.
- */
- @NonNull
- public abstract Single<Result<Value>> onLoadBefore(@NonNull LoadParams<Key> params);
-}
diff --git a/paging/rxjava2/src/main/java/androidx/paging/RxItemKeyedDataSource.kt b/paging/rxjava2/src/main/java/androidx/paging/RxItemKeyedDataSource.kt
new file mode 100644
index 0000000..5693f85
--- /dev/null
+++ b/paging/rxjava2/src/main/java/androidx/paging/RxItemKeyedDataSource.kt
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * 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 androidx.paging
+
+import io.reactivex.Scheduler
+import io.reactivex.Single
+
+internal abstract class RxItemKeyedDataSource<Key : Any, Value : Any> :
+ ListenableItemKeyedDataSource<Key, Value>() {
+
+ /**
+ * Must be lazily init as [DataSource.executor] throws an error if it is accessed before this
+ * DataSource is added to a [PagedList] and assigned an [java.util.concurrent.Executor].
+ */
+ private val scheduler: Scheduler by lazy {
+ when (executor) {
+ is Scheduler -> executor as Scheduler
+ else -> ScheduledExecutor(executor)
+ }
+ }
+
+ override fun loadInitial(params: LoadInitialParams<Key>) =
+ onLoadInitial(params).asListenableFuture(executor, scheduler)
+
+ override fun loadAfter(params: LoadParams<Key>) =
+ onLoadAfter(params).asListenableFuture(executor, scheduler)
+
+ override fun loadBefore(params: LoadParams<Key>) =
+ onLoadBefore(params).asListenableFuture(executor, scheduler)
+
+ /**
+ * Invoked to load initial data from this DataSource as a [Single], e.g., when initializing or
+ * resuming state of a [PagedList].
+ *
+ * Rx-extension of the parent method: [ListenableItemKeyedDataSource.loadInitial].
+ *
+ * The [Single] returned by this method will be subscribed on this DataSource's executor, which
+ * is normally supplied via [RxPagedListBuilder.setFetchScheduler] or
+ * [LivePagedListBuilder.setFetchExecutor].
+ *
+ * @param params Parameters for initial load, including initial key and requested size.
+ * @return [Single] that receives the loaded data, its size, and any adjacent page keys.
+ */
+ abstract fun onLoadInitial(params: LoadInitialParams<Key>): Single<InitialResult<Value>>
+
+ /**
+ * Invoked to load a page of data to be appended to this DataSource as a [Single] with the key
+ * specified by [LoadParams.key][ItemKeyedDataSource.LoadParams.key]
+ *
+ * Rx-extension of the parent method: [ListenableItemKeyedDataSource.loadAfter].
+ *
+ * It's valid to return a different list size than the page size if it's easier, e.g. if your
+ * backend defines page sizes. It is generally preferred to increase the number loaded than
+ * reduce.
+ *
+ * If data cannot be loaded (for example, if the request is invalid, or the data would be stale
+ * and inconsistent), it is valid to call [.invalidate] to invalidate the data source, and
+ * prevent further loading.
+ *
+ * The [Single] returned by this method will be subscribed on this DataSource's executor, which
+ * is normally supplied via [RxPagedListBuilder.setFetchScheduler] or
+ * [LivePagedListBuilder.setFetchExecutor].
+ *
+ * @param params Parameters for the load, including the key to load after, and requested size.
+ * @return [Single] that receives the loaded data.
+ */
+ abstract fun onLoadAfter(params: LoadParams<Key>): Single<Result<Value>>
+
+ /**
+ * Invoked to load a page of data to be prepended to this DataSource as a [Single] with the key
+ * specified by [LoadParams.key][ItemKeyedDataSource.LoadParams.key].
+ *
+ * Rx-extension of the parent method: [ListenableItemKeyedDataSource.loadBefore].
+ *
+ * It's valid to return a different list size than the page size if it's easier, e.g. if your
+ * backend defines page sizes. It is generally preferred to increase the number loaded than
+ * reduce.
+ *
+ * **Note:** Data returned will be prepended just before the key
+ * passed, so if you don't return a page of the requested size, ensure that the last item is
+ * adjacent to the passed key.
+ * It's valid to return a different list size than the page size if it's easier, e.g. if your
+ * backend defines page sizes. It is generally preferred to increase the number loaded than
+ * reduce.
+ *
+ * If data cannot be loaded (for example, if the request is invalid, or the data would be stale
+ * and inconsistent), it is valid to call [.invalidate] to invalidate the data source,
+ * and prevent further loading.
+ *
+ * The [Single] returned by this method will be subscribed on this DataSource's executor, which
+ * is normally supplied via [RxPagedListBuilder.setFetchScheduler] or
+ * [LivePagedListBuilder.setFetchExecutor].
+ *
+ * @param params Parameters for the load, including the key to load before, and requested size.
+ * @return [Single] that receives the loaded data.
+ */
+ abstract fun onLoadBefore(params: LoadParams<Key>): Single<Result<Value>>
+}
diff --git a/paging/rxjava2/src/main/java/androidx/paging/RxPageKeyedDataSource.java b/paging/rxjava2/src/main/java/androidx/paging/RxPageKeyedDataSource.java
deleted file mode 100644
index 8d3c9a7..0000000
--- a/paging/rxjava2/src/main/java/androidx/paging/RxPageKeyedDataSource.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * 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 androidx.paging;
-
-import androidx.annotation.NonNull;
-
-import com.google.common.util.concurrent.ListenableFuture;
-
-import java.util.concurrent.Executor;
-
-import io.reactivex.Scheduler;
-import io.reactivex.Single;
-
-abstract class RxPageKeyedDataSource<Key, Value> extends ListenablePageKeyedDataSource<Key, Value> {
- private Scheduler mScheduler;
-
- @Override
- @NonNull
- public final ListenableFuture<InitialResult<Key, Value>> loadInitial(
- @NonNull LoadInitialParams<Key> params) {
- return RxDataSourceUtil.singleToListenableFuture(onLoadInitial(params),
- getExecutor(), getScheduler());
- }
-
- @Override
- @NonNull
- public final ListenableFuture<Result<Key, Value>> loadAfter(@NonNull LoadParams<Key> params) {
- return RxDataSourceUtil.singleToListenableFuture(onLoadAfter(params),
- getExecutor(), getScheduler());
- }
-
- @Override
- @NonNull
- public final ListenableFuture<Result<Key, Value>> loadBefore(@NonNull LoadParams<Key> params) {
- return RxDataSourceUtil.singleToListenableFuture(onLoadBefore(params),
- getExecutor(), getScheduler());
- }
-
- /**
- * An explicit getter is necessary to lazily init mScheduler as {@link DataSource#getExecutor()}
- * throws an error if it is accessed before this DataSource is added to a {@link PagedList} and
- * assigned an {@link Executor}.
- */
- private Scheduler getScheduler() {
- if (mScheduler == null) {
- mScheduler = new ScheduledExecutor(getExecutor());
- }
-
- return mScheduler;
- }
-
- /**
- * Invoked to load initial data from this DataSource as a {@link Single}, e.g., when
- * initializing or resuming state of a {@link PagedList}.
- *
- * Rx-extension of the parent method:
- * {@link ListenablePageKeyedDataSource#loadInitial(
- *ListenablePageKeyedDataSource.LoadInitialParams)}.
- * <p>
- * The {@link Single} returned by this method will be
- * subscribed on this DataSource's executor, which is normally supplied via
- * {@link RxPagedListBuilder#setFetchScheduler(Scheduler)} or
- * {@link LivePagedListBuilder#setFetchExecutor(Executor)}.
- *
- * @param params Parameters for initial load, including requested start position, load size, and
- * page size.
- * @return {@link Single} that receives the loaded data, its size, and any adjacent page keys.
- */
- @NonNull
- public abstract Single<InitialResult<Key, Value>> onLoadInitial(LoadInitialParams<Key> params);
-
- /**
- * Invoked to load a page of data to be appended to this DataSource as a {@link Single} with
- * the key specified by {@link PageKeyedDataSource.LoadParams#key LoadParams.key}.
- *
- * Rx-extension of the parent method:
- * {@link ListenablePageKeyedDataSource#loadAfter(ListenablePageKeyedDataSource.LoadParams)}.
- * <p>
- * It's valid to return a different list size than the page size if it's easier, e.g. if your
- * backend defines page sizes. It is generally preferred to increase the number loaded than
- * reduce.
- * <p>
- * If data cannot be loaded (for example, if the request is invalid, or the data would be stale
- * and inconsistent), it is valid to call {@link #invalidate()} to invalidate the data source,
- * and prevent further loading.
- * <p>
- * The {@link Single} returned by this method will be
- * subscribed on this DataSource's executor, which is normally supplied via
- * {@link RxPagedListBuilder#setFetchScheduler(Scheduler)} or
- * {@link LivePagedListBuilder#setFetchExecutor(Executor)}.
- *
- * @param params Parameters for the load, including the key for the new page, and requested load
- * size.
- * @return {@link Single} that receives the loaded data.
- */
- @NonNull
- public abstract Single<Result<Key, Value>> onLoadAfter(LoadParams<Key> params);
-
- /**
- * Invoked to load a page of data to be prepended to this DataSource as a {@link Single} with
- * the key specified by {@link PageKeyedDataSource.LoadParams#key LoadParams.key}.
- *
- * Rx-extension of the parent method:
- * {@link ListenablePageKeyedDataSource#loadBefore(ListenablePageKeyedDataSource.LoadParams)}.
- * <p>
- * It's valid to return a different list size than the page size if it's easier, e.g. if your
- * backend defines page sizes. It is generally preferred to increase the number loaded than
- * reduce.
- * <p>
- * If data cannot be loaded (for example, if the request is invalid, or the data would be stale
- * and inconsistent), it is valid to call {@link #invalidate()} to invalidate the data source,
- * and prevent further loading.
- * <p>
- * The {@link Single} returned by this method will be
- * subscribed on this DataSource's executor, which is normally supplied via
- * {@link RxPagedListBuilder#setFetchScheduler(Scheduler)} or
- * {@link LivePagedListBuilder#setFetchExecutor(Executor)}.
- *
- * @param params Parameters for the load, including the key for the new page, and requested load
- * size.
- * @return {@link Single} that receives the loaded data.
- */
- @NonNull
- public abstract Single<Result<Key, Value>> onLoadBefore(LoadParams<Key> params);
-}
diff --git a/paging/rxjava2/src/main/java/androidx/paging/RxPageKeyedDataSource.kt b/paging/rxjava2/src/main/java/androidx/paging/RxPageKeyedDataSource.kt
new file mode 100644
index 0000000..0f1e7b5
--- /dev/null
+++ b/paging/rxjava2/src/main/java/androidx/paging/RxPageKeyedDataSource.kt
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * 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 androidx.paging
+
+import com.google.common.util.concurrent.ListenableFuture
+import io.reactivex.Scheduler
+import io.reactivex.Single
+import java.util.concurrent.Executor
+
+internal abstract class RxPageKeyedDataSource<Key : Any, Value : Any> :
+ ListenablePageKeyedDataSource<Key, Value>() {
+
+ /**
+ * Must be lazily init as [DataSource.executor] throws an error if it is accessed before this
+ * DataSource is added to a [PagedList] and assigned an [Executor].
+ */
+ private val scheduler: Scheduler by lazy {
+ when (executor) {
+ is Scheduler -> executor as Scheduler
+ else -> ScheduledExecutor(executor)
+ }
+ }
+
+ override fun loadInitial(params: LoadInitialParams<Key>) =
+ onLoadInitial(params).asListenableFuture(executor, scheduler)
+
+ override fun loadAfter(params: LoadParams<Key>) =
+ onLoadAfter(params).asListenableFuture(executor, scheduler)
+
+ override fun loadBefore(params: LoadParams<Key>): ListenableFuture<Result<Key, Value>> =
+ onLoadBefore(params).asListenableFuture(executor, scheduler)
+
+ /**
+ * Invoked to load initial data from this DataSource as a [Single], e.g., when initializing or
+ * resuming state of a [PagedList].
+ *
+ * Rx-extension of the parent method: [ListenablePageKeyedDataSource.loadInitial].
+ *
+ * The [Single] returned by this method will be
+ * subscribed on this DataSource's executor, which is normally supplied via
+ * [RxPagedListBuilder.setFetchScheduler] or [LivePagedListBuilder.setFetchExecutor].
+ *
+ * @param params Parameters for initial load, including requested start position, load size, and
+ * page size.
+ * @return [Single] that receives the loaded data, its size, and any adjacent page keys.
+ */
+ abstract fun onLoadInitial(params: LoadInitialParams<Key>): Single<InitialResult<Key, Value>>
+
+ /**
+ * Invoked to load a page of data to be appended to this DataSource as a [Single] with
+ * the key specified by [LoadParams.key][PageKeyedDataSource.LoadParams.key].
+ *
+ * Rx-extension of the parent method: [ListenablePageKeyedDataSource.loadAfter].
+ *
+ * It's valid to return a different list size than the page size if it's easier, e.g. if your
+ * backend defines page sizes. It is generally preferred to increase the number loaded than
+ * reduce.
+ *
+ * If data cannot be loaded (for example, if the request is invalid, or the data would be stale
+ * and inconsistent), it is valid to call [.invalidate] to invalidate the data source,
+ * and prevent further loading.
+ *
+ * The [Single] returned by this method will be subscribed on this DataSource's executor,
+ * which is normally supplied via [RxPagedListBuilder.setFetchScheduler] or
+ * [LivePagedListBuilder.setFetchExecutor].
+ *
+ * @param params Parameters for the load, including the key for the new page, and requested load
+ * size.
+ * @return [Single] that receives the loaded data.
+ */
+ abstract fun onLoadAfter(params: LoadParams<Key>): Single<Result<Key, Value>>
+
+ /**
+ * Invoked to load a page of data to be prepended to this DataSource as a [Single] with the key
+ * specified by [LoadParams.key][PageKeyedDataSource.LoadParams.key].
+ *
+ * Rx-extension of the parent method: [ListenablePageKeyedDataSource.loadBefore].
+ *
+ * It's valid to return a different list size than the page size if it's easier, e.g. if your
+ * backend defines page sizes. It is generally preferred to increase the number loaded than
+ * reduce.
+ *
+ * If data cannot be loaded (for example, if the request is invalid, or the data would be stale
+ * and inconsistent), it is valid to call [.invalidate] to invalidate the data source, and
+ * prevent further loading.
+ *
+ * The [Single] returned by this method will be subscribed on this DataSource's executor, which
+ * is normally supplied via [RxPagedListBuilder.setFetchScheduler] or
+ * [LivePagedListBuilder.setFetchExecutor].
+ *
+ * @param params Parameters for the load, including the key for the new page, and requested load
+ * size.
+ * @return [Single] that receives the loaded data.
+ */
+ abstract fun onLoadBefore(params: LoadParams<Key>): Single<Result<Key, Value>>
+}
diff --git a/paging/rxjava2/src/main/java/androidx/paging/RxPagedListBuilder.java b/paging/rxjava2/src/main/java/androidx/paging/RxPagedListBuilder.java
deleted file mode 100644
index 271a56d..0000000
--- a/paging/rxjava2/src/main/java/androidx/paging/RxPagedListBuilder.java
+++ /dev/null
@@ -1,336 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * 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 androidx.paging;
-
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.arch.core.executor.ArchTaskExecutor;
-
-import java.util.concurrent.Executor;
-
-import io.reactivex.BackpressureStrategy;
-import io.reactivex.Flowable;
-import io.reactivex.Observable;
-import io.reactivex.ObservableEmitter;
-import io.reactivex.ObservableOnSubscribe;
-import io.reactivex.Scheduler;
-import io.reactivex.functions.Cancellable;
-
-/**
- * Builder for {@code Observable<PagedList>} or {@code Flowable<PagedList>}, given a
- * {@link androidx.paging.DataSource.Factory} and a {@link androidx.paging.PagedList.Config}.
- * <p>
- * The required parameters are in the constructor, so you can simply construct and build, or
- * optionally enable extra features (such as initial load key, or BoundaryCallback).
- * <p>
- * The returned observable/flowable will already be subscribed on the
- * {@link #setFetchScheduler(Scheduler)}, and will perform all loading on that scheduler. It will
- * already be observed on {@link #setNotifyScheduler(Scheduler)}, and will dispatch new PagedLists,
- * as well as their updates to that scheduler.
- *
- * @param <Key> Type of input valued used to load data from the DataSource. Must be integer if
- * you're using PositionalDataSource.
- * @param <Value> Item type being presented.
- */
-public final class RxPagedListBuilder<Key, Value> {
- private Key mInitialLoadKey;
- private PagedList.Config mConfig;
- private DataSource.Factory<Key, Value> mDataSourceFactory;
- private PagedList.BoundaryCallback mBoundaryCallback;
- private Executor mNotifyExecutor;
- private Scheduler mNotifyScheduler;
- private Executor mFetchExecutor;
- private Scheduler mFetchScheduler;
-
- /**
- * Creates a RxPagedListBuilder with required parameters.
- *
- * @param dataSourceFactory DataSource factory providing DataSource generations.
- * @param config Paging configuration.
- */
- public RxPagedListBuilder(@NonNull DataSource.Factory<Key, Value> dataSourceFactory,
- @NonNull PagedList.Config config) {
- //noinspection ConstantConditions
- if (config == null) {
- throw new IllegalArgumentException("PagedList.Config must be provided");
- }
- //noinspection ConstantConditions
- if (dataSourceFactory == null) {
- throw new IllegalArgumentException("DataSource.Factory must be provided");
- }
- mDataSourceFactory = dataSourceFactory;
- mConfig = config;
- }
-
- /**
- * Creates a RxPagedListBuilder with required parameters.
- *
- * This method is a convenience for:
- * <pre>
- * RxPagedListBuilder(dataSourceFactory,
- * new PagedList.Config.Builder().setPageSize(pageSize).build())
- * </pre>
- *
- * @param dataSourceFactory DataSource.Factory providing DataSource generations.
- * @param pageSize Size of pages to load.
- */
- @SuppressWarnings("unused")
- public RxPagedListBuilder(
- @NonNull DataSource.Factory<Key, Value> dataSourceFactory,
- int pageSize
- ) {
- this(dataSourceFactory, new PagedList.Config.Builder().setPageSize(pageSize).build());
- }
-
- /**
- * First loading key passed to the first PagedList/DataSource.
- *
- * When a new PagedList/DataSource pair is created after the first, it acquires a load key from
- * the previous generation so that data is loaded around the position already being observed.
- *
- * @param key Initial load key passed to the first PagedList/DataSource.
- * @return this
- */
- @SuppressWarnings("unused")
- @NonNull
- public RxPagedListBuilder<Key, Value> setInitialLoadKey(@Nullable Key key) {
- mInitialLoadKey = key;
- return this;
- }
-
- /**
- * Sets a {@link androidx.paging.PagedList.BoundaryCallback} on each PagedList created,
- * typically used to load additional data from network when paging from local storage.
- *
- * Pass a BoundaryCallback to listen to when the PagedList runs out of data to load. If this
- * method is not called, or {@code null} is passed, you will not be notified when each
- * DataSource runs out of data to provide to its PagedList.
- * <p>
- * If you are paging from a DataSource.Factory backed by local storage, you can set a
- * BoundaryCallback to know when there is no more information to page from local storage.
- * This is useful to page from the network when local storage is a cache of network data.
- * <p>
- * Note that when using a BoundaryCallback with a {@code Observable<PagedList>}, method calls
- * on the callback may be dispatched multiple times - one for each PagedList/DataSource
- * pair. If loading network data from a BoundaryCallback, you should prevent multiple
- * dispatches of the same method from triggering multiple simultaneous network loads.
- *
- * @param boundaryCallback The boundary callback for listening to PagedList load state.
- * @return this
- */
- @SuppressWarnings("unused")
- @NonNull
- public RxPagedListBuilder<Key, Value> setBoundaryCallback(
- @Nullable PagedList.BoundaryCallback<Value> boundaryCallback) {
- mBoundaryCallback = boundaryCallback;
- return this;
- }
-
- /**
- * Sets scheduler which will be used for observing new PagedLists, as well as loading updates
- * within the PagedLists.
- *
- * If not set, defaults to the UI thread.
- * <p>
- * The built observable/flowable will be observed on this scheduler, so that the thread
- * receiving PagedLists will also receive the internal updates to the PagedList.
- *
- * @param scheduler Scheduler that receives PagedList updates, and where
- * {@link androidx.paging.PagedList.Callback} calls are dispatched. Generally,
- * this is the UI/main thread.
- * @return this
- */
- @NonNull
- public RxPagedListBuilder<Key, Value> setNotifyScheduler(final @NonNull Scheduler scheduler) {
- if (scheduler instanceof Executor) {
- mNotifyExecutor = (ScheduledExecutor) scheduler;
- } else {
- mNotifyExecutor = new ScheduledExecutor(scheduler);
- }
- mNotifyScheduler = scheduler;
- return this;
- }
-
- /**
- * Sets scheduler which will be used for background fetching of PagedLists, as well as on-demand
- * fetching of pages inside.
- *
- * If not set, defaults to the Arch components I/O thread pool.
- * <p>
- * The built observable/flowable will be subscribed on this scheduler.
- *
- * @param scheduler Scheduler used to fetch from DataSources, generally a background
- * thread pool for e.g. I/O or network loading.
- * @return this
- */
- @SuppressWarnings("unused")
- @NonNull
- public RxPagedListBuilder<Key, Value> setFetchScheduler(final @NonNull Scheduler scheduler) {
- if (scheduler instanceof ScheduledExecutor) {
- mFetchExecutor = (ScheduledExecutor) scheduler;
- } else {
- mFetchExecutor = new ScheduledExecutor(scheduler);
- }
- mFetchScheduler = scheduler;
- return this;
- }
-
- /**
- * Constructs a {@code Observable<PagedList>}.
- *
- * The returned Observable will already be observed on the
- * {@link #setNotifyScheduler(Scheduler) notify scheduler}, and subscribed on the
- * {@link #setFetchScheduler(Scheduler) fetch scheduler}.
- *
- * @return The Observable of PagedLists
- */
- @NonNull
- public Observable<PagedList<Value>> buildObservable() {
- if (mNotifyExecutor == null) {
- ScheduledExecutor scheduledExecutor = new ScheduledExecutor(
- ArchTaskExecutor.getMainThreadExecutor());
- mNotifyExecutor = scheduledExecutor;
- mNotifyScheduler = scheduledExecutor;
- }
- if (mFetchExecutor == null) {
- ScheduledExecutor scheduledExecutor = new ScheduledExecutor(
- ArchTaskExecutor.getIOThreadExecutor());
- mFetchExecutor = scheduledExecutor;
- mFetchScheduler = scheduledExecutor;
- }
- return Observable.create(new PagingObservableOnSubscribe<>(
- mInitialLoadKey,
- mConfig,
- mBoundaryCallback,
- mDataSourceFactory,
- mNotifyExecutor,
- mFetchExecutor))
- .observeOn(mNotifyScheduler)
- .subscribeOn(mFetchScheduler);
- }
-
- /**
- * Constructs a {@code Flowable<PagedList>}.
- *
- * The returned Observable will already be observed on the
- * {@link #setNotifyScheduler(Scheduler) notify scheduler}, and subscribed on the
- * {@link #setFetchScheduler(Scheduler) fetch scheduler}.
- *
- * @param backpressureStrategy BackpressureStrategy for the Flowable to use.
- * @return The Flowable of PagedLists
- */
- @NonNull
- public Flowable<PagedList<Value>> buildFlowable(
- @NonNull BackpressureStrategy backpressureStrategy) {
- return buildObservable()
- .toFlowable(backpressureStrategy);
- }
-
- static class PagingObservableOnSubscribe<Key, Value>
- implements ObservableOnSubscribe<PagedList<Value>>, DataSource.InvalidatedCallback,
- Cancellable,
- Runnable {
-
- @Nullable
- private final Key mInitialLoadKey;
- @NonNull
- private final PagedList.Config mConfig;
- @Nullable
- private final PagedList.BoundaryCallback mBoundaryCallback;
- @NonNull
- private final DataSource.Factory<Key, Value> mDataSourceFactory;
- @NonNull
- private final Executor mNotifyExecutor;
- @NonNull
- private final Executor mFetchExecutor;
-
- @Nullable
- private PagedList<Value> mList;
- @Nullable
- private DataSource<Key, Value> mDataSource;
-
- private ObservableEmitter<PagedList<Value>> mEmitter;
-
- PagingObservableOnSubscribe(@Nullable Key initialLoadKey,
- @NonNull PagedList.Config config,
- @Nullable PagedList.BoundaryCallback boundaryCallback,
- @NonNull DataSource.Factory<Key, Value> dataSourceFactory,
- @NonNull Executor notifyExecutor,
- @NonNull Executor fetchExecutor) {
- mInitialLoadKey = initialLoadKey;
- mConfig = config;
- mBoundaryCallback = boundaryCallback;
- mDataSourceFactory = dataSourceFactory;
- mNotifyExecutor = notifyExecutor;
- mFetchExecutor = fetchExecutor;
- }
-
- @Override
- public void subscribe(ObservableEmitter<PagedList<Value>> emitter) {
- mEmitter = emitter;
- mEmitter.setCancellable(this);
-
- // known that subscribe is already on fetchScheduler
- mEmitter.onNext(createPagedList());
- }
-
- @Override
- public void cancel() {
- if (mDataSource != null) {
- mDataSource.removeInvalidatedCallback(this);
- }
- }
-
- @Override
- public void run() {
- // fetch data, run on fetchExecutor
- mEmitter.onNext(createPagedList());
- }
-
- @Override
- public void onInvalidated() {
- if (!mEmitter.isDisposed()) {
- mFetchExecutor.execute(this);
- }
- }
-
- @SuppressWarnings({"unchecked", "deprecation"}) // for getLastKey cast, and Builder.build()
- private PagedList<Value> createPagedList() {
- @Nullable Key initializeKey = mInitialLoadKey;
- if (mList != null) {
- initializeKey = (Key) mList.getLastKey();
- }
-
- do {
- if (mDataSource != null) {
- mDataSource.removeInvalidatedCallback(this);
- }
- mDataSource = mDataSourceFactory.create();
- mDataSource.addInvalidatedCallback(this);
-
- mList = new PagedList.Builder<>(mDataSource, mConfig)
- .setNotifyExecutor(mNotifyExecutor)
- .setFetchExecutor(mFetchExecutor)
- .setBoundaryCallback(mBoundaryCallback)
- .setInitialKey(initializeKey)
- .build();
- } while (mList.isDetached());
- return mList;
- }
- }
-}
diff --git a/paging/rxjava2/src/main/java/androidx/paging/RxPagedListBuilder.kt b/paging/rxjava2/src/main/java/androidx/paging/RxPagedListBuilder.kt
new file mode 100644
index 0000000..14d5f8f
--- /dev/null
+++ b/paging/rxjava2/src/main/java/androidx/paging/RxPagedListBuilder.kt
@@ -0,0 +1,262 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * 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 androidx.paging
+
+import androidx.arch.core.executor.ArchTaskExecutor
+import io.reactivex.BackpressureStrategy
+import io.reactivex.Flowable
+import io.reactivex.Observable
+import io.reactivex.ObservableEmitter
+import io.reactivex.ObservableOnSubscribe
+import io.reactivex.Scheduler
+import io.reactivex.functions.Cancellable
+import java.util.concurrent.Executor
+
+/**
+ * Builder for `Observable<PagedList>` or `Flowable<PagedList>`, given a [DataSource.Factory] and a
+ * [PagedList.Config].
+ *
+ * The required parameters are in the constructor, so you can simply construct and build, or
+ * optionally enable extra features (such as initial load key, or BoundaryCallback).
+ *
+ * The returned observable/flowable will already be subscribed on the [setFetchScheduler], and will
+ * perform all loading on that scheduler. It will already be observed on [setNotifyScheduler], and
+ * will dispatch new PagedLists, as well as their updates to that scheduler.
+ *
+ * @param Key Type of input valued used to load data from the DataSource. Must be integer if you're
+ * using PositionalDataSource.
+ * @param Value Item type being presented.
+ *
+ * @constructor Creates a RxPagedListBuilder with required parameters.
+ * @param dataSourceFactory DataSource factory providing DataSource generations.
+ * @param config Paging configuration.
+ */
+class RxPagedListBuilder<Key : Any, Value : Any>(
+ private val dataSourceFactory: DataSource.Factory<Key, Value>,
+ private val config: PagedList.Config
+) {
+ private var initialLoadKey: Key? = null
+ private var boundaryCallback: PagedList.BoundaryCallback<Value>? = null
+ private lateinit var notifyExecutor: Executor
+ private lateinit var notifyScheduler: Scheduler
+ private lateinit var fetchExecutor: Executor
+ private lateinit var fetchScheduler: Scheduler
+
+ /**
+ * Creates a RxPagedListBuilder with required parameters.
+ *
+ * This method is a convenience for:
+ * ```
+ * RxPagedListBuilder(dataSourceFactory,
+ * new PagedList.Config.Builder().setPageSize(pageSize).build())
+ * ```
+ *
+ * @param dataSourceFactory [DataSource.Factory] providing DataSource generations.
+ * @param pageSize Size of pages to load.
+ */
+ constructor(dataSourceFactory: DataSource.Factory<Key, Value>, pageSize: Int) : this(
+ dataSourceFactory,
+ PagedList.Config.Builder().setPageSize(pageSize).build()
+ )
+
+ /**
+ * First loading key passed to the first PagedList/DataSource.
+ *
+ * When a new PagedList/DataSource pair is created after the first, it acquires a load key from
+ * the previous generation so that data is loaded around the position already being observed.
+ *
+ * @param key Initial load key passed to the first PagedList/DataSource.
+ * @return this
+ */
+ fun setInitialLoadKey(key: Key?) = apply {
+ initialLoadKey = key
+ }
+
+ /**
+ * Sets a [androidx.paging.PagedList.BoundaryCallback] on each PagedList created,
+ * typically used to load additional data from network when paging from local storage.
+ *
+ * Pass a BoundaryCallback to listen to when the PagedList runs out of data to load. If this
+ * method is not called, or `null` is passed, you will not be notified when each
+ * DataSource runs out of data to provide to its PagedList.
+ *
+ * If you are paging from a DataSource.Factory backed by local storage, you can set a
+ * BoundaryCallback to know when there is no more information to page from local storage.
+ * This is useful to page from the network when local storage is a cache of network data.
+ *
+ * Note that when using a BoundaryCallback with a `Observable<PagedList>`, method calls
+ * on the callback may be dispatched multiple times - one for each PagedList/DataSource
+ * pair. If loading network data from a BoundaryCallback, you should prevent multiple
+ * dispatches of the same method from triggering multiple simultaneous network loads.
+ *
+ * @param boundaryCallback The boundary callback for listening to PagedList load state.
+ * @return this
+ */
+ fun setBoundaryCallback(boundaryCallback: PagedList.BoundaryCallback<Value>?) = apply {
+ this.boundaryCallback = boundaryCallback
+ }
+
+ /**
+ * Sets scheduler which will be used for observing new PagedLists, as well as loading updates
+ * within the PagedLists.
+ *
+ * If not set, defaults to the UI thread.
+ *
+ * The built observable/flowable will be observed on this scheduler, so that the thread
+ * receiving PagedLists will also receive the internal updates to the PagedList.
+ *
+ * @param scheduler Scheduler that receives PagedList updates, and where [PagedList.Callback]
+ * calls are dispatched. Generally, this is the UI/main thread.
+ * @return this
+ */
+ fun setNotifyScheduler(scheduler: Scheduler) = apply {
+ notifyExecutor = when (scheduler) {
+ is Executor -> scheduler
+ else -> ScheduledExecutor(scheduler)
+ }
+ notifyScheduler = scheduler
+ }
+
+ /**
+ * Sets scheduler which will be used for background fetching of PagedLists, as well as on-demand
+ * fetching of pages inside.
+ *
+ * If not set, defaults to the Arch components I/O thread pool.
+ *
+ * The built observable/flowable will be subscribed on this scheduler.
+ *
+ * @param scheduler Scheduler used to fetch from DataSources, generally a background
+ * thread pool for e.g. I/O or network loading.
+ * @return this
+ */
+ fun setFetchScheduler(scheduler: Scheduler) = apply {
+ fetchExecutor = when (scheduler) {
+ is Executor -> scheduler
+ else -> ScheduledExecutor(scheduler)
+ }
+ fetchScheduler = scheduler
+ }
+
+ /**
+ * Constructs a `Observable<PagedList>`.
+ *
+ * The returned Observable will already be observed on the
+ * [notify scheduler][.setNotifyScheduler], and subscribed on the
+ * [fetch scheduler][.setFetchScheduler].
+ *
+ * @return The Observable of PagedLists
+ */
+ fun buildObservable(): Observable<PagedList<Value>> {
+ if (!::notifyExecutor.isInitialized) {
+ val scheduledExecutor = ScheduledExecutor(ArchTaskExecutor.getMainThreadExecutor())
+ notifyExecutor = scheduledExecutor
+ notifyScheduler = scheduledExecutor
+ }
+ if (!::fetchExecutor.isInitialized) {
+ val scheduledExecutor = ScheduledExecutor(ArchTaskExecutor.getIOThreadExecutor())
+ fetchExecutor = scheduledExecutor
+ fetchScheduler = scheduledExecutor
+ }
+
+ return Observable
+ .create(
+ PagingObservableOnSubscribe(
+ initialLoadKey,
+ config,
+ boundaryCallback,
+ dataSourceFactory,
+ notifyExecutor,
+ fetchExecutor
+ )
+ )
+ .observeOn(notifyScheduler)
+ .subscribeOn(fetchScheduler)
+ }
+
+ /**
+ * Constructs a `Flowable<PagedList>`.
+ *
+ * The returned Observable will already be observed on the [notifyScheduler], and subscribed on
+ * the [fetchScheduler].
+ *
+ * @param backpressureStrategy BackpressureStrategy for the Flowable to use.
+ * @return The [Flowable] of PagedLists
+ */
+ fun buildFlowable(backpressureStrategy: BackpressureStrategy): Flowable<PagedList<Value>> {
+ return buildObservable().toFlowable(backpressureStrategy)
+ }
+
+ internal class PagingObservableOnSubscribe<Key : Any, Value : Any>(
+ private val initialLoadKey: Key?,
+ private val config: PagedList.Config,
+ private val boundaryCallback: PagedList.BoundaryCallback<Value>?,
+ private val dataSourceFactory: DataSource.Factory<Key, Value>,
+ private val notifyExecutor: Executor,
+ private val fetchExecutor: Executor
+ ) : ObservableOnSubscribe<PagedList<Value>>, DataSource.InvalidatedCallback, Cancellable,
+ Runnable {
+
+ private lateinit var list: PagedList<Value>
+ private var dataSource: DataSource<Key, Value>? = null
+ private lateinit var emitter: ObservableEmitter<PagedList<Value>>
+
+ override fun subscribe(emitter: ObservableEmitter<PagedList<Value>>) {
+ this.emitter = emitter
+ emitter.setCancellable(this)
+
+ // known that subscribe is already on fetchScheduler
+ emitter.onNext(createPagedList())
+ }
+
+ override fun cancel() {
+ dataSource?.removeInvalidatedCallback(this)
+ }
+
+ override fun run() {
+ // fetch data, run on fetchExecutor
+ emitter.onNext(createPagedList())
+ }
+
+ override fun onInvalidated() {
+ if (!emitter.isDisposed) {
+ fetchExecutor.execute(this)
+ }
+ }
+
+ // for getLastKey cast, and Builder.build()
+ private fun createPagedList(): PagedList<Value> {
+ @Suppress("UNCHECKED_CAST")
+ val initializeKey = if (::list.isInitialized) list.lastKey as Key? else initialLoadKey
+
+ do {
+ dataSource?.removeInvalidatedCallback(this)
+ val newDataSource = dataSourceFactory.create()
+ newDataSource.addInvalidatedCallback(this)
+ dataSource = newDataSource
+
+ @Suppress("DEPRECATION")
+ list = PagedList.Builder(newDataSource, config)
+ .setNotifyExecutor(notifyExecutor)
+ .setFetchExecutor(fetchExecutor)
+ .setBoundaryCallback(boundaryCallback)
+ .setInitialKey(initializeKey)
+ .build()
+ } while (list.isDetached)
+ return list
+ }
+ }
+}
diff --git a/paging/rxjava2/src/main/java/androidx/paging/RxPositionalDataSource.java b/paging/rxjava2/src/main/java/androidx/paging/RxPositionalDataSource.java
deleted file mode 100644
index 9c68c9f..0000000
--- a/paging/rxjava2/src/main/java/androidx/paging/RxPositionalDataSource.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * 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 androidx.paging;
-
-import androidx.annotation.NonNull;
-
-import com.google.common.util.concurrent.ListenableFuture;
-
-import io.reactivex.Scheduler;
-import io.reactivex.Single;
-
-abstract class RxPositionalDataSource<T> extends ListenablePositionalDataSource<T> {
- private Scheduler mScheduler;
-
- @Override
- @NonNull
- public final ListenableFuture<InitialResult<T>> loadInitial(
- @NonNull final LoadInitialParams params) {
- return RxDataSourceUtil.singleToListenableFuture(onLoadInitial(params),
- getExecutor(), getScheduler());
- }
-
- @Override
- @NonNull
- public final ListenableFuture<RangeResult<T>> loadRange(@NonNull final LoadRangeParams params) {
- return RxDataSourceUtil.singleToListenableFuture(onLoadRange(params),
- getExecutor(), getScheduler());
- }
-
- /**
- * An explicit getter is necessary to lazily init mScheduler as {@link DataSource#getExecutor()}
- * throws an error if it is accessed before this DataSource is added to a {@link PagedList} and
- * assigned an {@link Executor}.
- */
- private Scheduler getScheduler() {
- if (mScheduler == null) {
- mScheduler = new ScheduledExecutor(getExecutor());
- }
-
- return mScheduler;
- }
-
- /**
- * Invoked to load initial data from this DataSource as a {@link Single}, e.g., when
- * initializing or resuming state of a {@link PagedList}.
- *
- * Rx-extension of the parent method:
- * {@link ListenablePositionalDataSource#loadInitial(
- *ListenablePositionalDataSource.LoadInitialParams)}.
- * <p>
- * This method is called to load the initial page(s) from the DataSource.
- * <p>
- * Result list must be a multiple of pageSize to enable efficient tiling.
- * <p>
- * The {@link Single} returned by this method will be
- * subscribed on this DataSource's executor, which is normally supplied via
- * {@link RxPagedListBuilder#setFetchScheduler(Scheduler)} or
- * {@link LivePagedListBuilder#setFetchExecutor(Executor)}.
- *
- * @param params Parameters for initial load, including requested start position, load size, and
- * page size.
- * @return {@link Single} that receives the loaded data, including position and total data
- * set size.
- */
- @NonNull
- public abstract Single<InitialResult<T>> onLoadInitial(LoadInitialParams params);
-
- /**
- * Invoked to load a range of data from this DataSource as a {@link Single}.
- *
- * Rx-extension of the parent method:
- * {@link ListenablePositionalDataSource#loadRange(
- *ListenablePositionalDataSource.LoadRangeParams)}.
- * <p>
- * This method is called to load additional pages from the DataSource after the
- * LoadInitialCallback passed to dispatchLoadInitial has initialized a PagedList.
- * <p>
- * Unlike {@link #loadInitial(LoadInitialParams)}, this method must return
- * the number of items requested, at the position requested.
- * <p>
- * The {@link Single} returned by this method will be
- * subscribed on this DataSource's executor, which is normally supplied via
- * {@link RxPagedListBuilder#setFetchScheduler(Scheduler)} or
- * {@link LivePagedListBuilder#setFetchExecutor(Executor)}.
- *
- * @param params Parameters for load, including start position and load size.
- * @return {@link Single} that receives the loaded data.
- */
- @NonNull
- public abstract Single<RangeResult<T>> onLoadRange(LoadRangeParams params);
-}
diff --git a/paging/rxjava2/src/main/java/androidx/paging/RxPositionalDataSource.kt b/paging/rxjava2/src/main/java/androidx/paging/RxPositionalDataSource.kt
new file mode 100644
index 0000000..6ecf405
--- /dev/null
+++ b/paging/rxjava2/src/main/java/androidx/paging/RxPositionalDataSource.kt
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * 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 androidx.paging
+
+import com.google.common.util.concurrent.ListenableFuture
+
+import io.reactivex.Scheduler
+import io.reactivex.Single
+
+internal abstract class RxPositionalDataSource<T : Any> : ListenablePositionalDataSource<T>() {
+ /**
+ * Must be lazily init as [DataSource.executor] throws an error if it is accessed before this
+ * DataSource is added to a [PagedList] and assigned an [java.util.concurrent.Executor].
+ */
+ private val scheduler: Scheduler by lazy {
+ when (executor) {
+ is Scheduler -> executor as Scheduler
+ else -> ScheduledExecutor(executor)
+ }
+ }
+
+ override fun loadInitial(params: LoadInitialParams): ListenableFuture<InitialResult<T>> =
+ onLoadInitial(params).asListenableFuture(executor, scheduler)
+
+ override fun loadRange(params: LoadRangeParams) =
+ onLoadRange(params).asListenableFuture(executor, scheduler)
+
+ /**
+ * Invoked to load initial data from this DataSource as a [Single], e.g., when initializing or
+ * resuming state of a [PagedList].
+ *
+ * Rx-extension of the parent method:
+ * [ListenablePositionalDataSource.loadInitial].
+ *
+ * This method is called to load the initial page(s) from the DataSource.
+ *
+ * Result list must be a multiple of pageSize to enable efficient tiling.
+ *
+ * The [Single] returned by this method will be subscribed on this DataSource's executor, which
+ * is normally supplied via [RxPagedListBuilder.setFetchScheduler] or
+ * [LivePagedListBuilder.setFetchExecutor].
+ *
+ * @param params Parameters for initial load, including requested start position, load size, and
+ * page size.
+ * @return [Single] that receives the loaded data, including position and total data
+ * set size.
+ */
+ abstract fun onLoadInitial(params: LoadInitialParams): Single<InitialResult<T>>
+
+ /**
+ * Invoked to load a range of data from this DataSource as a [Single].
+ *
+ * Rx-extension of the parent method: [ListenablePositionalDataSource.loadRange].
+ *
+ * This method is called to load additional pages from the DataSource after the
+ * LoadInitialCallback passed to dispatchLoadInitial has initialized a PagedList.
+ *
+ * Unlike [loadInitial], this method must return the number of items requested, at the position
+ * requested.
+ *
+ * The [Single] returned by this method will be subscribed on this DataSource's executor, which
+ * is normally supplied via [RxPagedListBuilder.setFetchScheduler] or
+ * [LivePagedListBuilder.setFetchExecutor].
+ *
+ * @param params Parameters for load, including start position and load size.
+ * @return [Single] that receives the loaded data.
+ */
+ abstract fun onLoadRange(params: LoadRangeParams): Single<RangeResult<T>>
+}
diff --git a/paging/rxjava2/src/main/java/androidx/paging/ScheduledExecutor.java b/paging/rxjava2/src/main/java/androidx/paging/ScheduledExecutor.java
deleted file mode 100644
index 90dbcab..0000000
--- a/paging/rxjava2/src/main/java/androidx/paging/ScheduledExecutor.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * 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 androidx.paging;
-
-import java.util.concurrent.Executor;
-
-import io.reactivex.Scheduler;
-import io.reactivex.schedulers.Schedulers;
-
-/**
- * To be used interchangeably as a Scheduler and an Executor, which retains both references to an
- * {@link Executor} and its {@link Scheduler} even after it has been converted by
- * {@link Schedulers#from(Executor)}.
- */
-final class ScheduledExecutor extends Scheduler implements Executor {
- private final Executor mExecutor;
- private final Scheduler mScheduler;
-
- ScheduledExecutor(Scheduler scheduler) {
- final Scheduler.Worker worker = scheduler.createWorker();
- mExecutor = new Executor() {
- @Override
- public void execute(Runnable command) {
- worker.schedule(command);
- }
- };
- mScheduler = scheduler;
- }
-
- ScheduledExecutor(Executor executor) {
- mExecutor = executor;
- mScheduler = Schedulers.from(executor);
- }
-
- @Override
- public Worker createWorker() {
- return mScheduler.createWorker();
- }
-
- @Override
- public void execute(Runnable command) {
- mExecutor.execute(command);
- }
-}
-
diff --git a/paging/rxjava2/src/main/java/androidx/paging/ScheduledExecutor.kt b/paging/rxjava2/src/main/java/androidx/paging/ScheduledExecutor.kt
new file mode 100644
index 0000000..4398665
--- /dev/null
+++ b/paging/rxjava2/src/main/java/androidx/paging/ScheduledExecutor.kt
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * 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 androidx.paging
+
+import io.reactivex.Scheduler
+import io.reactivex.schedulers.Schedulers
+import java.util.concurrent.Executor
+
+/**
+ * To be used interchangeably as a Scheduler and an Executor, which retains both references to an
+ * [Executor] and its [Scheduler] even after it has been converted by [Schedulers.from].
+ */
+internal class ScheduledExecutor : Scheduler, Executor {
+ private val executor: Executor
+ private val scheduler: Scheduler
+
+ constructor(scheduler: Scheduler) {
+ val worker = scheduler.createWorker()
+ executor = Executor { command -> worker.schedule(command) }
+ this.scheduler = scheduler
+ }
+
+ constructor(executor: Executor) {
+ this.executor = executor
+ scheduler = Schedulers.from(executor)
+ }
+
+ override fun createWorker() = scheduler.createWorker()
+
+ override fun execute(command: Runnable) {
+ executor.execute(command)
+ }
+}
diff --git a/paging/rxjava2/src/test/java/androidx/paging/RxItemKeyedDataSourceTest.kt b/paging/rxjava2/src/test/java/androidx/paging/RxItemKeyedDataSourceTest.kt
index f2afb18..1691812 100644
--- a/paging/rxjava2/src/test/java/androidx/paging/RxItemKeyedDataSourceTest.kt
+++ b/paging/rxjava2/src/test/java/androidx/paging/RxItemKeyedDataSourceTest.kt
@@ -20,6 +20,7 @@
import androidx.paging.ListenableItemKeyedDataSource.LoadInitialParams
import androidx.paging.ListenableItemKeyedDataSource.LoadParams
import androidx.paging.ListenableItemKeyedDataSource.Result
+import androidx.testutils.TestExecutor
import io.reactivex.Single
import io.reactivex.disposables.Disposable
import org.junit.Test
@@ -125,7 +126,7 @@
executor.executeAll()
val actual = future.get(100, TimeUnit.MILLISECONDS)
- assertEquals(InitialResult<Int>((0..2).toList(), 0, 3), actual)
+ assertEquals(InitialResult((0..2).toList(), 0, 3), actual)
}
@Test
@@ -161,7 +162,7 @@
executor.executeAll()
val actual = future.get(100, TimeUnit.MILLISECONDS)
- assertEquals(Result<Int>((0..2).toList()), actual)
+ assertEquals(Result((0..2).toList()), actual)
}
@Test
@@ -197,7 +198,7 @@
executor.executeAll()
val actual = future.get(100, TimeUnit.MILLISECONDS)
- assertEquals(Result<Int>((-3..-1).toList()), actual)
+ assertEquals(Result((-3..-1).toList()), actual)
}
@Test
diff --git a/paging/rxjava2/src/test/java/androidx/paging/RxPageKeyedDataSourceTest.kt b/paging/rxjava2/src/test/java/androidx/paging/RxPageKeyedDataSourceTest.kt
index 6021c44..00795af 100644
--- a/paging/rxjava2/src/test/java/androidx/paging/RxPageKeyedDataSourceTest.kt
+++ b/paging/rxjava2/src/test/java/androidx/paging/RxPageKeyedDataSourceTest.kt
@@ -18,6 +18,7 @@
import androidx.paging.ListenablePageKeyedDataSource.LoadInitialParams
import androidx.paging.ListenablePageKeyedDataSource.LoadParams
+import androidx.testutils.TestExecutor
import io.reactivex.Single
import io.reactivex.disposables.Disposable
import org.junit.Test
@@ -168,7 +169,7 @@
executor.executeAll()
val actual = future.get(100, TimeUnit.MILLISECONDS)
- assertEquals(ListenablePageKeyedDataSource.Result<Int, Int>((0..2).toList(), 3), actual)
+ assertEquals(ListenablePageKeyedDataSource.Result((0..2).toList(), 3), actual)
}
@Test
@@ -204,7 +205,7 @@
executor.executeAll()
val actual = future.get(100, TimeUnit.MILLISECONDS)
- assertEquals(ListenablePageKeyedDataSource.Result<Int, Int>((-3..-1).toList(), 3), actual)
+ assertEquals(ListenablePageKeyedDataSource.Result((-3..-1).toList(), 3), actual)
}
@Test
diff --git a/paging/rxjava2/src/test/java/androidx/paging/RxPagedListBuilderTest.kt b/paging/rxjava2/src/test/java/androidx/paging/RxPagedListBuilderTest.kt
index b1003ae..87c6f85 100644
--- a/paging/rxjava2/src/test/java/androidx/paging/RxPagedListBuilderTest.kt
+++ b/paging/rxjava2/src/test/java/androidx/paging/RxPagedListBuilderTest.kt
@@ -36,7 +36,7 @@
override fun create(): DataSource<Int, String> {
val currentList = localData.first()
localData = localData.drop(1)
- return ListDataSource<String>(currentList)
+ return ListDataSource(currentList)
}
}
}
@@ -46,9 +46,9 @@
val factory = testDataSourceSequence(listOf(listOf("a", "b"), listOf("c", "d")))
val scheduler = TestScheduler()
val observable = RxPagedListBuilder(factory, 10)
- .setFetchScheduler(scheduler)
- .setNotifyScheduler(scheduler)
- .buildObservable()
+ .setFetchScheduler(scheduler)
+ .setNotifyScheduler(scheduler)
+ .buildObservable()
val observer = TestObserver<PagedList<String>>()
observable.subscribe(observer)
@@ -75,10 +75,11 @@
val notifyScheduler = TestScheduler()
val fetchScheduler = TestScheduler()
val observable: Observable<PagedList<String>> = RxPagedListBuilder(
- factory, 10)
- .setFetchScheduler(fetchScheduler)
- .setNotifyScheduler(notifyScheduler)
- .buildObservable()
+ factory, 10
+ )
+ .setFetchScheduler(fetchScheduler)
+ .setNotifyScheduler(notifyScheduler)
+ .buildObservable()
val observer = TestObserver<PagedList<String>>()
observable.subscribe(observer)
diff --git a/paging/rxjava2/src/test/java/androidx/paging/RxPositionalDataSourceTest.kt b/paging/rxjava2/src/test/java/androidx/paging/RxPositionalDataSourceTest.kt
index a2c1627..e8ff5e7 100644
--- a/paging/rxjava2/src/test/java/androidx/paging/RxPositionalDataSourceTest.kt
+++ b/paging/rxjava2/src/test/java/androidx/paging/RxPositionalDataSourceTest.kt
@@ -20,6 +20,7 @@
import androidx.paging.ListenablePositionalDataSource.LoadInitialParams
import androidx.paging.ListenablePositionalDataSource.LoadRangeParams
import androidx.paging.ListenablePositionalDataSource.RangeResult
+import androidx.testutils.TestExecutor
import io.reactivex.Single
import io.reactivex.disposables.Disposable
import org.junit.Assert.fail
@@ -106,7 +107,7 @@
executor.executeAll()
val actual = future.get(100, TimeUnit.MILLISECONDS)
- assertEquals(InitialResult<Int>((0..3).toList(), 0, 4), actual)
+ assertEquals(InitialResult((0..3).toList(), 0, 4), actual)
}
@Test
@@ -145,7 +146,7 @@
executor.executeAll()
val actual = future.get(100, TimeUnit.MILLISECONDS)
- assertEquals(RangeResult<Int>((0..9).toList()), actual)
+ assertEquals(RangeResult((0..9).toList()), actual)
}
@Test
diff --git a/paging/rxjava2/src/test/java/androidx/paging/TestExecutor.kt b/paging/rxjava2/src/test/java/androidx/paging/TestExecutor.kt
deleted file mode 100644
index fb1e8f20..0000000
--- a/paging/rxjava2/src/test/java/androidx/paging/TestExecutor.kt
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * 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 androidx.paging
-
-import java.util.LinkedList
-import java.util.concurrent.Executor
-
-class TestExecutor : Executor {
- private val mTasks = LinkedList<Runnable>()
-
- override fun execute(runnable: Runnable) {
- mTasks.add(runnable)
- }
-
- internal fun executeAll(): Boolean {
- val consumed = !mTasks.isEmpty()
-
- var task = mTasks.poll()
- while (task != null) {
- task.run()
- task = mTasks.poll()
- }
- return consumed
- }
-}
diff --git a/room/common/api/2.2.0-alpha01.ignore b/room/common/api/2.2.0-alpha01.ignore
index 155e4e0..c7d3751 100644
--- a/room/common/api/2.2.0-alpha01.ignore
+++ b/room/common/api/2.2.0-alpha01.ignore
@@ -1,3 +1,5 @@
// Baseline format: 1.0
AddedAbstractMethod: androidx.room.Relation#associateBy():
Added method androidx.room.Relation.associateBy()
+AddedAbstractMethod: androidx.room.ColumnInfo#defaultValue():
+ Added method androidx.room.ColumnInfo#defaultValue()
diff --git a/room/common/api/2.2.0-alpha01.txt b/room/common/api/2.2.0-alpha01.txt
index a9643a9..b12b8cf 100644
--- a/room/common/api/2.2.0-alpha01.txt
+++ b/room/common/api/2.2.0-alpha01.txt
@@ -3,6 +3,7 @@
@java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ColumnInfo {
method @androidx.room.ColumnInfo.Collate public abstract int collate() default androidx.room.ColumnInfo.UNSPECIFIED;
+ method public abstract String defaultValue() default androidx.room.ColumnInfo.VALUE_UNSPECIFIED;
method public abstract boolean index() default false;
method public abstract String name() default androidx.room.ColumnInfo.INHERIT_FIELD_NAME;
method @androidx.room.ColumnInfo.SQLiteTypeAffinity public abstract int typeAffinity() default androidx.room.ColumnInfo.UNDEFINED;
@@ -18,6 +19,7 @@
field public static final int UNDEFINED = 1; // 0x1
field @RequiresApi(21) public static final int UNICODE = 6; // 0x6
field public static final int UNSPECIFIED = 1; // 0x1
+ field public static final String VALUE_UNSPECIFIED = "[value-unspecified]";
}
@IntDef({androidx.room.ColumnInfo.UNSPECIFIED, androidx.room.ColumnInfo.BINARY, androidx.room.ColumnInfo.NOCASE, androidx.room.ColumnInfo.RTRIM, androidx.room.ColumnInfo.LOCALIZED, androidx.room.ColumnInfo.UNICODE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public static @interface ColumnInfo.Collate {
diff --git a/room/common/api/current.txt b/room/common/api/current.txt
index a9643a9..b12b8cf 100644
--- a/room/common/api/current.txt
+++ b/room/common/api/current.txt
@@ -3,6 +3,7 @@
@java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ColumnInfo {
method @androidx.room.ColumnInfo.Collate public abstract int collate() default androidx.room.ColumnInfo.UNSPECIFIED;
+ method public abstract String defaultValue() default androidx.room.ColumnInfo.VALUE_UNSPECIFIED;
method public abstract boolean index() default false;
method public abstract String name() default androidx.room.ColumnInfo.INHERIT_FIELD_NAME;
method @androidx.room.ColumnInfo.SQLiteTypeAffinity public abstract int typeAffinity() default androidx.room.ColumnInfo.UNDEFINED;
@@ -18,6 +19,7 @@
field public static final int UNDEFINED = 1; // 0x1
field @RequiresApi(21) public static final int UNICODE = 6; // 0x6
field public static final int UNSPECIFIED = 1; // 0x1
+ field public static final String VALUE_UNSPECIFIED = "[value-unspecified]";
}
@IntDef({androidx.room.ColumnInfo.UNSPECIFIED, androidx.room.ColumnInfo.BINARY, androidx.room.ColumnInfo.NOCASE, androidx.room.ColumnInfo.RTRIM, androidx.room.ColumnInfo.LOCALIZED, androidx.room.ColumnInfo.UNICODE}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public static @interface ColumnInfo.Collate {
diff --git a/room/common/src/main/java/androidx/room/ColumnInfo.java b/room/common/src/main/java/androidx/room/ColumnInfo.java
index 49c766d..ee2adc1 100644
--- a/room/common/src/main/java/androidx/room/ColumnInfo.java
+++ b/room/common/src/main/java/androidx/room/ColumnInfo.java
@@ -74,6 +74,47 @@
@Collate int collate() default UNSPECIFIED;
/**
+ * The default value for this column.
+ * <pre>
+ * {@literal @}ColumnInfo(defaultValue = "No name")
+ * public String name;
+ *
+ * {@literal @}ColumnInfo(defaultValue = "0")
+ * public int flag;
+ * </pre>
+ * <p>
+ * Note that the default value you specify here will <em>NOT</em> be used if you simply
+ * insert the {@link Entity} with {@link Insert @Insert}. In that case, any value assigned in
+ * Java/Kotlin will be used. Use {@link Query @Query} with an <code>INSERT</code> statement
+ * and skip this column there in order to use this default value.
+ * </p>
+ * <p>
+ * NULL, CURRENT_TIMESTAMP and other SQLite constant values are interpreted as such. If you want
+ * to use them as strings for some reason, surround them with single-quotes.
+ * </p>
+ * <pre>
+ * {@literal @}ColumnInfo(defaultValue = "NULL")
+ * {@literal @}Nullable
+ * public String description;
+ *
+ * {@literal @}ColumnInfo(defaultValue = "'NULL'")
+ * {@literal @}NonNull
+ * public String name;
+ * </pre>
+ * <p>
+ * You can also use constant expressions by surrounding them with parentheses.
+ * </p>
+ * <pre>
+ * {@literal @}CoumnInfo(defaultValue = "('Created at' || CURRENT_TIMESTAMP)")
+ * public String notice;
+ * </pre>
+ *
+ * @return The default value for this column.
+ * @see #VALUE_UNSPECIFIED
+ */
+ String defaultValue() default VALUE_UNSPECIFIED;
+
+ /**
* Constant to let Room inherit the field name as the column name. If used, Room will use the
* field name as the column name.
*/
@@ -162,4 +203,9 @@
@Retention(RetentionPolicy.CLASS)
@interface Collate {
}
+
+ /**
+ * A constant for {@link #defaultValue()} that makes the column to have no default value.
+ */
+ String VALUE_UNSPECIFIED = "[value-unspecified]";
}
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/Context.kt b/room/compiler/src/main/kotlin/androidx/room/processor/Context.kt
index 6dfbb23..8a22899 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/Context.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/Context.kt
@@ -21,6 +21,7 @@
import androidx.room.processor.cache.Cache
import androidx.room.solver.TypeAdapterStore
import androidx.room.verifier.DatabaseVerifier
+import androidx.room.vo.Warning
import java.io.File
import java.util.LinkedHashSet
import javax.annotation.processing.ProcessingEnvironment
@@ -95,7 +96,7 @@
return Pair(result, collector)
}
- fun fork(element: Element): Context {
+ fun fork(element: Element, forceSuppressedWarnings: Set<Warning> = emptySet()): Context {
val suppressedWarnings = SuppressWarningProcessor.getSuppressedWarnings(element)
val processConvertersResult = CustomConverterProcessor.findConverters(this, element)
val canReUseAdapterStore = processConvertersResult.classes.isEmpty()
@@ -105,7 +106,8 @@
} else {
processConvertersResult + this.typeConverters
}
- val subSuppressedWarnings = suppressedWarnings + logger.suppressedWarnings
+ val subSuppressedWarnings =
+ forceSuppressedWarnings + suppressedWarnings + logger.suppressedWarnings
val subCache = Cache(cache, subTypeConverters.classes, subSuppressedWarnings)
val subContext = Context(
processingEnv = processingEnv,
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/FieldProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/FieldProcessor.kt
index f67016c..07d1f2c 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/FieldProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/FieldProcessor.kt
@@ -23,6 +23,7 @@
import androidx.room.vo.EmbeddedField
import androidx.room.vo.Field
import com.squareup.javapoet.TypeName
+import java.util.Locale
import javax.lang.model.element.Element
import javax.lang.model.type.DeclaredType
@@ -57,22 +58,30 @@
context.checker.notUnbound(type, element,
ProcessorErrors.CANNOT_USE_UNBOUND_GENERICS_IN_ENTITY_FIELDS)
- val field = Field(name = name,
- type = member,
- element = element,
- columnName = columnName,
- affinity = affinity,
- collate = Collate.fromAnnotationValue(columnInfo?.collate),
- parent = fieldParent,
- indexed = columnInfo?.index ?: false)
+ val adapter = context.typeAdapterStore.findColumnTypeAdapter(member, affinity)
+ val adapterAffinity = adapter?.typeAffinity ?: affinity
+ val nonNull = Field.calcNonNull(element, fieldParent)
+
+ val field = Field(
+ name = name,
+ type = member,
+ element = element,
+ columnName = columnName,
+ affinity = affinity,
+ collate = Collate.fromAnnotationValue(columnInfo?.collate),
+ defaultValue = extractDefaultValue(
+ columnInfo?.defaultValue, adapterAffinity, nonNull
+ ),
+ parent = fieldParent,
+ indexed = columnInfo?.index ?: false,
+ nonNull = nonNull
+ )
when (bindingScope) {
BindingScope.TWO_WAY -> {
- val adapter = context.typeAdapterStore.findColumnTypeAdapter(field.type,
- field.affinity)
field.statementBinder = adapter
field.cursorValueReader = adapter
- field.affinity = adapter?.typeAffinity ?: field.affinity
+ field.affinity = adapterAffinity
context.checker.check(adapter != null, field.element,
ProcessorErrors.CANNOT_FIND_COLUMN_TYPE_ADAPTER)
}
@@ -89,9 +98,40 @@
ProcessorErrors.CANNOT_FIND_CURSOR_READER)
}
}
+
return field
}
+ private fun extractDefaultValue(
+ value: String?,
+ affinity: SQLTypeAffinity?,
+ fieldNonNull: Boolean
+ ): String? {
+ if (value == null) {
+ return null
+ }
+ val trimmed = value.trim().toLowerCase(Locale.ENGLISH)
+ val defaultValue = if (affinity == SQLTypeAffinity.TEXT) {
+ if (value == ColumnInfo.VALUE_UNSPECIFIED) {
+ null
+ } else if (trimmed.startsWith("(") || trimmed in SQLITE_VALUE_CONSTANTS) {
+ value
+ } else {
+ "'${value.trim('\'')}'"
+ }
+ } else {
+ if (value == ColumnInfo.VALUE_UNSPECIFIED || trimmed == "") {
+ null
+ } else {
+ value
+ }
+ }
+ if (trimmed == "null" && fieldNonNull) {
+ context.logger.e(element, ProcessorErrors.DEFAULT_VALUE_NULLABILITY)
+ }
+ return defaultValue
+ }
+
/**
* Defines what we need to assign
*/
@@ -101,3 +141,12 @@
READ_FROM_CURSOR // just cursor to value
}
}
+
+internal val SQLITE_VALUE_CONSTANTS = listOf(
+ "null",
+ "current_time",
+ "current_date",
+ "current_timestamp",
+ "true",
+ "false"
+)
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/ProcessorErrors.kt b/room/compiler/src/main/kotlin/androidx/room/processor/ProcessorErrors.kt
index 93b3435..4f1360e 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/ProcessorErrors.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/ProcessorErrors.kt
@@ -200,6 +200,8 @@
val CANNOT_FIND_CURSOR_READER = "Cannot figure out how to read this field from a cursor."
+ const val DEFAULT_VALUE_NULLABILITY = "Use of NULL as the default value of a non-null field"
+
private val MISSING_PARAMETER_FOR_BIND = "Each bind variable in the query must have a" +
" matching method parameter. Cannot find method parameters for %s."
@@ -418,6 +420,30 @@
""".trim()
}
+ fun relationJunctionParentAffinityMismatch(
+ parentColumn: String,
+ junctionParentColumn: String,
+ parentAffinity: SQLTypeAffinity?,
+ junctionParentAffinity: SQLTypeAffinity?
+ ): String {
+ return """
+ The affinity of parent column ($parentColumn : $parentAffinity) does not match the type
+ affinity of the junction parent column ($junctionParentColumn : $junctionParentAffinity).
+ """.trim()
+ }
+
+ fun relationJunctionChildAffinityMismatch(
+ childColumn: String,
+ junctionChildColumn: String,
+ childAffinity: SQLTypeAffinity?,
+ junctionChildAffinity: SQLTypeAffinity?
+ ): String {
+ return """
+ The affinity of child column ($childColumn : $childAffinity) does not match the type
+ affinity of the junction child column ($junctionChildColumn : $junctionChildAffinity).
+ """.trim()
+ }
+
val CANNOT_USE_MORE_THAN_ONE_POJO_FIELD_ANNOTATION = "A field can be annotated with only" +
" one of the following:" + PojoProcessor.PROCESSED_ANNOTATIONS.joinToString(",") {
it.java.simpleName
diff --git a/room/compiler/src/main/kotlin/androidx/room/verifier/DatabaseVerifier.kt b/room/compiler/src/main/kotlin/androidx/room/verifier/DatabaseVerifier.kt
index 4ed0504..1aa1c3d 100644
--- a/room/compiler/src/main/kotlin/androidx/room/verifier/DatabaseVerifier.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/verifier/DatabaseVerifier.kt
@@ -117,14 +117,22 @@
} else {
entity.createTableQuery
}
- stmt.executeUpdate(stripLocalizeCollations(createTableQuery))
+ try {
+ stmt.executeUpdate(stripLocalizeCollations(createTableQuery))
+ } catch (e: SQLException) {
+ context.logger.e(entity.element, "${e.message}")
+ }
entity.indices.forEach {
stmt.executeUpdate(it.createQuery(entity.tableName))
}
}
views.forEach { view ->
val stmt = connection.createStatement()
- stmt.executeUpdate(stripLocalizeCollations(view.createViewQuery))
+ try {
+ stmt.executeUpdate(stripLocalizeCollations(view.createViewQuery))
+ } catch (e: SQLException) {
+ context.logger.e(view.element, "${e.message}")
+ }
}
}
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/Field.kt b/room/compiler/src/main/kotlin/androidx/room/vo/Field.kt
index b8b1513..35997f5 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/Field.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/Field.kt
@@ -26,16 +26,24 @@
import com.squareup.javapoet.TypeName
import javax.lang.model.element.Element
import javax.lang.model.type.TypeMirror
+
// used in cache matching, must stay as a data class or implement equals
-data class Field(val element: Element, val name: String, val type: TypeMirror,
- var affinity: SQLTypeAffinity?,
- val collate: Collate? = null,
- val columnName: String = name,
- /* means that this field does not belong to parent, instead, it belongs to a
- * embedded child of the main Pojo*/
- val parent: EmbeddedField? = null,
- // index might be removed when being merged into an Entity
- var indexed: Boolean = false) : HasSchemaIdentity {
+data class Field(
+ val element: Element,
+ val name: String,
+ val type: TypeMirror,
+ var affinity: SQLTypeAffinity?,
+ val collate: Collate? = null,
+ val columnName: String = name,
+ val defaultValue: String? = null,
+ // null here means that this field does not belong to parent, instead, it belongs to an
+ // embedded child of the main Pojo
+ val parent: EmbeddedField? = null,
+ // index might be removed when being merged into an Entity
+ var indexed: Boolean = false,
+ /** Whether the table column for this field should be NOT NULL */
+ val nonNull: Boolean = calcNonNull(element, parent)
+) : HasSchemaIdentity {
lateinit var getter: FieldGetter
lateinit var setter: FieldSetter
// binds the field into a statement
@@ -44,12 +52,15 @@
var cursorValueReader: CursorValueReader? = null
val typeName: TypeName by lazy { type.typeName() }
- /** Whether the table column for this field should be NOT NULL */
- val nonNull = element.isNonNull() && (parent == null || parent.isNonNullRecursively())
-
override fun getIdKey(): String {
- // we don't get the collate information from sqlite so ignoring it here.
- return "$columnName-${affinity?.name ?: SQLTypeAffinity.TEXT.name}-$nonNull"
+ return buildString {
+ // we don't get the collate information from sqlite so ignoring it here.
+ append("$columnName-${affinity?.name ?: SQLTypeAffinity.TEXT.name}-$nonNull")
+ // defaultValue was newly added; it should affect the ID only when it is used.
+ if (defaultValue != null) {
+ append("-defaultValue=$defaultValue")
+ }
+ }
}
/**
@@ -127,10 +138,19 @@
if (collate != null) {
columnSpec.append(" COLLATE ${collate.name}")
}
+ if (defaultValue != null) {
+ columnSpec.append(" DEFAULT $defaultValue")
+ }
return "`$columnName` ${(affinity ?: SQLTypeAffinity.TEXT).name}$columnSpec"
}
fun toBundle(): FieldBundle = FieldBundle(pathWithDotNotation, columnName,
- affinity?.name ?: SQLTypeAffinity.TEXT.name, nonNull
+ affinity?.name ?: SQLTypeAffinity.TEXT.name, nonNull, defaultValue
)
+
+ companion object {
+ fun calcNonNull(element: Element, parent: EmbeddedField?): Boolean {
+ return element.isNonNull() && (parent == null || parent.isNonNullRecursively())
+ }
+ }
}
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/RelationCollector.kt b/room/compiler/src/main/kotlin/androidx/room/vo/RelationCollector.kt
index ed1cea4..dab9f3a 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/RelationCollector.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/RelationCollector.kt
@@ -28,6 +28,8 @@
import androidx.room.processor.Context
import androidx.room.processor.ProcessorErrors.cannotFindQueryResultAdapter
import androidx.room.processor.ProcessorErrors.relationAffinityMismatch
+import androidx.room.processor.ProcessorErrors.relationJunctionChildAffinityMismatch
+import androidx.room.processor.ProcessorErrors.relationJunctionParentAffinityMismatch
import androidx.room.solver.CodeGenScope
import androidx.room.solver.query.parameter.QueryParameterAdapter
import androidx.room.solver.query.result.RowAdapter
@@ -210,19 +212,53 @@
): List<RelationCollector> {
return relations.map { relation ->
// decide on the affinity
- val context = baseContext.fork(relation.field.element)
+ val context = baseContext.fork(
+ element = relation.field.element,
+ forceSuppressedWarnings = setOf(Warning.CURSOR_MISMATCH))
+
+ fun checkAffinity(
+ first: SQLTypeAffinity?,
+ second: SQLTypeAffinity?,
+ onAffinityMismatch: () -> Unit
+ ) = if (first != null && first == second) {
+ first
+ } else {
+ onAffinityMismatch()
+ SQLTypeAffinity.TEXT
+ }
+
val parentAffinity = relation.parentField.cursorValueReader?.affinity()
val childAffinity = relation.entityField.cursorValueReader?.affinity()
- val affinity = if (parentAffinity != null && parentAffinity == childAffinity) {
- parentAffinity
+ val junctionParentAffinity =
+ relation.junction?.parentField?.cursorValueReader?.affinity()
+ val junctionChildAffinity =
+ relation.junction?.entityField?.cursorValueReader?.affinity()
+ val affinity = if (relation.junction != null) {
+ checkAffinity(childAffinity, junctionChildAffinity) {
+ context.logger.w(Warning.RELATION_TYPE_MISMATCH, relation.field.element,
+ relationJunctionChildAffinityMismatch(
+ childColumn = relation.entityField.columnName,
+ junctionChildColumn = relation.junction.entityField.columnName,
+ childAffinity = childAffinity,
+ junctionChildAffinity = junctionChildAffinity))
+ }
+ checkAffinity(parentAffinity, junctionParentAffinity) {
+ context.logger.w(Warning.RELATION_TYPE_MISMATCH, relation.field.element,
+ relationJunctionParentAffinityMismatch(
+ parentColumn = relation.parentField.columnName,
+ junctionParentColumn = relation.junction.parentField.columnName,
+ parentAffinity = parentAffinity,
+ junctionParentAffinity = junctionParentAffinity))
+ }
} else {
- context.logger.w(Warning.RELATION_TYPE_MISMATCH, relation.field.element,
+ checkAffinity(parentAffinity, childAffinity) {
+ context.logger.w(Warning.RELATION_TYPE_MISMATCH, relation.field.element,
relationAffinityMismatch(
- parentColumn = relation.parentField.columnName,
- childColumn = relation.entityField.columnName,
- parentAffinity = parentAffinity,
- childAffinity = childAffinity))
- SQLTypeAffinity.TEXT
+ parentColumn = relation.parentField.columnName,
+ childColumn = relation.entityField.columnName,
+ parentAffinity = parentAffinity,
+ childAffinity = childAffinity))
+ }
}
val keyType = keyTypeFor(context, affinity)
val collectionTypeName = if (relation.field.typeName is ParameterizedTypeName) {
@@ -318,9 +354,9 @@
if (cursorReader == null) {
getDefaultRowAdapter()
} else {
- context.logger.d("Choosing cursor adapter for the return value since" +
- " the query returns only 1 or 2 columns and there is a cursor" +
- " adapter for the return type.")
+ context.logger.d(relation.field.element, "Choosing cursor adapter for" +
+ " the return value since the query returns only 1 or 2 columns" +
+ " and there is a cursor adapter for the return type.")
SingleColumnRowAdapter(cursorReader)
}
} else {
diff --git a/room/compiler/src/main/kotlin/androidx/room/writer/RelationCollectorMethodWriter.kt b/room/compiler/src/main/kotlin/androidx/room/writer/RelationCollectorMethodWriter.kt
index be346d1..66afea2 100644
--- a/room/compiler/src/main/kotlin/androidx/room/writer/RelationCollectorMethodWriter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/writer/RelationCollectorMethodWriter.kt
@@ -148,7 +148,7 @@
// clause, this column is the rightmost column in the generated SELECT
// clause.
val junctionParentColumnIndex = relation.projection.size
- addStatement("final $T $L = $L; // $L",
+ addStatement("final $T $L = $L; // _junction.$L",
TypeName.INT, itemKeyIndexVar, junctionParentColumnIndex,
relation.junction.parentField.columnName)
} else {
diff --git a/room/compiler/src/main/kotlin/androidx/room/writer/TableInfoValidationWriter.kt b/room/compiler/src/main/kotlin/androidx/room/writer/TableInfoValidationWriter.kt
index 83e1887..8a36228 100644
--- a/room/compiler/src/main/kotlin/androidx/room/writer/TableInfoValidationWriter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/writer/TableInfoValidationWriter.kt
@@ -45,12 +45,13 @@
addStatement("final $T $L = new $T($L)", columnListType, columnListVar,
columnListType, entity.fields.size)
entity.fields.forEach { field ->
- addStatement("$L.put($S, new $T($S, $S, $L, $L))",
+ addStatement("$L.put($S, new $T($S, $S, $L, $L, $S))",
columnListVar, field.columnName, RoomTypeNames.TABLE_INFO_COLUMN,
/*name*/ field.columnName,
/*type*/ field.affinity?.name ?: SQLTypeAffinity.TEXT.name,
/*nonNull*/ field.nonNull,
- /*pkeyPos*/ entity.primaryKey.fields.indexOf(field) + 1)
+ /*pkeyPos*/ entity.primaryKey.fields.indexOf(field) + 1,
+ /*defaultValue*/ field.defaultValue)
}
val foreignKeySetVar = scope.getTmpVar("_foreignKeys$suffix")
diff --git a/room/compiler/src/main/kotlin/androidx/room/writer/ValidationWriter.kt b/room/compiler/src/main/kotlin/androidx/room/writer/ValidationWriter.kt
index a67d0a8..7499770 100644
--- a/room/compiler/src/main/kotlin/androidx/room/writer/ValidationWriter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/writer/ValidationWriter.kt
@@ -61,7 +61,7 @@
var statementCount = 0
private set
- fun addStatement(format: String, vararg args: Any): CodeBlockWrapper {
+ fun addStatement(format: String, vararg args: Any?): CodeBlockWrapper {
statementCount++
builder.addStatement(format, *args)
return this
diff --git a/room/compiler/src/test/data/databasewriter/output/ComplexDatabase.java b/room/compiler/src/test/data/databasewriter/output/ComplexDatabase.java
index aa1498c..3c1b537 100644
--- a/room/compiler/src/test/data/databasewriter/output/ComplexDatabase.java
+++ b/room/compiler/src/test/data/databasewriter/output/ComplexDatabase.java
@@ -81,10 +81,10 @@
@Override
protected void validateMigration(SupportSQLiteDatabase _db) {
final HashMap<String, TableInfo.Column> _columnsUser = new HashMap<String, TableInfo.Column>(4);
- _columnsUser.put("uid", new TableInfo.Column("uid", "INTEGER", true, 1));
- _columnsUser.put("name", new TableInfo.Column("name", "TEXT", false, 0));
- _columnsUser.put("lastName", new TableInfo.Column("lastName", "TEXT", false, 0));
- _columnsUser.put("ageColumn", new TableInfo.Column("ageColumn", "INTEGER", true, 0));
+ _columnsUser.put("uid", new TableInfo.Column("uid", "INTEGER", true, 1, null));
+ _columnsUser.put("name", new TableInfo.Column("name", "TEXT", false, 0, null));
+ _columnsUser.put("lastName", new TableInfo.Column("lastName", "TEXT", false, 0, null));
+ _columnsUser.put("ageColumn", new TableInfo.Column("ageColumn", "INTEGER", true, 0, null));
final HashSet<TableInfo.ForeignKey> _foreignKeysUser = new HashSet<TableInfo.ForeignKey>(0);
final HashSet<TableInfo.Index> _indicesUser = new HashSet<TableInfo.Index>(0);
final TableInfo _infoUser = new TableInfo("User", _columnsUser, _foreignKeysUser, _indicesUser);
@@ -95,10 +95,10 @@
+ " Found:\n" + _existingUser);
}
final HashMap<String, TableInfo.Column> _columnsChild1 = new HashMap<String, TableInfo.Column>(4);
- _columnsChild1.put("id", new TableInfo.Column("id", "INTEGER", true, 1));
- _columnsChild1.put("name", new TableInfo.Column("name", "TEXT", false, 0));
- _columnsChild1.put("serial", new TableInfo.Column("serial", "INTEGER", false, 0));
- _columnsChild1.put("code", new TableInfo.Column("code", "TEXT", false, 0));
+ _columnsChild1.put("id", new TableInfo.Column("id", "INTEGER", true, 1, null));
+ _columnsChild1.put("name", new TableInfo.Column("name", "TEXT", false, 0, null));
+ _columnsChild1.put("serial", new TableInfo.Column("serial", "INTEGER", false, 0, null));
+ _columnsChild1.put("code", new TableInfo.Column("code", "TEXT", false, 0, null));
final HashSet<TableInfo.ForeignKey> _foreignKeysChild1 = new HashSet<TableInfo.ForeignKey>(0);
final HashSet<TableInfo.Index> _indicesChild1 = new HashSet<TableInfo.Index>(0);
final TableInfo _infoChild1 = new TableInfo("Child1", _columnsChild1, _foreignKeysChild1, _indicesChild1);
@@ -109,10 +109,10 @@
+ " Found:\n" + _existingChild1);
}
final HashMap<String, TableInfo.Column> _columnsChild2 = new HashMap<String, TableInfo.Column>(4);
- _columnsChild2.put("id", new TableInfo.Column("id", "INTEGER", true, 1));
- _columnsChild2.put("name", new TableInfo.Column("name", "TEXT", false, 0));
- _columnsChild2.put("serial", new TableInfo.Column("serial", "INTEGER", false, 0));
- _columnsChild2.put("code", new TableInfo.Column("code", "TEXT", false, 0));
+ _columnsChild2.put("id", new TableInfo.Column("id", "INTEGER", true, 1, null));
+ _columnsChild2.put("name", new TableInfo.Column("name", "TEXT", false, 0, null));
+ _columnsChild2.put("serial", new TableInfo.Column("serial", "INTEGER", false, 0, null));
+ _columnsChild2.put("code", new TableInfo.Column("code", "TEXT", false, 0, null));
final HashSet<TableInfo.ForeignKey> _foreignKeysChild2 = new HashSet<TableInfo.ForeignKey>(0);
final HashSet<TableInfo.Index> _indicesChild2 = new HashSet<TableInfo.Index>(0);
final TableInfo _infoChild2 = new TableInfo("Child2", _columnsChild2, _foreignKeysChild2, _indicesChild2);
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/FieldProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/FieldProcessorTest.kt
index 949be1a..a685e40 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/FieldProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/FieldProcessorTest.kt
@@ -30,6 +30,8 @@
import com.google.testing.compile.JavaFileObjects
import com.google.testing.compile.JavaSourcesSubjectFactory
import org.hamcrest.CoreMatchers.`is`
+import org.hamcrest.CoreMatchers.equalTo
+import org.hamcrest.CoreMatchers.nullValue
import org.hamcrest.MatcherAssert.assertThat
import org.junit.Test
import org.junit.runner.RunWith
@@ -48,6 +50,7 @@
const val ENTITY_PREFIX = """
package foo.bar;
import androidx.room.*;
+ import androidx.annotation.NonNull;
@Entity
abstract class MyEntity {
"""
@@ -350,6 +353,79 @@
}
}
+ @Test
+ fun defaultValues_number() {
+ testDefaultValue("\"1\"", "int") { defaultValue ->
+ assertThat(defaultValue, `is`(equalTo("1")))
+ }.compilesWithoutError()
+ testDefaultValue("\"\"", "int") { defaultValue ->
+ assertThat(defaultValue, `is`(nullValue()))
+ }.compilesWithoutError()
+ testDefaultValue("\"null\"", "Integer") { defaultValue ->
+ assertThat(defaultValue, `is`(equalTo("null")))
+ }.compilesWithoutError()
+ testDefaultValue("ColumnInfo.VALUE_UNSPECIFIED", "int") { defaultValue ->
+ assertThat(defaultValue, `is`(nullValue()))
+ }.compilesWithoutError()
+ testDefaultValue("\"CURRENT_TIMESTAMP\"", "long") { defaultValue ->
+ assertThat(defaultValue, `is`(equalTo("CURRENT_TIMESTAMP")))
+ }.compilesWithoutError()
+ testDefaultValue("\"true\"", "boolean") { defaultValue ->
+ assertThat(defaultValue, `is`(equalTo("true")))
+ }.compilesWithoutError()
+ testDefaultValue("\"false\"", "boolean") { defaultValue ->
+ assertThat(defaultValue, `is`(equalTo("false")))
+ }.compilesWithoutError()
+ }
+
+ @Test
+ fun defaultValues_nonNull() {
+ testDefaultValue("\"null\"", "int") {
+ }.failsToCompile().withErrorContaining(ProcessorErrors.DEFAULT_VALUE_NULLABILITY)
+ testDefaultValue("\"null\"", "@NonNull String") {
+ }.failsToCompile().withErrorContaining(ProcessorErrors.DEFAULT_VALUE_NULLABILITY)
+ }
+
+ @Test
+ fun defaultValues_text() {
+ testDefaultValue("\"a\"", "String") { defaultValue ->
+ assertThat(defaultValue, `is`(equalTo("'a'")))
+ }.compilesWithoutError()
+ testDefaultValue("\"'a'\"", "String") { defaultValue ->
+ assertThat(defaultValue, `is`(equalTo("'a'")))
+ }.compilesWithoutError()
+ testDefaultValue("\"\"", "String") { defaultValue ->
+ assertThat(defaultValue, `is`(equalTo("''")))
+ }.compilesWithoutError()
+ testDefaultValue("\"null\"", "String") { defaultValue ->
+ assertThat(defaultValue, `is`(equalTo("null")))
+ }.compilesWithoutError()
+ testDefaultValue("ColumnInfo.VALUE_UNSPECIFIED", "String") { defaultValue ->
+ assertThat(defaultValue, `is`(nullValue()))
+ }.compilesWithoutError()
+ testDefaultValue("\"CURRENT_TIMESTAMP\"", "String") { defaultValue ->
+ assertThat(defaultValue, `is`(equalTo("CURRENT_TIMESTAMP")))
+ }.compilesWithoutError()
+ testDefaultValue("\"('Created at ' || CURRENT_TIMESTAMP)\"", "String") { defaultValue ->
+ assertThat(defaultValue, `is`(equalTo("('Created at ' || CURRENT_TIMESTAMP)")))
+ }.compilesWithoutError()
+ }
+
+ private fun testDefaultValue(
+ defaultValue: String,
+ fieldType: String,
+ body: (String?) -> Unit
+ ): CompileTester {
+ return singleEntity(
+ """
+ @ColumnInfo(defaultValue = $defaultValue)
+ $fieldType name;
+ """
+ ) { field, _ ->
+ body(field.defaultValue)
+ }
+ }
+
fun singleEntity(vararg input: String, handler: (Field, invocation: TestInvocation) -> Unit):
CompileTester {
return Truth.assertAbout(JavaSourcesSubjectFactory.javaSources())
diff --git a/room/compiler/src/test/kotlin/androidx/room/verifier/DatabaseVerifierTest.kt b/room/compiler/src/test/kotlin/androidx/room/verifier/DatabaseVerifierTest.kt
index 675b39f..0c5ab32 100644
--- a/room/compiler/src/test/kotlin/androidx/room/verifier/DatabaseVerifierTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/verifier/DatabaseVerifierTest.kt
@@ -71,7 +71,7 @@
}
private fun createVerifier(invocation: TestInvocation): DatabaseVerifier {
- val db = userDb(invocation.context)
+ val db = userDb(invocation)
return DatabaseVerifier.create(invocation.context, mock(Element::class.java),
db.entities, db.views)!!
}
@@ -213,6 +213,34 @@
}.compilesWithoutError()
}
+ @Test
+ fun defaultValue_exprError() {
+ simpleRun { invocation ->
+ val db = database(
+ listOf(
+ entity(
+ invocation,
+ "User",
+ field(
+ "id",
+ primitive(invocation.context, TypeKind.INT),
+ SQLTypeAffinity.INTEGER
+ ),
+ field(
+ "name",
+ invocation.context.COMMON_TYPES.STRING,
+ SQLTypeAffinity.TEXT,
+ defaultValue = "(NO_SUCH_CONSTANT)"
+ )
+ )
+ ),
+ emptyList()
+ )
+ val element = mock(Element::class.java)
+ DatabaseVerifier.create(invocation.context, element, db.entities, db.views)!!
+ }.failsToCompile().withErrorContaining("default value of column [name]")
+ }
+
private fun validQueryTest(sql: String, cb: (QueryResultInfo) -> Unit) {
simpleRun { invocation ->
val verifier = createVerifier(invocation)
@@ -221,16 +249,27 @@
}.compilesWithoutError()
}
- private fun userDb(context: Context): Database {
+ private fun userDb(invocation: TestInvocation): Database {
+ val context = invocation.context
return database(
- listOf(entity("User",
- field("id", primitive(context, TypeKind.INT), SQLTypeAffinity.INTEGER),
- field("name", context.COMMON_TYPES.STRING, SQLTypeAffinity.TEXT),
- field("lastName", context.COMMON_TYPES.STRING, SQLTypeAffinity.TEXT),
- field("ratio", primitive(context, TypeKind.FLOAT), SQLTypeAffinity.REAL))),
- listOf(view("UserSummary", "SELECT id, name FROM User",
- field("id", primitive(context, TypeKind.INT), SQLTypeAffinity.INTEGER),
- field("name", context.COMMON_TYPES.STRING, SQLTypeAffinity.TEXT))))
+ listOf(
+ entity(
+ invocation,
+ "User",
+ field("id", primitive(context, TypeKind.INT), SQLTypeAffinity.INTEGER),
+ field("name", context.COMMON_TYPES.STRING, SQLTypeAffinity.TEXT),
+ field("lastName", context.COMMON_TYPES.STRING, SQLTypeAffinity.TEXT),
+ field("ratio", primitive(context, TypeKind.FLOAT), SQLTypeAffinity.REAL)
+ )
+ ),
+ listOf(
+ view(
+ "UserSummary", "SELECT id, name FROM User",
+ field("id", primitive(context, TypeKind.INT), SQLTypeAffinity.INTEGER),
+ field("name", context.COMMON_TYPES.STRING, SQLTypeAffinity.TEXT)
+ )
+ )
+ )
}
private fun database(entities: List<Entity>, views: List<DatabaseView>): Database {
@@ -245,18 +284,23 @@
enableForeignKeys = false)
}
- private fun entity(tableName: String, vararg fields: Field): Entity {
+ private fun entity(
+ invocation: TestInvocation,
+ tableName: String,
+ vararg fields: Field
+ ): Entity {
+ val element = invocation.typeElement("Dummy")
return Entity(
- element = mock(TypeElement::class.java),
- tableName = tableName,
- type = mock(DeclaredType::class.java),
- fields = fields.toList(),
- embeddedFields = emptyList(),
- indices = emptyList(),
- primaryKey = PrimaryKey(null, Fields(fields.take(1)), false),
- foreignKeys = emptyList(),
- constructor = Constructor(mock(ExecutableElement::class.java), emptyList()),
- shadowTableName = null
+ element = element,
+ tableName = tableName,
+ type = mock(DeclaredType::class.java),
+ fields = fields.toList(),
+ embeddedFields = emptyList(),
+ indices = emptyList(),
+ primaryKey = PrimaryKey(null, Fields(fields.take(1)), false),
+ foreignKeys = emptyList(),
+ constructor = Constructor(mock(ExecutableElement::class.java), emptyList()),
+ shadowTableName = null
)
}
@@ -272,20 +316,26 @@
)
}
- private fun field(name: String, type: TypeMirror, affinity: SQLTypeAffinity): Field {
+ private fun field(
+ name: String,
+ type: TypeMirror,
+ affinity: SQLTypeAffinity,
+ defaultValue: String? = null
+ ): Field {
val element = mock(Element::class.java)
doReturn(type).`when`(element).asType()
val f = Field(
- element = element,
- name = name,
- type = type,
- columnName = name,
- affinity = affinity,
- collate = if (useLocalizedCollation && affinity == SQLTypeAffinity.TEXT) {
- Collate.LOCALIZED
- } else {
- null
- }
+ element = element,
+ name = name,
+ type = type,
+ columnName = name,
+ affinity = affinity,
+ collate = if (useLocalizedCollation && affinity == SQLTypeAffinity.TEXT) {
+ Collate.LOCALIZED
+ } else {
+ null
+ },
+ defaultValue = defaultValue
)
assignGetterSetter(f, name, type)
return f
diff --git a/room/integration-tests/incremental-annotation-processing/build.gradle b/room/integration-tests/incremental-annotation-processing/build.gradle
index 0bbf5f9..6d4feae 100644
--- a/room/integration-tests/incremental-annotation-processing/build.gradle
+++ b/room/integration-tests/incremental-annotation-processing/build.gradle
@@ -71,6 +71,7 @@
tasks.findByPath("test").dependsOn(
tasks.findByPath(":room:room-common:uploadArchives"),
+ tasks.findByPath(":room:room-runtime:uploadArchives"),
tasks.findByPath(":room:room-migration:uploadArchives"),
tasks.findByPath(":room:room-compiler:uploadArchives"),
)
diff --git a/room/integration-tests/testapp/schemas/androidx.room.integration.testapp.migration.MigrationDb/9.json b/room/integration-tests/testapp/schemas/androidx.room.integration.testapp.migration.MigrationDb/9.json
new file mode 100644
index 0000000..b436c21
--- /dev/null
+++ b/room/integration-tests/testapp/schemas/androidx.room.integration.testapp.migration.MigrationDb/9.json
@@ -0,0 +1,125 @@
+{
+ "formatVersion": 1,
+ "database": {
+ "version": 9,
+ "identityHash": "9ced6be3cddcc35aa6ec78f36c7214da",
+ "entities": [
+ {
+ "tableName": "Entity1",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT, PRIMARY KEY(`id`))",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "name",
+ "affinity": "TEXT",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": false
+ },
+ "indices": [
+ {
+ "name": "index_Entity1_name",
+ "unique": true,
+ "columnNames": [
+ "name"
+ ],
+ "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_Entity1_name` ON `${TABLE_NAME}` (`name`)"
+ }
+ ],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "Entity2",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `addedInV3` TEXT, `name` TEXT DEFAULT 'Unknown')",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "addedInV3",
+ "columnName": "addedInV3",
+ "affinity": "TEXT",
+ "notNull": false
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "name",
+ "affinity": "TEXT",
+ "notNull": false,
+ "defaultValue": "'Unknown'"
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": true
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "Entity4",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT COLLATE NOCASE, PRIMARY KEY(`id`), FOREIGN KEY(`name`) REFERENCES `Entity1`(`name`) ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED)",
+ "fields": [
+ {
+ "fieldPath": "id",
+ "columnName": "id",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "name",
+ "affinity": "TEXT",
+ "notNull": false
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "id"
+ ],
+ "autoGenerate": false
+ },
+ "indices": [],
+ "foreignKeys": [
+ {
+ "table": "Entity1",
+ "onDelete": "NO ACTION",
+ "onUpdate": "NO ACTION",
+ "columns": [
+ "name"
+ ],
+ "referencedColumns": [
+ "name"
+ ]
+ }
+ ]
+ }
+ ],
+ "views": [
+ {
+ "viewName": "View1",
+ "createSql": "CREATE VIEW `${VIEW_NAME}` AS SELECT Entity4.id, Entity4.name, Entity1.id AS entity1Id FROM Entity4 INNER JOIN Entity1 ON Entity4.name = Entity1.name"
+ }
+ ],
+ "setupQueries": [
+ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
+ "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '9ced6be3cddcc35aa6ec78f36c7214da')"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/JournalDbPostMigrationTest.java b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/JournalDbPostMigrationTest.java
index 6cc574e..eb380d1 100644
--- a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/JournalDbPostMigrationTest.java
+++ b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/JournalDbPostMigrationTest.java
@@ -91,7 +91,7 @@
@ColumnInfo(name = "address")
public String address;
- @ColumnInfo(name = "age")
+ @ColumnInfo(name = "age", defaultValue = "0")
public int age;
}
diff --git a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/MigrationDb.java b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/MigrationDb.java
index fbea08e..f6a1545 100644
--- a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/MigrationDb.java
+++ b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/MigrationDb.java
@@ -42,7 +42,7 @@
MigrationDb.Entity4.class},
views = {MigrationDb.View1.class})
public abstract class MigrationDb extends RoomDatabase {
- static final int LATEST_VERSION = 8;
+ static final int LATEST_VERSION = 9;
static final int MAX_VERSION = 1000;
abstract MigrationDao dao();
@Entity(indices = {@Index(value = "name", unique = true)})
@@ -59,6 +59,7 @@
@PrimaryKey(autoGenerate = true)
public int id;
public String addedInV3;
+ @ColumnInfo(defaultValue = "Unknown") // Added in version 9
public String name;
}
diff --git a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/MigrationTest.java b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/MigrationTest.java
index a9372c9..268e141 100644
--- a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/MigrationTest.java
+++ b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/migration/MigrationTest.java
@@ -29,6 +29,7 @@
import android.content.Context;
+import androidx.annotation.NonNull;
import androidx.room.Room;
import androidx.room.migration.Migration;
import androidx.room.migration.bundle.SchemaBundle;
@@ -254,6 +255,26 @@
}
@Test
+ public void addDefaultValue() throws IOException {
+ SupportSQLiteDatabase db = helper.createDatabase(TEST_DB, 8);
+ final TableInfo oldTable = TableInfo.read(db, MigrationDb.Entity2.TABLE_NAME);
+ final TableInfo.Column oldColumn = oldTable.columns.get("name");
+ assertThat(oldColumn, is(notNullValue()));
+ assertThat(oldColumn.defaultValue, is(nullValue()));
+ db.close();
+ db = helper.runMigrationsAndValidate(TEST_DB, 9, false, MIGRATION_8_9);
+ final TableInfo table = TableInfo.read(db, MigrationDb.Entity2.TABLE_NAME);
+ final TableInfo.Column column = table.columns.get("name");
+ assertThat(column, is(notNullValue()));
+ assertThat(column.defaultValue, is(equalTo("'Unknown'")));
+ }
+
+ @Test
+ public void addDefaultValueFailure() throws IOException {
+ testFailure(8, 9);
+ }
+
+ @Test
public void missingMigration_onUpgrade() throws IOException {
SupportSQLiteDatabase database = helper.createDatabase(TEST_DB, 1);
database.close();
@@ -541,6 +562,20 @@
}
};
+ private static final Migration MIGRATION_8_9 = new Migration(8, 9) {
+ @Override
+ public void migrate(@NonNull SupportSQLiteDatabase database) {
+ // Add DEFAULT constraint to Entity2.name.
+ database.execSQL("ALTER TABLE Entity2 RENAME TO save_Entity2");
+ database.execSQL("CREATE TABLE IF NOT EXISTS Entity2 "
+ + "(`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
+ + "`addedInV3` TEXT, `name` TEXT DEFAULT 'Unknown')");
+ database.execSQL("INSERT INTO Entity2 (id, addedInV3, name) "
+ + "SELECT id, addedInV3, name FROM save_Entity2");
+ database.execSQL("DROP TABLE save_Entity2");
+ }
+ };
+
/**
* Downgrade migration from {@link MigrationDb#MAX_VERSION} to
* {@link MigrationDb#LATEST_VERSION} that uses the schema file and re-creates the tables such
@@ -581,7 +616,7 @@
private static final Migration[] ALL_MIGRATIONS = new Migration[]{MIGRATION_1_2,
MIGRATION_2_3, MIGRATION_3_4, MIGRATION_4_5, MIGRATION_5_6, MIGRATION_6_7,
- MIGRATION_7_8};
+ MIGRATION_7_8, MIGRATION_8_9};
static final class EmptyMigration extends Migration {
EmptyMigration(int startVersion, int endVersion) {
diff --git a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/DefaultValueTest.java b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/DefaultValueTest.java
new file mode 100644
index 0000000..71d720e
--- /dev/null
+++ b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/DefaultValueTest.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * 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 androidx.room.integration.testapp.test;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.Matchers.closeTo;
+import static org.junit.Assert.assertThat;
+
+import android.content.Context;
+
+import androidx.room.ColumnInfo;
+import androidx.room.Dao;
+import androidx.room.Database;
+import androidx.room.Entity;
+import androidx.room.PrimaryKey;
+import androidx.room.Query;
+import androidx.room.Room;
+import androidx.room.RoomDatabase;
+import androidx.room.TypeConverter;
+import androidx.room.TypeConverters;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.MediumTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.TimeZone;
+
+@RunWith(AndroidJUnit4.class)
+public class DefaultValueTest {
+
+ @SuppressWarnings("unused")
+ public static class TimestampConverter {
+
+ private static final SimpleDateFormat FORMAT = new SimpleDateFormat("yyyy-MM-dd kk:mm:ss");
+
+ static {
+ FORMAT.setTimeZone(TimeZone.getTimeZone("UTC"));
+ }
+
+ @TypeConverter
+ public String toTimestamp(Date date) {
+ return FORMAT.format(date);
+ }
+
+ @TypeConverter
+ public Date fromTimestamp(String timestamp) {
+ try {
+ return FORMAT.parse(timestamp);
+ } catch (ParseException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ @SuppressWarnings("WeakerAccess")
+ @Entity
+ public static class Sample {
+ @PrimaryKey
+ public long id;
+ public String name;
+ @ColumnInfo(defaultValue = "No description")
+ public String description;
+ @ColumnInfo(defaultValue = "1")
+ public boolean available;
+ @ColumnInfo(defaultValue = "0")
+ public int serial;
+ @ColumnInfo(defaultValue = "CURRENT_TIMESTAMP")
+ @TypeConverters(TimestampConverter.class)
+ public Date timestamp;
+ }
+
+ @Dao
+ public interface SampleDao {
+ @Query("INSERT INTO Sample (name) VALUES (:name)")
+ long insert(String name);
+
+ @Query("SELECT * FROM Sample WHERE id = :id")
+ Sample byId(long id);
+ }
+
+ @Database(entities = {Sample.class}, version = 1, exportSchema = false)
+ public abstract static class SampleDatabase extends RoomDatabase {
+ public abstract SampleDao dao();
+ }
+
+ private SampleDatabase openDatabase() {
+ final Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ return Room.inMemoryDatabaseBuilder(context, SampleDatabase.class).build();
+ }
+
+ @Test
+ @MediumTest
+ public void defaultValues() {
+ final SampleDatabase db = openDatabase();
+ final long id = db.dao().insert("A");
+ final long now = System.currentTimeMillis();
+ final Sample sample = db.dao().byId(id);
+ assertThat(sample.name, is(equalTo("A")));
+ assertThat(sample.description, is(equalTo("No description")));
+ assertThat(sample.available, is(true));
+ assertThat(sample.serial, is(0));
+ assertThat((double) sample.timestamp.getTime(), is(closeTo(now, 3000)));
+ }
+}
diff --git a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/vo/PlaylistSongXRef.java b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/vo/PlaylistSongXRef.java
index 9f0e768..fe155b6 100644
--- a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/vo/PlaylistSongXRef.java
+++ b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/vo/PlaylistSongXRef.java
@@ -20,6 +20,7 @@
import androidx.room.Entity;
import androidx.room.ForeignKey;
+import androidx.room.Index;
@Entity(
primaryKeys = {"mPlaylistId", "mSongId"},
@@ -34,6 +35,10 @@
parentColumns = "mSongId",
childColumns = "mSongId",
onDelete = CASCADE),
+ },
+ indices = {
+ @Index("mPlaylistId"),
+ @Index("mSongId")
}
)
public class PlaylistSongXRef {
diff --git a/room/migration/api/restricted_2.2.0-alpha01.txt b/room/migration/api/restricted_2.2.0-alpha01.txt
index 86cdebf..ae8f58d 100644
--- a/room/migration/api/restricted_2.2.0-alpha01.txt
+++ b/room/migration/api/restricted_2.2.0-alpha01.txt
@@ -44,9 +44,11 @@
}
@RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FieldBundle {
- ctor public FieldBundle(String!, String!, String!, boolean);
+ ctor @Deprecated public FieldBundle(String!, String!, String!, boolean);
+ ctor public FieldBundle(String!, String!, String!, boolean, String!);
method public String! getAffinity();
method public String! getColumnName();
+ method public String! getDefaultValue();
method public String! getFieldPath();
method public boolean isNonNull();
method public boolean isSchemaEqual(androidx.room.migration.bundle.FieldBundle!);
diff --git a/room/migration/api/restricted_current.txt b/room/migration/api/restricted_current.txt
index 86cdebf..ae8f58d 100644
--- a/room/migration/api/restricted_current.txt
+++ b/room/migration/api/restricted_current.txt
@@ -44,9 +44,11 @@
}
@RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FieldBundle {
- ctor public FieldBundle(String!, String!, String!, boolean);
+ ctor @Deprecated public FieldBundle(String!, String!, String!, boolean);
+ ctor public FieldBundle(String!, String!, String!, boolean, String!);
method public String! getAffinity();
method public String! getColumnName();
+ method public String! getDefaultValue();
method public String! getFieldPath();
method public boolean isNonNull();
method public boolean isSchemaEqual(androidx.room.migration.bundle.FieldBundle!);
diff --git a/room/migration/src/main/java/androidx/room/migration/bundle/FieldBundle.java b/room/migration/src/main/java/androidx/room/migration/bundle/FieldBundle.java
index cb7c03f..af4574a 100644
--- a/room/migration/src/main/java/androidx/room/migration/bundle/FieldBundle.java
+++ b/room/migration/src/main/java/androidx/room/migration/bundle/FieldBundle.java
@@ -36,12 +36,24 @@
private String mAffinity;
@SerializedName("notNull")
private boolean mNonNull;
+ @SerializedName("defaultValue")
+ private String mDefaultValue;
+ /**
+ * @deprecated Use {@link #FieldBundle(String, String, String, boolean, String)}
+ */
+ @Deprecated
public FieldBundle(String fieldPath, String columnName, String affinity, boolean nonNull) {
+ this(fieldPath, columnName, affinity, nonNull, null);
+ }
+
+ public FieldBundle(String fieldPath, String columnName, String affinity, boolean nonNull,
+ String defaultValue) {
mFieldPath = fieldPath;
mColumnName = columnName;
mAffinity = affinity;
mNonNull = nonNull;
+ mDefaultValue = defaultValue;
}
public String getFieldPath() {
@@ -60,6 +72,10 @@
return mNonNull;
}
+ public String getDefaultValue() {
+ return mDefaultValue;
+ }
+
@Override
public boolean isSchemaEqual(FieldBundle other) {
if (mNonNull != other.mNonNull) return false;
@@ -67,6 +83,10 @@
: other.mColumnName != null) {
return false;
}
+ if (mDefaultValue != null ? !mDefaultValue.equals(other.mDefaultValue)
+ : other.mDefaultValue != null) {
+ return false;
+ }
return mAffinity != null ? mAffinity.equals(other.mAffinity) : other.mAffinity == null;
}
}
diff --git a/room/migration/src/test/java/androidx/room/migration/bundle/DatabaseBundleTest.java b/room/migration/src/test/java/androidx/room/migration/bundle/DatabaseBundleTest.java
index b607e35..cff8e216 100644
--- a/room/migration/src/test/java/androidx/room/migration/bundle/DatabaseBundleTest.java
+++ b/room/migration/src/test/java/androidx/room/migration/bundle/DatabaseBundleTest.java
@@ -100,7 +100,7 @@
}
private FieldBundle createFieldBundle(String name) {
- return new FieldBundle("foo", name, "text", false);
+ return new FieldBundle("foo", name, "text", false, null);
}
private FtsOptionsBundle createFtsOptionsBundle(String contentTableName) {
diff --git a/room/migration/src/test/java/androidx/room/migration/bundle/EntityBundleTest.java b/room/migration/src/test/java/androidx/room/migration/bundle/EntityBundleTest.java
index 307f9d6..3b9bce2 100644
--- a/room/migration/src/test/java/androidx/room/migration/bundle/EntityBundleTest.java
+++ b/room/migration/src/test/java/androidx/room/migration/bundle/EntityBundleTest.java
@@ -153,7 +153,7 @@
}
private FieldBundle createFieldBundle(String name) {
- return new FieldBundle("foo", name, "text", false);
+ return new FieldBundle("foo", name, "text", false, null);
}
private IndexBundle createIndexBundle(String colName) {
diff --git a/room/migration/src/test/java/androidx/room/migration/bundle/FieldBundleTest.java b/room/migration/src/test/java/androidx/room/migration/bundle/FieldBundleTest.java
index e48114a..5061a58 100644
--- a/room/migration/src/test/java/androidx/room/migration/bundle/FieldBundleTest.java
+++ b/room/migration/src/test/java/androidx/room/migration/bundle/FieldBundleTest.java
@@ -27,36 +27,43 @@
public class FieldBundleTest {
@Test
public void schemaEquality_same_equal() {
- FieldBundle bundle = new FieldBundle("foo", "foo", "text", false);
- FieldBundle copy = new FieldBundle("foo", "foo", "text", false);
+ FieldBundle bundle = new FieldBundle("foo", "foo", "text", false, null);
+ FieldBundle copy = new FieldBundle("foo", "foo", "text", false, null);
assertThat(bundle.isSchemaEqual(copy), is(true));
}
@Test
public void schemaEquality_diffNonNull_notEqual() {
- FieldBundle bundle = new FieldBundle("foo", "foo", "text", false);
- FieldBundle copy = new FieldBundle("foo", "foo", "text", true);
+ FieldBundle bundle = new FieldBundle("foo", "foo", "text", false, null);
+ FieldBundle copy = new FieldBundle("foo", "foo", "text", true, null);
assertThat(bundle.isSchemaEqual(copy), is(false));
}
@Test
public void schemaEquality_diffColumnName_notEqual() {
- FieldBundle bundle = new FieldBundle("foo", "foo", "text", false);
- FieldBundle copy = new FieldBundle("foo", "foo2", "text", true);
+ FieldBundle bundle = new FieldBundle("foo", "foo", "text", false, null);
+ FieldBundle copy = new FieldBundle("foo", "foo2", "text", true, null);
assertThat(bundle.isSchemaEqual(copy), is(false));
}
@Test
public void schemaEquality_diffAffinity_notEqual() {
- FieldBundle bundle = new FieldBundle("foo", "foo", "text", false);
- FieldBundle copy = new FieldBundle("foo", "foo2", "int", false);
+ FieldBundle bundle = new FieldBundle("foo", "foo", "text", false, null);
+ FieldBundle copy = new FieldBundle("foo", "foo2", "int", false, null);
assertThat(bundle.isSchemaEqual(copy), is(false));
}
@Test
public void schemaEquality_diffPath_equal() {
- FieldBundle bundle = new FieldBundle("foo", "foo", "text", false);
- FieldBundle copy = new FieldBundle("foo>bar", "foo", "text", false);
+ FieldBundle bundle = new FieldBundle("foo", "foo", "text", false, null);
+ FieldBundle copy = new FieldBundle("foo>bar", "foo", "text", false, null);
assertThat(bundle.isSchemaEqual(copy), is(true));
}
+
+ @Test
+ public void schemeEquality_diffDefaultValue_notEqual() {
+ FieldBundle bundle = new FieldBundle("foo", "foo", "text", true, null);
+ FieldBundle copy = new FieldBundle("foo", "foo", "text", true, "bar");
+ assertThat(bundle.isSchemaEqual(copy), is(false));
+ }
}
diff --git a/room/runtime/api/restricted_2.2.0-alpha01.txt b/room/runtime/api/restricted_2.2.0-alpha01.txt
index 3d317a3..9fa1148 100644
--- a/room/runtime/api/restricted_2.2.0-alpha01.txt
+++ b/room/runtime/api/restricted_2.2.0-alpha01.txt
@@ -153,9 +153,11 @@
}
public static class TableInfo.Column {
- ctor public TableInfo.Column(String!, String!, boolean, int);
+ ctor @Deprecated public TableInfo.Column(String!, String!, boolean, int);
+ ctor public TableInfo.Column(String!, String!, boolean, int, String!);
method public boolean isPrimaryKey();
field public final int affinity;
+ field public final String! defaultValue;
field public final String! name;
field public final boolean notNull;
field public final int primaryKeyPosition;
diff --git a/room/runtime/api/restricted_current.txt b/room/runtime/api/restricted_current.txt
index 3d317a3..9fa1148 100644
--- a/room/runtime/api/restricted_current.txt
+++ b/room/runtime/api/restricted_current.txt
@@ -153,9 +153,11 @@
}
public static class TableInfo.Column {
- ctor public TableInfo.Column(String!, String!, boolean, int);
+ ctor @Deprecated public TableInfo.Column(String!, String!, boolean, int);
+ ctor public TableInfo.Column(String!, String!, boolean, int, String!);
method public boolean isPrimaryKey();
field public final int affinity;
+ field public final String! defaultValue;
field public final String! name;
field public final boolean notNull;
field public final int primaryKeyPosition;
diff --git a/room/runtime/src/androidTest/java/androidx/room/migration/TableInfoTest.java b/room/runtime/src/androidTest/java/androidx/room/migration/TableInfoTest.java
index 1e2bcb8..7bf0506 100644
--- a/room/runtime/src/androidTest/java/androidx/room/migration/TableInfoTest.java
+++ b/room/runtime/src/androidTest/java/androidx/room/migration/TableInfoTest.java
@@ -60,8 +60,8 @@
+ "name TEXT)");
TableInfo info = TableInfo.read(mDb, "foo");
assertThat(info, is(new TableInfo("foo",
- toMap(new TableInfo.Column("id", "INTEGER", false, 1),
- new TableInfo.Column("name", "TEXT", false, 0)),
+ toMap(new TableInfo.Column("id", "INTEGER", false, 1, null),
+ new TableInfo.Column("name", "TEXT", false, 0, null)),
Collections.<TableInfo.ForeignKey>emptySet())));
}
@@ -72,8 +72,8 @@
+ "name TEXT, PRIMARY KEY(name, id))");
TableInfo info = TableInfo.read(mDb, "foo");
assertThat(info, is(new TableInfo("foo",
- toMap(new TableInfo.Column("id", "INTEGER", false, 2),
- new TableInfo.Column("name", "TEXT", false, 1)),
+ toMap(new TableInfo.Column("id", "INTEGER", false, 2, null),
+ new TableInfo.Column("name", "TEXT", false, 1, null)),
Collections.<TableInfo.ForeignKey>emptySet())));
}
@@ -85,9 +85,9 @@
mDb.execSQL("ALTER TABLE foo ADD COLUMN added REAL;");
TableInfo info = TableInfo.read(mDb, "foo");
assertThat(info, is(new TableInfo("foo",
- toMap(new TableInfo.Column("id", "INTEGER", false, 0),
- new TableInfo.Column("name", "TEXT", false, 1),
- new TableInfo.Column("added", "REAL", false, 0)),
+ toMap(new TableInfo.Column("id", "INTEGER", false, 0, null),
+ new TableInfo.Column("name", "TEXT", false, 1, null),
+ new TableInfo.Column("added", "REAL", false, 0, null)),
Collections.<TableInfo.ForeignKey>emptySet())));
}
@@ -97,7 +97,7 @@
"CREATE TABLE foo (name TEXT NOT NULL)");
TableInfo info = TableInfo.read(mDb, "foo");
assertThat(info, is(new TableInfo("foo",
- toMap(new TableInfo.Column("name", "TEXT", true, 0)),
+ toMap(new TableInfo.Column("name", "TEXT", true, 0, null)),
Collections.<TableInfo.ForeignKey>emptySet())));
}
@@ -108,7 +108,7 @@
TableInfo info = TableInfo.read(mDb, "foo");
assertThat(info, is(new TableInfo(
"foo",
- toMap(new TableInfo.Column("name", "TEXT", false, 0)),
+ toMap(new TableInfo.Column("name", "TEXT", false, 0, "blah")),
Collections.<TableInfo.ForeignKey>emptySet())));
}
@@ -179,7 +179,7 @@
TableInfo info = TableInfo.read(mDb, "foo");
assertThat(info, is(new TableInfo(
"foo",
- toMap(new TableInfo.Column("n", "INTEGER", false, 0)),
+ toMap(new TableInfo.Column("n", "INTEGER", false, 0, null)),
Collections.<TableInfo.ForeignKey>emptySet())));
}
@@ -197,11 +197,11 @@
TableInfo info = TableInfo.read(mDb, "foo");
assertThat(info, is(new TableInfo(
"foo",
- toMap(new TableInfo.Column("n", "INTEGER", false, 0),
- new TableInfo.Column("indexed", "TEXT", false, 0),
- new TableInfo.Column("unique_indexed", "TEXT", false, 0),
- new TableInfo.Column("a", "INTEGER", false, 0),
- new TableInfo.Column("b", "INTEGER", false, 0)),
+ toMap(new TableInfo.Column("n", "INTEGER", false, 0, null),
+ new TableInfo.Column("indexed", "TEXT", false, 0, null),
+ new TableInfo.Column("unique_indexed", "TEXT", false, 0, null),
+ new TableInfo.Column("a", "INTEGER", false, 0, null),
+ new TableInfo.Column("b", "INTEGER", false, 0, null)),
Collections.<TableInfo.ForeignKey>emptySet(),
toSet(new TableInfo.Index("index_foo_blahblah", false,
Arrays.asList("a", "b")),
diff --git a/room/runtime/src/main/java/androidx/room/util/TableInfo.java b/room/runtime/src/main/java/androidx/room/util/TableInfo.java
index c187334..5acda44 100644
--- a/room/runtime/src/main/java/androidx/room/util/TableInfo.java
+++ b/room/runtime/src/main/java/androidx/room/util/TableInfo.java
@@ -218,13 +218,16 @@
int typeIndex = cursor.getColumnIndex("type");
int notNullIndex = cursor.getColumnIndex("notnull");
int pkIndex = cursor.getColumnIndex("pk");
+ int defaultValueIndex = cursor.getColumnIndex("dflt_value");
while (cursor.moveToNext()) {
final String name = cursor.getString(nameIndex);
final String type = cursor.getString(typeIndex);
final boolean notNull = 0 != cursor.getInt(notNullIndex);
final int primaryKeyPosition = cursor.getInt(pkIndex);
- columns.put(name, new Column(name, type, notNull, primaryKeyPosition));
+ final String defaultValue = cursor.getString(defaultValueIndex);
+ columns.put(name,
+ new Column(name, type, notNull, primaryKeyPosition, defaultValue));
}
}
} finally {
@@ -342,14 +345,28 @@
* positives.
*/
public final int primaryKeyPosition;
+ /**
+ * The default value of this column.
+ */
+ public final String defaultValue;
+
+ /**
+ * @deprecated Use {@link Column#Column(String, String, boolean, int, String)} instead.
+ */
+ @Deprecated
+ public Column(String name, String type, boolean notNull, int primaryKeyPosition) {
+ this(name, type, notNull, primaryKeyPosition, null);
+ }
// if you change this constructor, you must change TableInfoWriter.kt
- public Column(String name, String type, boolean notNull, int primaryKeyPosition) {
+ public Column(String name, String type, boolean notNull, int primaryKeyPosition,
+ String defaultValue) {
this.name = name;
this.type = type;
this.notNull = notNull;
this.primaryKeyPosition = primaryKeyPosition;
this.affinity = findAffinity(type);
+ this.defaultValue = defaultValue;
}
/**
@@ -400,6 +417,11 @@
if (!name.equals(column.name)) return false;
//noinspection SimplifiableIfStatement
if (notNull != column.notNull) return false;
+ //noinspection EqualsReplaceableByObjectsCall
+ if (defaultValue != null ? !defaultValue.equals(column.defaultValue)
+ : column.defaultValue != null) {
+ return false;
+ }
return affinity == column.affinity;
}
@@ -418,6 +440,7 @@
result = 31 * result + affinity;
result = 31 * result + (notNull ? 1231 : 1237);
result = 31 * result + primaryKeyPosition;
+ result = 31 * result + (defaultValue != null ? defaultValue.hashCode() : 0);
return result;
}
@@ -429,6 +452,7 @@
+ ", affinity='" + affinity + '\''
+ ", notNull=" + notNull
+ ", primaryKeyPosition=" + primaryKeyPosition
+ + ", defaultValue='" + defaultValue + '\''
+ '}';
}
}
diff --git a/room/testing/src/main/java/androidx/room/testing/MigrationTestHelper.java b/room/testing/src/main/java/androidx/room/testing/MigrationTestHelper.java
index d9611e6..c8a10e6 100644
--- a/room/testing/src/main/java/androidx/room/testing/MigrationTestHelper.java
+++ b/room/testing/src/main/java/androidx/room/testing/MigrationTestHelper.java
@@ -387,7 +387,7 @@
private static TableInfo.Column toColumn(EntityBundle entity, FieldBundle field) {
return new TableInfo.Column(field.getColumnName(), field.getAffinity(),
- field.isNonNull(), findPrimaryKeyPosition(entity, field));
+ field.isNonNull(), findPrimaryKeyPosition(entity, field), field.getDefaultValue());
}
private static int findPrimaryKeyPosition(EntityBundle entity, FieldBundle field) {
diff --git a/settings.gradle b/settings.gradle
index 1a89875..c6aa948 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -109,24 +109,26 @@
includeProject(":lifecycle:integration-tests:incrementality", "lifecycle/integration-tests/incrementality")
includeProject(":lifecycle:integration-tests:lifecycle-testapp", "lifecycle/integration-tests/testapp")
includeProject(":lifecycle:integration-tests:lifecycle-testapp-kotlin", "lifecycle/integration-tests/kotlintestapp")
-includeProject(":lifecycle:lifecycle-common", "lifecycle/common")
-includeProject(":lifecycle:lifecycle-common-java8", "lifecycle/common-java8")
-includeProject(":lifecycle:lifecycle-compiler", "lifecycle/compiler")
-includeProject(":lifecycle:lifecycle-extensions", "lifecycle/extensions")
-includeProject(":lifecycle:lifecycle-livedata-core", "lifecycle/livedata-core")
-includeProject(":lifecycle:lifecycle-livedata-core-ktx", "lifecycle/livedata-core/ktx")
-includeProject(":lifecycle:lifecycle-livedata", "lifecycle/livedata")
-includeProject(":lifecycle:lifecycle-livedata-ktx", "lifecycle/livedata/ktx")
-includeProject(":lifecycle:lifecycle-process", "lifecycle/process")
-includeProject(":lifecycle:lifecycle-reactivestreams", "lifecycle/reactivestreams")
-includeProject(":lifecycle:lifecycle-reactivestreams-ktx", "lifecycle/reactivestreams/ktx")
-includeProject(":lifecycle:lifecycle-runtime", "lifecycle/runtime")
-includeProject(":lifecycle:lifecycle-runtime-ktx", "lifecycle/runtime/ktx")
-includeProject(":lifecycle:lifecycle-runtime-ktx-lint", "lifecycle/runtime/ktx/lint")
-includeProject(":lifecycle:lifecycle-service", "lifecycle/service")
-includeProject(":lifecycle:lifecycle-viewmodel", "lifecycle/viewmodel")
-includeProject(":lifecycle:lifecycle-viewmodel-ktx", "lifecycle/viewmodel/ktx")
-includeProject(":lifecycle:lifecycle-viewmodel-savedstate","lifecycle/viewmodel-savedstate")
+includeProject(":lifecycle:lifecycle-common", "lifecycle/lifecycle-common")
+// scheduled for removal, because it is part of common now. It was left only for docs
+// (till next release of alpha)
+includeProject(":lifecycle:lifecycle-common-java8", "lifecycle/lifecycle-common-java8")
+includeProject(":lifecycle:lifecycle-compiler", "lifecycle/lifecycle-compiler")
+includeProject(":lifecycle:lifecycle-extensions", "lifecycle/lifecycle-extensions")
+includeProject(":lifecycle:lifecycle-livedata-core", "lifecycle/lifecycle-livedata-core")
+includeProject(":lifecycle:lifecycle-livedata-core-ktx", "lifecycle/lifecycle-livedata-core-ktx")
+includeProject(":lifecycle:lifecycle-livedata", "lifecycle/lifecycle-livedata")
+includeProject(":lifecycle:lifecycle-livedata-ktx", "lifecycle/lifecycle-livedata-ktx")
+includeProject(":lifecycle:lifecycle-process", "lifecycle/lifecycle-process")
+includeProject(":lifecycle:lifecycle-reactivestreams", "lifecycle/lifecycle-reactivestreams")
+includeProject(":lifecycle:lifecycle-reactivestreams-ktx", "lifecycle/lifecycle-reactivestreams-ktx")
+includeProject(":lifecycle:lifecycle-runtime", "lifecycle/lifecycle-runtime")
+includeProject(":lifecycle:lifecycle-runtime-ktx", "lifecycle/lifecycle-runtime-ktx")
+includeProject(":lifecycle:lifecycle-runtime-ktx-lint", "lifecycle/lifecycle-runtime-ktx-lint")
+includeProject(":lifecycle:lifecycle-service", "lifecycle/lifecycle-service")
+includeProject(":lifecycle:lifecycle-viewmodel", "lifecycle/lifecycle-viewmodel")
+includeProject(":lifecycle:lifecycle-viewmodel-ktx", "lifecycle/lifecycle-viewmodel-ktx")
+includeProject(":lifecycle:lifecycle-viewmodel-savedstate","lifecycle/lifecycle-viewmodel-savedstate")
includeProject(":loader:loader", "loader/loader")
includeProject(":loader:loader-ktx", "loader/loader-ktx")
includeProject(":localbroadcastmanager", "localbroadcastmanager")
diff --git a/ui/framework/api/1.0.0-alpha01.txt b/ui/framework/api/1.0.0-alpha01.txt
index 5026c84..104650a 100644
--- a/ui/framework/api/1.0.0-alpha01.txt
+++ b/ui/framework/api/1.0.0-alpha01.txt
@@ -119,30 +119,6 @@
method public static void RepaintBoundary(String? name = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
}
- public final class Selection {
- ctor public Selection(androidx.ui.engine.geometry.Offset startOffset, androidx.ui.engine.geometry.Offset endOffset, androidx.ui.core.LayoutCoordinates? startLayoutCoordinates, androidx.ui.core.LayoutCoordinates? endLayoutCoordinates);
- method public androidx.ui.engine.geometry.Offset component1();
- method public androidx.ui.engine.geometry.Offset component2();
- method public androidx.ui.core.LayoutCoordinates? component3();
- method public androidx.ui.core.LayoutCoordinates? component4();
- method public androidx.ui.core.Selection copy(androidx.ui.engine.geometry.Offset startOffset, androidx.ui.engine.geometry.Offset endOffset, androidx.ui.core.LayoutCoordinates? startLayoutCoordinates, androidx.ui.core.LayoutCoordinates? endLayoutCoordinates);
- method public androidx.ui.core.LayoutCoordinates? getEndLayoutCoordinates();
- method public androidx.ui.engine.geometry.Offset getEndOffset();
- method public androidx.ui.core.LayoutCoordinates? getStartLayoutCoordinates();
- method public androidx.ui.engine.geometry.Offset getStartOffset();
- }
-
- public final class SelectionKt {
- ctor public SelectionKt();
- method public static void SelectionContainer(androidx.ui.core.Selection? selection, kotlin.jvm.functions.Function1<? super androidx.ui.core.Selection,kotlin.Unit> onSelectionChange, kotlin.jvm.functions.Function0<kotlin.Unit> children);
- method public static androidx.compose.Ambient<androidx.ui.core.SelectionRegistrar> getSelectionRegistrarAmbient();
- }
-
- public interface SelectionRegistrar {
- method public Object subscribe(androidx.ui.core.TextSelectionHandler handler);
- method public void unsubscribe(Object key);
- }
-
public final class SemanticsKt {
ctor public SemanticsKt();
method public static void Semantics(boolean container = false, boolean explicitChildNodes = false, Boolean? enabled = null, Boolean? checked = null, Boolean? selected = null, Boolean? button = null, Boolean? inMutuallyExclusiveGroup = null, Boolean? hidden = null, String? label = null, String? value = null, androidx.ui.engine.text.TextDirection? textDirection = null, String? testTag = null, java.util.List<? extends androidx.ui.core.semantics.SemanticsAction<?>> actions = emptyList(), kotlin.jvm.functions.Function0<kotlin.Unit> children);
@@ -163,10 +139,6 @@
method public static androidx.compose.Effect<androidx.ui.painting.TextStyle> currentTextStyle();
}
- public interface TextSelectionHandler {
- method public androidx.ui.core.Selection? getSelection(kotlin.Pair<androidx.ui.core.PxPosition,androidx.ui.core.PxPosition> selectionCoordinates, androidx.ui.core.LayoutCoordinates containerLayoutCoordinates);
- }
-
public final class TextSpanComposeKt {
ctor public TextSpanComposeKt();
method public static void Span(androidx.ui.core.TextSpanScope, String? text = null, androidx.ui.painting.TextStyle? style = null, kotlin.jvm.functions.Function1<? super androidx.ui.core.TextSpanScope,kotlin.Unit> child);
@@ -275,6 +247,32 @@
}
+package androidx.ui.core.selection {
+
+ public final class Selection {
+ ctor public Selection(androidx.ui.engine.geometry.Rect startOffset, androidx.ui.engine.geometry.Rect endOffset, androidx.ui.core.LayoutCoordinates? startLayoutCoordinates, androidx.ui.core.LayoutCoordinates? endLayoutCoordinates);
+ method public androidx.ui.engine.geometry.Rect component1();
+ method public androidx.ui.engine.geometry.Rect component2();
+ method public androidx.ui.core.LayoutCoordinates? component3();
+ method public androidx.ui.core.LayoutCoordinates? component4();
+ method public androidx.ui.core.selection.Selection copy(androidx.ui.engine.geometry.Rect startOffset, androidx.ui.engine.geometry.Rect endOffset, androidx.ui.core.LayoutCoordinates? startLayoutCoordinates, androidx.ui.core.LayoutCoordinates? endLayoutCoordinates);
+ method public androidx.ui.core.LayoutCoordinates? getEndLayoutCoordinates();
+ method public androidx.ui.engine.geometry.Rect getEndOffset();
+ method public androidx.ui.core.LayoutCoordinates? getStartLayoutCoordinates();
+ method public androidx.ui.engine.geometry.Rect getStartOffset();
+ }
+
+ public final class SelectionContainerKt {
+ ctor public SelectionContainerKt();
+ method public static void SelectionContainer(androidx.ui.core.selection.Selection? selection, kotlin.jvm.functions.Function1<? super androidx.ui.core.selection.Selection,kotlin.Unit> onSelectionChange, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+ }
+
+ public final class SelectionManagerKt {
+ ctor public SelectionManagerKt();
+ }
+
+}
+
package androidx.ui.core.vectorgraphics {
public interface Brush {
diff --git a/ui/framework/api/current.txt b/ui/framework/api/current.txt
index 5026c84..104650a 100644
--- a/ui/framework/api/current.txt
+++ b/ui/framework/api/current.txt
@@ -119,30 +119,6 @@
method public static void RepaintBoundary(String? name = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
}
- public final class Selection {
- ctor public Selection(androidx.ui.engine.geometry.Offset startOffset, androidx.ui.engine.geometry.Offset endOffset, androidx.ui.core.LayoutCoordinates? startLayoutCoordinates, androidx.ui.core.LayoutCoordinates? endLayoutCoordinates);
- method public androidx.ui.engine.geometry.Offset component1();
- method public androidx.ui.engine.geometry.Offset component2();
- method public androidx.ui.core.LayoutCoordinates? component3();
- method public androidx.ui.core.LayoutCoordinates? component4();
- method public androidx.ui.core.Selection copy(androidx.ui.engine.geometry.Offset startOffset, androidx.ui.engine.geometry.Offset endOffset, androidx.ui.core.LayoutCoordinates? startLayoutCoordinates, androidx.ui.core.LayoutCoordinates? endLayoutCoordinates);
- method public androidx.ui.core.LayoutCoordinates? getEndLayoutCoordinates();
- method public androidx.ui.engine.geometry.Offset getEndOffset();
- method public androidx.ui.core.LayoutCoordinates? getStartLayoutCoordinates();
- method public androidx.ui.engine.geometry.Offset getStartOffset();
- }
-
- public final class SelectionKt {
- ctor public SelectionKt();
- method public static void SelectionContainer(androidx.ui.core.Selection? selection, kotlin.jvm.functions.Function1<? super androidx.ui.core.Selection,kotlin.Unit> onSelectionChange, kotlin.jvm.functions.Function0<kotlin.Unit> children);
- method public static androidx.compose.Ambient<androidx.ui.core.SelectionRegistrar> getSelectionRegistrarAmbient();
- }
-
- public interface SelectionRegistrar {
- method public Object subscribe(androidx.ui.core.TextSelectionHandler handler);
- method public void unsubscribe(Object key);
- }
-
public final class SemanticsKt {
ctor public SemanticsKt();
method public static void Semantics(boolean container = false, boolean explicitChildNodes = false, Boolean? enabled = null, Boolean? checked = null, Boolean? selected = null, Boolean? button = null, Boolean? inMutuallyExclusiveGroup = null, Boolean? hidden = null, String? label = null, String? value = null, androidx.ui.engine.text.TextDirection? textDirection = null, String? testTag = null, java.util.List<? extends androidx.ui.core.semantics.SemanticsAction<?>> actions = emptyList(), kotlin.jvm.functions.Function0<kotlin.Unit> children);
@@ -163,10 +139,6 @@
method public static androidx.compose.Effect<androidx.ui.painting.TextStyle> currentTextStyle();
}
- public interface TextSelectionHandler {
- method public androidx.ui.core.Selection? getSelection(kotlin.Pair<androidx.ui.core.PxPosition,androidx.ui.core.PxPosition> selectionCoordinates, androidx.ui.core.LayoutCoordinates containerLayoutCoordinates);
- }
-
public final class TextSpanComposeKt {
ctor public TextSpanComposeKt();
method public static void Span(androidx.ui.core.TextSpanScope, String? text = null, androidx.ui.painting.TextStyle? style = null, kotlin.jvm.functions.Function1<? super androidx.ui.core.TextSpanScope,kotlin.Unit> child);
@@ -275,6 +247,32 @@
}
+package androidx.ui.core.selection {
+
+ public final class Selection {
+ ctor public Selection(androidx.ui.engine.geometry.Rect startOffset, androidx.ui.engine.geometry.Rect endOffset, androidx.ui.core.LayoutCoordinates? startLayoutCoordinates, androidx.ui.core.LayoutCoordinates? endLayoutCoordinates);
+ method public androidx.ui.engine.geometry.Rect component1();
+ method public androidx.ui.engine.geometry.Rect component2();
+ method public androidx.ui.core.LayoutCoordinates? component3();
+ method public androidx.ui.core.LayoutCoordinates? component4();
+ method public androidx.ui.core.selection.Selection copy(androidx.ui.engine.geometry.Rect startOffset, androidx.ui.engine.geometry.Rect endOffset, androidx.ui.core.LayoutCoordinates? startLayoutCoordinates, androidx.ui.core.LayoutCoordinates? endLayoutCoordinates);
+ method public androidx.ui.core.LayoutCoordinates? getEndLayoutCoordinates();
+ method public androidx.ui.engine.geometry.Rect getEndOffset();
+ method public androidx.ui.core.LayoutCoordinates? getStartLayoutCoordinates();
+ method public androidx.ui.engine.geometry.Rect getStartOffset();
+ }
+
+ public final class SelectionContainerKt {
+ ctor public SelectionContainerKt();
+ method public static void SelectionContainer(androidx.ui.core.selection.Selection? selection, kotlin.jvm.functions.Function1<? super androidx.ui.core.selection.Selection,kotlin.Unit> onSelectionChange, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+ }
+
+ public final class SelectionManagerKt {
+ ctor public SelectionManagerKt();
+ }
+
+}
+
package androidx.ui.core.vectorgraphics {
public interface Brush {
diff --git a/ui/framework/src/main/java/androidx/ui/core/Selection.kt b/ui/framework/src/main/java/androidx/ui/core/Selection.kt
deleted file mode 100644
index 4b0846c..0000000
--- a/ui/framework/src/main/java/androidx/ui/core/Selection.kt
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * 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 androidx.ui.core
-
-import androidx.ui.core.gesture.PressIndicatorGestureDetector
-import androidx.ui.engine.geometry.Offset
-import androidx.ui.graphics.Color
-import androidx.ui.painting.Paint
-import androidx.compose.Ambient
-import androidx.compose.Children
-import androidx.compose.Composable
-import androidx.compose.composer
-import androidx.compose.memo
-import androidx.compose.unaryPlus
-
-private val HANDLE_WIDTH = 20.px
-private val HANDLE_HEIGHT = 100.px
-
-/**
- * Data class of Selection.
- */
-data class Selection(
- /**
- * The coordinates of the start offset of the selection. For text, it's the left bottom corner
- * of the character at the start offset.
- */
- val startOffset: Offset,
- /**
- * The coordinates of the end offset of the selection. For text, it's the left bottom corner
- * of the character at the end offset.
- */
- val endOffset: Offset,
- /**
- * The layout coordinates of the child which contains the start of the selection. If the child
- * does not contain the start of the selection, this should be null.
- */
- val startLayoutCoordinates: LayoutCoordinates?,
- /**
- * The layout coordinates of the child which contains the end of the selection. If the child
- * does not contain the end of the selection, this should be null.
- */
- val endLayoutCoordinates: LayoutCoordinates?
-)
-
-/**
- * An interface handling selection. Get selection from a widget by passing in the start and end of
- * selection in a selection container as a pair, and the layout coordinates of the selection
- * container.
- */
-interface TextSelectionHandler {
- fun getSelection(
- selectionCoordinates: Pair<PxPosition, PxPosition>,
- containerLayoutCoordinates: LayoutCoordinates
- ): Selection?
-}
-
-/**
- * An interface allowing a Text composable to "register" and "unregister" itself with the class
- * implementing the interface.
- */
-interface SelectionRegistrar {
- // TODO(qqd): Replace Any with a type in future.
- fun subscribe(handler: TextSelectionHandler): Any
-
- fun unsubscribe(key: Any)
-}
-
-internal class SelectionManager : SelectionRegistrar {
- /**
- * This is essentially the list of registered components that want
- * to handle text selection that are below the SelectionContainer.
- */
- val handlers = mutableSetOf<TextSelectionHandler>()
-
- /**
- * Layout Coordinates of the selection container.
- */
- var containerLayoutCoordinates: LayoutCoordinates? = null
-
- /**
- * Allow a Text composable to "register" itself with the manager
- */
- override fun subscribe(handler: TextSelectionHandler): Any {
- handlers.add(handler)
- return handler
- }
-
- /**
- * Allow a Text composable to "unregister" itself with the manager
- */
- override fun unsubscribe(key: Any) {
- handlers.remove(key as TextSelectionHandler)
- }
-
- var selection: Selection? = null
-
- var onSelectionChange: (Selection?) -> Unit = {}
-
- fun onPress(position: PxPosition) {
- var result: Selection? = null
- for (handler in handlers) {
- result = handler.getSelection(Pair(position, position), containerLayoutCoordinates!!)
- }
- onSelectionChange(result)
- }
-}
-
-/** Ambient of SelectionRegistrar for SelectionManager. */
-val SelectionRegistrarAmbient = Ambient.of<SelectionRegistrar> { SelectionManager() }
-
-/**
- * Selection Widget.
- *
- * The selection widget wraps composables and let them to be selectable. It paints the selection
- * area with start and end handles.
- */
-@Composable
-fun SelectionContainer(
- /** Current Selection status.*/
- selection: Selection?,
- /** A function containing customized behaviour when selection changes. */
- onSelectionChange: (Selection?) -> Unit,
- @Children children: @Composable() () -> Unit
-) {
- val manager = +memo { SelectionManager() }
- // TODO (qqd): After selection widget is fully implemented, evaluate if the following 2 items
- // are expensive. If so, use
- // +memo(selection) { manager.selection = selection }
- // +memo(onSelectionChange) { manager.onSelectionChange = onSelectionChange }
- manager.selection = selection
- manager.onSelectionChange = onSelectionChange
-
- SelectionRegistrarAmbient.Provider(value = manager) {
- val content = @Composable {
- val content = @Composable() {
- // Get the layout coordinates of the selection container. This is for hit test of
- // cross-widget selection.
- OnPositioned(onPositioned = { manager.containerLayoutCoordinates = it })
- PressIndicatorGestureDetector(onStart = { position -> manager.onPress(position) }) {
- children()
- }
- }
- Layout(children = content, layoutBlock = { measurables, constraints ->
- val placeable = measurables.firstOrNull()?.measure(constraints)
- val width = placeable?.width ?: constraints.minWidth
- val height = placeable?.height ?: constraints.minHeight
- layout(width, height) {
- placeable?.place(0.ipx, 0.ipx)
- }
- })
- }
- val startHandle = @Composable {
- Layout(children = { SelectionHandle() }, layoutBlock = { _, constraints ->
- layout(constraints.minWidth, constraints.minHeight) {}
- })
- }
- val endHandle = @Composable {
- Layout(children = { SelectionHandle() }, layoutBlock = { _, constraints ->
- layout(constraints.minWidth, constraints.minHeight) {}
- })
- }
- @Suppress("USELESS_CAST")
- Layout(
- childrenArray = arrayOf(content, startHandle, endHandle),
- layoutBlock = { measurables, constraints ->
- val placeable = measurables[0].measure(constraints)
- val width = placeable.width
- val height = placeable.height
- val start =
- measurables[startHandle as () -> Unit].first().measure(
- Constraints.tightConstraints(
- HANDLE_WIDTH.round(),
- HANDLE_HEIGHT.round()
- )
- )
- val end =
- measurables[endHandle as () -> Unit].first().measure(
- Constraints.tightConstraints(
- HANDLE_WIDTH.round(),
- HANDLE_HEIGHT.round()
- )
- )
- layout(width, height) {
- placeable.place(IntPx.Zero, IntPx.Zero)
- if (selection != null &&
- selection.startLayoutCoordinates != null &&
- selection.endLayoutCoordinates != null) {
- val startOffset = manager.containerLayoutCoordinates!!.childToLocal(
- selection.startLayoutCoordinates,
- PxPosition(selection.startOffset.dx.px, selection.startOffset.dy.px)
- )
- val endOffset = manager.containerLayoutCoordinates!!.childToLocal(
- selection.endLayoutCoordinates,
- PxPosition(selection.endOffset.dx.px, selection.endOffset.dy.px)
- )
- start.place(startOffset.x, startOffset.y - HANDLE_HEIGHT)
- end.place(endOffset.x - HANDLE_WIDTH, endOffset.y - HANDLE_HEIGHT)
- }
- }
- })
- }
-}
-
-@Composable
-internal fun SelectionHandle() {
- val paint = +memo { Paint() }
- paint.color = Color(0xAAD94633.toInt())
- Draw { canvas, parentSize ->
- canvas.drawRect(parentSize.toRect(), paint)
- }
-}
diff --git a/ui/framework/src/main/java/androidx/ui/core/Text.kt b/ui/framework/src/main/java/androidx/ui/core/Text.kt
index 222e421..b039494 100644
--- a/ui/framework/src/main/java/androidx/ui/core/Text.kt
+++ b/ui/framework/src/main/java/androidx/ui/core/Text.kt
@@ -37,6 +37,10 @@
import androidx.compose.memo
import androidx.compose.onDispose
import androidx.compose.unaryPlus
+import androidx.ui.core.selection.Selection
+import androidx.ui.core.selection.SelectionRegistrarAmbient
+import androidx.ui.core.selection.TextSelectionHandler
+import androidx.ui.engine.text.TextAffinity
import androidx.ui.painting.TextPainter
private val DefaultTextAlign: TextAlign = TextAlign.Start
@@ -214,30 +218,37 @@
val startPx = selectionCoordinates.first - relativePosition
val endPx = selectionCoordinates.second - relativePosition
- val start = Offset(startPx.x.value, startPx.y.value)
- val end = Offset(endPx.x.value, endPx.y.value)
+ val startOffset = Offset(startPx.x.value, startPx.y.value)
+ val endOffset = Offset(endPx.x.value, endPx.y.value)
- var selectionStart = textPainter.getPositionForOffset(start)
- var selectionEnd = textPainter.getPositionForOffset(end)
+ var selectionStart = textPainter.getPositionForOffset(startOffset)
+ var selectionEnd = textPainter.getPositionForOffset(endOffset)
if (selectionStart.offset == selectionEnd.offset) {
val wordBoundary = textPainter.getWordBoundary(selectionStart)
selectionStart =
TextPosition(wordBoundary.start, selectionStart.affinity)
selectionEnd = TextPosition(wordBoundary.end, selectionEnd.affinity)
+ } else {
+ // Currently on Android, selection end is the offset after last character.
+ // But when dragging happens, current Crane Text Selection end is the offset
+ // of the last character. Thus before calling drawing selection background,
+ // make the selection end matches Android behaviour.
+ selectionEnd = TextPosition(selectionEnd.offset + 1, TextAffinity.upstream)
}
internalSelection.value =
TextSelection(selectionStart.offset, selectionEnd.offset)
- // TODO(qqd): Determine a set of coordinates around a character that we need.
- // Clean up the lower layer's getCaretForTextPosition methods.
- // Currently the left bottom corner of a character is returned.
+ // In Crane Text Selection, the selection end should be the last character, thus
+ // make the selection end matches Crane behaviour.
+ selectionEnd = TextPosition(selectionEnd.offset - 1, TextAffinity.upstream)
+
return Selection(
startOffset =
- textPainter.getCaretForTextPosition(selectionStart).second,
+ textPainter.getBoundingBoxForTextPosition(selectionStart),
endOffset =
- textPainter.getCaretForTextPosition(selectionEnd).second,
+ textPainter.getBoundingBoxForTextPosition(selectionEnd),
startLayoutCoordinates = layoutCoordinates.value!!,
endLayoutCoordinates = layoutCoordinates.value!!
)
diff --git a/ui/framework/src/main/java/androidx/ui/core/selection/Selection.kt b/ui/framework/src/main/java/androidx/ui/core/selection/Selection.kt
new file mode 100644
index 0000000..fd376e0
--- /dev/null
+++ b/ui/framework/src/main/java/androidx/ui/core/selection/Selection.kt
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * 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 androidx.ui.core.selection
+
+import androidx.ui.core.LayoutCoordinates
+import androidx.ui.engine.geometry.Rect
+
+/**
+ * Data class of Selection.
+ */
+data class Selection(
+ /**
+ * The bounding box of the character at the start offset as Rect. The bounding box includes the
+ * top, bottom, left, and right of the character. Note: It is temporary to use Rect.
+ */
+ // TODO(qqd): After solving the problem of getting the coordinates of a character, figure out
+ // what should the startOffset and endOffset should be.
+ val startOffset: Rect,
+ /**
+ * The bounding box of the character at the end offset as Rect. The bounding box includes the
+ * top, bottom, left, and right of the character. Note: It is temporary to use Rect.
+ */
+ val endOffset: Rect,
+ /**
+ * The layout coordinates of the child which contains the start of the selection. If the child
+ * does not contain the start of the selection, this should be null.
+ */
+ val startLayoutCoordinates: LayoutCoordinates?,
+ /**
+ * The layout coordinates of the child which contains the end of the selection. If the child
+ * does not contain the end of the selection, this should be null.
+ */
+ val endLayoutCoordinates: LayoutCoordinates?
+)
\ No newline at end of file
diff --git a/ui/framework/src/main/java/androidx/ui/core/selection/SelectionContainer.kt b/ui/framework/src/main/java/androidx/ui/core/selection/SelectionContainer.kt
new file mode 100644
index 0000000..84d9793
--- /dev/null
+++ b/ui/framework/src/main/java/androidx/ui/core/selection/SelectionContainer.kt
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * 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 androidx.ui.core.selection
+
+import androidx.compose.Children
+import androidx.compose.Composable
+import androidx.compose.composer
+import androidx.compose.memo
+import androidx.compose.unaryPlus
+import androidx.ui.core.Constraints
+import androidx.ui.core.Draw
+import androidx.ui.core.IntPx
+import androidx.ui.core.Layout
+import androidx.ui.core.OnPositioned
+import androidx.ui.core.PxPosition
+import androidx.ui.core.gesture.DragGestureDetector
+import androidx.ui.core.gesture.PressIndicatorGestureDetector
+import androidx.ui.core.ipx
+import androidx.ui.core.px
+import androidx.ui.core.round
+import androidx.ui.core.toRect
+import androidx.ui.graphics.Color
+import androidx.ui.painting.Paint
+
+private val HANDLE_WIDTH = 100.px
+private val HANDLE_HEIGHT = 100.px
+
+/**
+ * Selection Widget.
+ *
+ * The selection widget wraps composables and let them to be selectable. It paints the selection
+ * area with start and end handles.
+ */
+@Composable
+fun SelectionContainer(
+ /** Current Selection status.*/
+ selection: Selection?,
+ /** A function containing customized behaviour when selection changes. */
+ onSelectionChange: (Selection?) -> Unit,
+ @Children children: @Composable() () -> Unit
+) {
+ val manager = +memo { SelectionManager() }
+ // TODO (qqd): After selection widget is fully implemented, evaluate if the following 2 items
+ // are expensive. If so, use
+ // +memo(selection) { manager.selection = selection }
+ // +memo(onSelectionChange) { manager.onSelectionChange = onSelectionChange }
+ manager.selection = selection
+ manager.onSelectionChange = onSelectionChange
+
+ SelectionRegistrarAmbient.Provider(value = manager) {
+ val content = @Composable {
+ val content = @Composable() {
+ // Get the layout coordinates of the selection container. This is for hit test of
+ // cross-widget selection.
+ OnPositioned(onPositioned = { manager.containerLayoutCoordinates = it })
+ PressIndicatorGestureDetector(onStart = { position -> manager.onPress(position) }) {
+ children()
+ }
+ }
+ Layout(children = content, layoutBlock = { measurables, constraints ->
+ val placeable = measurables.firstOrNull()?.measure(constraints)
+ val width = placeable?.width ?: constraints.minWidth
+ val height = placeable?.height ?: constraints.minHeight
+ layout(width, height) {
+ placeable?.place(0.ipx, 0.ipx)
+ }
+ })
+ }
+ val startHandle = @Composable {
+ DragGestureDetector(
+ canDrag = { true },
+ dragObserver = manager.handleDragObserver(dragStartHandle = true)
+ ) {
+ Layout(
+ children = { SelectionHandle() },
+ layoutBlock = { _, constraints ->
+ layout(constraints.minWidth, constraints.minHeight) {}
+ })
+ }
+ }
+ val endHandle = @Composable {
+ DragGestureDetector(
+ canDrag = { true },
+ dragObserver = manager.handleDragObserver(dragStartHandle = false)
+ ) {
+ Layout(
+ children = { SelectionHandle() },
+ layoutBlock = { _, constraints ->
+ layout(constraints.minWidth, constraints.minHeight) {}
+ })
+ }
+ }
+ @Suppress("USELESS_CAST")
+ (Layout(
+ childrenArray = arrayOf(content, startHandle, endHandle),
+ layoutBlock = { measurables, constraints ->
+ val placeable = measurables[0].measure(constraints)
+ val width = placeable.width
+ val height = placeable.height
+ val start =
+ measurables[startHandle as () -> Unit].first().measure(
+ Constraints.tightConstraints(
+ HANDLE_WIDTH.round(),
+ HANDLE_HEIGHT.round()
+ )
+ )
+ val end =
+ measurables[endHandle as () -> Unit].first().measure(
+ Constraints.tightConstraints(
+ HANDLE_WIDTH.round(),
+ HANDLE_HEIGHT.round()
+ )
+ )
+ layout(width, height) {
+ placeable.place(IntPx.Zero, IntPx.Zero)
+ if (selection != null &&
+ selection.startLayoutCoordinates != null &&
+ selection.endLayoutCoordinates != null
+ ) {
+ val startOffset = manager.containerLayoutCoordinates.childToLocal(
+ selection.startLayoutCoordinates,
+ PxPosition(
+ selection.startOffset.left.px,
+ selection.startOffset.bottom.px
+ )
+ )
+ val endOffset = manager.containerLayoutCoordinates.childToLocal(
+ selection.endLayoutCoordinates,
+ PxPosition(
+ selection.endOffset.right.px,
+ selection.endOffset.bottom.px
+ )
+ )
+ start.place(startOffset.x - HANDLE_WIDTH, startOffset.y - HANDLE_HEIGHT)
+ end.place(endOffset.x, endOffset.y - HANDLE_HEIGHT)
+ }
+ }
+ }))
+ }
+}
+
+@Composable
+internal fun SelectionHandle() {
+ val paint = +memo { Paint() }
+ paint.color = Color(0xAAD94633.toInt())
+ Draw { canvas, parentSize ->
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+}
diff --git a/ui/framework/src/main/java/androidx/ui/core/selection/SelectionManager.kt b/ui/framework/src/main/java/androidx/ui/core/selection/SelectionManager.kt
new file mode 100644
index 0000000..64727fd
--- /dev/null
+++ b/ui/framework/src/main/java/androidx/ui/core/selection/SelectionManager.kt
@@ -0,0 +1,185 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * 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 androidx.ui.core.selection
+
+import androidx.compose.Ambient
+import androidx.ui.core.LayoutCoordinates
+import androidx.ui.core.PxPosition
+import androidx.ui.core.gesture.DragObserver
+import androidx.ui.core.px
+import androidx.ui.engine.geometry.Rect
+
+/**
+ * An interface handling selection. Get selection from a widget by passing in the start and end of
+ * selection in a selection container as a pair, and the layout coordinates of the selection
+ * container.
+ */
+internal interface TextSelectionHandler {
+ fun getSelection(
+ selectionCoordinates: Pair<PxPosition, PxPosition>,
+ containerLayoutCoordinates: LayoutCoordinates
+ ): Selection?
+}
+
+/**
+ * An interface allowing a Text composable to "register" and "unregister" itself with the class
+ * implementing the interface.
+ */
+internal interface SelectionRegistrar {
+ // TODO(qqd): Replace Any with a type in future.
+ fun subscribe(handler: TextSelectionHandler): Any
+
+ fun unsubscribe(key: Any)
+}
+
+internal class SelectionManager : SelectionRegistrar {
+ /**
+ * The current selection.
+ */
+ var selection: Selection? = null
+
+ /**
+ * The manager will invoke this every time it comes to the conclusion that the selection should
+ * change. The expectation is that this callback will end up causing `setSelection` to get
+ * called. This is what makes this a "controlled component".
+ */
+ var onSelectionChange: (Selection?) -> Unit = {}
+
+ /**
+ * Layout Coordinates of the selection container.
+ */
+ lateinit var containerLayoutCoordinates: LayoutCoordinates
+
+ /**
+ * This is essentially the list of registered components that want
+ * to handle text selection that are below the SelectionContainer.
+ */
+ private val handlers = mutableSetOf<TextSelectionHandler>()
+
+ /**
+ * The beginning position of the drag gesture. Every time a new drag gesture starts, it wil be
+ * recalculated.
+ */
+ private var dragBeginPosition = PxPosition.Origin
+
+ /**
+ * The total distance being dragged of the drag gesture. Every time a new drag gesture starts,
+ * it will be zeroed out.
+ */
+ private var dragTotalDistance = PxPosition.Origin
+
+ /**
+ * Allow a Text composable to "register" itself with the manager
+ */
+ override fun subscribe(handler: TextSelectionHandler): Any {
+ handlers.add(handler)
+ return handler
+ }
+
+ /**
+ * Allow a Text composable to "unregister" itself with the manager
+ */
+ override fun unsubscribe(key: Any) {
+ handlers.remove(key as TextSelectionHandler)
+ }
+
+ fun onPress(position: PxPosition) {
+ var result: Selection? = null
+ for (handler in handlers) {
+ result = handler.getSelection(Pair(position, position), containerLayoutCoordinates)
+ }
+ onSelectionChange(result)
+ }
+
+ // Get the coordinates of a character. Currently, it's the middle point of the left edge of the
+ // bounding box of the character. This is a temporary solution.
+ // TODO(qqd): Read how Android solve this problem.
+ fun getCoordinatesForCharacter(box: Rect): PxPosition {
+ return PxPosition(box.left.px, box.top.px + (box.bottom.px - box.top.px) / 2)
+ }
+
+ fun handleDragObserver(dragStartHandle: Boolean): DragObserver {
+ return object : DragObserver {
+ override fun onStart() {
+ // The LayoutCoordinates of the widget where the drag gesture should begin. This
+ // is used to convert the position of the beginning of the drag gesture from the
+ // widget coordinates to selection container coordinates.
+ val beginLayoutCoordinates =
+ if (dragStartHandle) {
+ selection!!.startLayoutCoordinates!!
+ } else {
+ selection!!.endLayoutCoordinates!!
+ }
+ // The position of the character where the drag gesture should begin. This is in
+ // the widget coordinates.
+ val beginCoordinates =
+ getCoordinatesForCharacter(
+ if (dragStartHandle) {
+ selection!!.startOffset
+ } else {
+ selection!!.endOffset
+ }
+ )
+ // Convert the position where drag gesture begins from widget coordinates to
+ // selection container coordinates.
+ dragBeginPosition = containerLayoutCoordinates.childToLocal(
+ beginLayoutCoordinates,
+ beginCoordinates
+ )
+
+ // Zero out the total distance that being dragged.
+ dragTotalDistance = PxPosition.Origin
+ }
+
+ override fun onDrag(dragDistance: PxPosition): PxPosition {
+ var result = selection
+ dragTotalDistance += dragDistance
+
+ val currentStart =
+ if (dragStartHandle) {
+ dragBeginPosition + dragTotalDistance
+ } else {
+ containerLayoutCoordinates.childToLocal(
+ selection!!.startLayoutCoordinates!!,
+ getCoordinatesForCharacter(selection!!.startOffset)
+ )
+ }
+
+ val currentEnd =
+ if (dragStartHandle) {
+ containerLayoutCoordinates.childToLocal(
+ selection!!.endLayoutCoordinates!!,
+ getCoordinatesForCharacter(selection!!.endOffset)
+ )
+ } else {
+ dragBeginPosition + dragTotalDistance
+ }
+
+ for (handler in handlers) {
+ result = handler.getSelection(
+ Pair(currentStart, currentEnd),
+ containerLayoutCoordinates)
+ }
+ onSelectionChange(result)
+ return dragDistance
+ }
+ }
+ }
+}
+
+/** Ambient of SelectionRegistrar for SelectionManager. */
+internal val SelectionRegistrarAmbient = Ambient.of<SelectionRegistrar> { SelectionManager() }
diff --git a/ui/text/api/1.0.0-alpha01.txt b/ui/text/api/1.0.0-alpha01.txt
index b039567..e403687 100644
--- a/ui/text/api/1.0.0-alpha01.txt
+++ b/ui/text/api/1.0.0-alpha01.txt
@@ -65,7 +65,6 @@
public final class Paragraph {
method public float getBaseline();
- method public kotlin.Pair<androidx.ui.engine.geometry.Offset,androidx.ui.engine.geometry.Offset> getCaretForTextPosition(androidx.ui.engine.text.TextPosition textPosition);
method public boolean getDidExceedMaxLines();
method public float getHeight();
method public float getLineHeight(int lineIndex);
@@ -384,7 +383,6 @@
ctor public TextPainter(androidx.ui.painting.TextSpan? text, androidx.ui.engine.text.TextAlign textAlign, androidx.ui.engine.text.TextDirection? textDirection, float textScaleFactor, Integer? maxLines, boolean softWrap, androidx.ui.rendering.paragraph.TextOverflow overflow, androidx.ui.engine.window.Locale? locale, androidx.ui.graphics.Color selectionColor);
ctor public TextPainter();
method public androidx.ui.engine.text.ParagraphStyle createParagraphStyle(androidx.ui.engine.text.TextDirection? defaultTextDirection = null);
- method public kotlin.Pair<androidx.ui.engine.geometry.Offset,androidx.ui.engine.geometry.Offset> getCaretForTextPosition(androidx.ui.engine.text.TextPosition position);
method public boolean getDidExceedMaxLines();
method public float getHeight();
method public androidx.ui.engine.window.Locale? getLocale();
diff --git a/ui/text/api/current.txt b/ui/text/api/current.txt
index b039567..e403687 100644
--- a/ui/text/api/current.txt
+++ b/ui/text/api/current.txt
@@ -65,7 +65,6 @@
public final class Paragraph {
method public float getBaseline();
- method public kotlin.Pair<androidx.ui.engine.geometry.Offset,androidx.ui.engine.geometry.Offset> getCaretForTextPosition(androidx.ui.engine.text.TextPosition textPosition);
method public boolean getDidExceedMaxLines();
method public float getHeight();
method public float getLineHeight(int lineIndex);
@@ -384,7 +383,6 @@
ctor public TextPainter(androidx.ui.painting.TextSpan? text, androidx.ui.engine.text.TextAlign textAlign, androidx.ui.engine.text.TextDirection? textDirection, float textScaleFactor, Integer? maxLines, boolean softWrap, androidx.ui.rendering.paragraph.TextOverflow overflow, androidx.ui.engine.window.Locale? locale, androidx.ui.graphics.Color selectionColor);
ctor public TextPainter();
method public androidx.ui.engine.text.ParagraphStyle createParagraphStyle(androidx.ui.engine.text.TextDirection? defaultTextDirection = null);
- method public kotlin.Pair<androidx.ui.engine.geometry.Offset,androidx.ui.engine.geometry.Offset> getCaretForTextPosition(androidx.ui.engine.text.TextPosition position);
method public boolean getDidExceedMaxLines();
method public float getHeight();
method public androidx.ui.engine.window.Locale? getLocale();
diff --git a/ui/text/api/restricted_1.0.0-alpha01.txt b/ui/text/api/restricted_1.0.0-alpha01.txt
index da4f6cc..1023f5c8 100644
--- a/ui/text/api/restricted_1.0.0-alpha01.txt
+++ b/ui/text/api/restricted_1.0.0-alpha01.txt
@@ -1 +1,8 @@
// Signature format: 3.0
+package androidx.ui.painting {
+
+ public final class TextPainter {
+ }
+
+}
+
diff --git a/ui/text/api/restricted_current.txt b/ui/text/api/restricted_current.txt
index da4f6cc..1023f5c8 100644
--- a/ui/text/api/restricted_current.txt
+++ b/ui/text/api/restricted_current.txt
@@ -1 +1,8 @@
// Signature format: 3.0
+package androidx.ui.painting {
+
+ public final class TextPainter {
+ }
+
+}
+
diff --git a/ui/text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/CraneText.kt b/ui/text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/CraneText.kt
index dc00b90..99f8585 100644
--- a/ui/text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/CraneText.kt
+++ b/ui/text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/CraneText.kt
@@ -19,11 +19,11 @@
import androidx.ui.core.CraneWrapper
import androidx.ui.core.EditableText
import androidx.ui.core.EditorStyle
-import androidx.ui.core.Selection
-import androidx.ui.core.SelectionContainer
import androidx.ui.core.Span
import androidx.ui.core.Text
import androidx.ui.core.px
+import androidx.ui.core.selection.Selection
+import androidx.ui.core.selection.SelectionContainer
import androidx.ui.engine.geometry.Offset
import androidx.ui.engine.text.BaselineShift
import androidx.ui.engine.text.FontStyle
diff --git a/ui/text/src/androidTest/java/androidx/ui/engine/text/ParagraphIntegrationTest.kt b/ui/text/src/androidTest/java/androidx/ui/engine/text/ParagraphIntegrationTest.kt
index d8a13ca..683a2c2 100644
--- a/ui/text/src/androidTest/java/androidx/ui/engine/text/ParagraphIntegrationTest.kt
+++ b/ui/text/src/androidTest/java/androidx/ui/engine/text/ParagraphIntegrationTest.kt
@@ -292,115 +292,6 @@
}
@Test
- fun getCaretForTextPosition_ltr_singleLine() {
- val text = "abc"
- val fontSize = 50.0f
- val paragraph = simpleParagraph(text = text, fontSize = fontSize)
-
- paragraph.layout(ParagraphConstraints(width = text.length * fontSize))
- // test positions that are 0, 1, 2 ... which maps to chars 0, 1, 2 ...
- for (i in 0..text.length) {
- val textPosition = TextPosition(i, TextAffinity.upstream)
- val caret = paragraph.getCaretForTextPosition(textPosition)
- assertThat(caret.first.dx, equalTo(i * fontSize))
- assertThat(caret.first.dy, equalTo(0f))
- assertThat(caret.second.dx, equalTo(i * fontSize))
- assertThat(caret.second.dy, equalTo(fontSize))
- }
- }
-
- @Test
- fun getCaretForTextPosition_rtl_singleLine() {
- val text = "\u05D0\u05D1\u05D2"
- val fontSize = 50.0f
- val paragraph = simpleParagraph(text = text, fontSize = fontSize)
-
- paragraph.layout(ParagraphConstraints(width = text.length * fontSize))
-
- // test positions that are 0, 1, 2 which maps to chars .., 2, 1, 0
- for (i in 0..text.length) {
- val textPosition = TextPosition(i, TextAffinity.upstream)
- val caret = paragraph.getCaretForTextPosition(textPosition)
- assertThat(caret.first.dx, equalTo((text.length - i) * fontSize))
- assertThat(caret.first.dy, equalTo(0f))
- assertThat(caret.second.dx, equalTo((text.length - i) * fontSize))
- assertThat(caret.second.dy, equalTo(fontSize))
- }
- }
-
- @Test
- fun getCaretForTextPosition_ltr_multiLines() {
- val firstLine = "abc"
- val secondLine = "def"
- val text = firstLine + secondLine
- val fontSize = 50.0f
- val paragraph = simpleParagraph(text = text, fontSize = fontSize)
-
- paragraph.layout(ParagraphConstraints(width = firstLine.length * fontSize))
-
- // test positions are 3, 4, 5 and always on the second line
- // which maps to chars 3, 4, 5
- for (i in 0..secondLine.length) {
- val textPosition = TextPosition(i + firstLine.length, TextAffinity.upstream)
- val caret = paragraph.getCaretForTextPosition(textPosition)
- assertThat(caret.first.dx, equalTo(i * fontSize))
- assertThat(caret.first.dy, equalTo(fontSize))
- assertThat(caret.second.dx, equalTo(i * fontSize))
- assertThat(caret.second.dy, equalTo((2f + 1 / 5f) * fontSize))
- }
- }
-
- @Test
- fun getCaretForTextPosition_rtl_multiLines() {
- val firstLine = "\u05D0\u05D1\u05D2"
- val secondLine = "\u05D3\u05D4\u05D5"
- val text = firstLine + secondLine
- val fontSize = 50.0f
- val paragraph = simpleParagraph(text = text, fontSize = fontSize)
-
- paragraph.layout(ParagraphConstraints(width = firstLine.length * fontSize))
-
- // test positions are 3, 4, 5 and always on the second line
- // which maps to chars 5, 4, 3
- for (i in 0..secondLine.length) {
- val textPosition = TextPosition(i + firstLine.length, TextAffinity.upstream)
- val caret = paragraph.getCaretForTextPosition(textPosition)
- assertThat(caret.first.dx, equalTo((secondLine.length - i) * fontSize))
- assertThat(caret.first.dy, equalTo(fontSize))
- assertThat(caret.second.dx, equalTo((secondLine.length - i) * fontSize))
- assertThat(caret.second.dy, equalTo((2f + 1 / 5f) * fontSize))
- }
- }
-
- @Test
- fun getCaretForTextPosition_ltr_textPosition_negative_return_zero() {
- val text = "abc"
- val fontSize = 50.0f
- val paragraph = simpleParagraph(text = text, fontSize = fontSize)
-
- paragraph.layout(ParagraphConstraints(width = text.length * fontSize))
-
- val textPosition = TextPosition(-1, TextAffinity.upstream)
- val caret = paragraph.getCaretForTextPosition(textPosition)
- assertThat(caret.first.dx, equalTo(0f))
- assertThat(caret.first.dy, equalTo(0f))
- assertThat(caret.second.dx, equalTo(0f))
- assertThat(caret.second.dy, equalTo(fontSize))
- }
-
- @Test(expected = java.lang.IndexOutOfBoundsException::class)
- fun getCaretForTextPosition_ltr_textPosition_larger_than_length_throw_exception() {
- val text = "abc"
- val fontSize = 50.0f
- val paragraph = simpleParagraph(text = text, fontSize = fontSize)
-
- paragraph.layout(ParagraphConstraints(width = text.length * fontSize))
-
- val textPosition = TextPosition(text.length + 1, TextAffinity.upstream)
- paragraph.getCaretForTextPosition(textPosition)
- }
-
- @Test
fun getBoundingBoxForTextPosition_ltr_singleLine() {
val text = "abc"
val fontSize = 50.0f
diff --git a/ui/text/src/main/java/androidx/ui/engine/text/Paragraph.kt b/ui/text/src/main/java/androidx/ui/engine/text/Paragraph.kt
index 446dd9f..13fde31 100644
--- a/ui/text/src/main/java/androidx/ui/engine/text/Paragraph.kt
+++ b/ui/text/src/main/java/androidx/ui/engine/text/Paragraph.kt
@@ -160,15 +160,6 @@
}
/**
- * Returns the coordinates of top and bottom end of the Caret for given TextPosition. The Caret
- * is on the left side of the character at the given TextPosition for LTR text, and on the right
- * side of the character at the given TextPosition for RTL text.
- */
- fun getCaretForTextPosition(textPosition: TextPosition): Pair<Offset, Offset> {
- return paragraphImpl.getCaretForTextPosition(textPosition)
- }
-
- /**
* Returns the bounding box as Rect of the character for given TextPosition. Rect includes the
* top, bottom, left and right of a character.
*/
diff --git a/ui/text/src/main/java/androidx/ui/engine/text/platform/ParagraphAndroid.kt b/ui/text/src/main/java/androidx/ui/engine/text/platform/ParagraphAndroid.kt
index d813263..125588b 100644
--- a/ui/text/src/main/java/androidx/ui/engine/text/platform/ParagraphAndroid.kt
+++ b/ui/text/src/main/java/androidx/ui/engine/text/platform/ParagraphAndroid.kt
@@ -214,16 +214,6 @@
)
}
- fun getCaretForTextPosition(textPosition: TextPosition): Pair<Offset, Offset> {
- val horizontal = ensureLayout.getPrimaryHorizontal(textPosition.offset)
-
- val line = ensureLayout.getLineForOffset(textPosition.offset)
- val top = ensureLayout.getLineTop(line)
- val bottom = ensureLayout.getLineBottom(line)
-
- return Pair(Offset(horizontal, top), Offset(horizontal, bottom))
- }
-
/**
* Returns the bounding box as Rect of the character for given TextPosition. Rect includes the
* top, bottom, left and right of a character.
diff --git a/ui/text/src/main/java/androidx/ui/painting/TextPainter.kt b/ui/text/src/main/java/androidx/ui/painting/TextPainter.kt
index b7036f5..ad35fd6 100644
--- a/ui/text/src/main/java/androidx/ui/painting/TextPainter.kt
+++ b/ui/text/src/main/java/androidx/ui/painting/TextPainter.kt
@@ -16,6 +16,7 @@
package androidx.ui.painting
+import androidx.annotation.RestrictTo
import androidx.annotation.VisibleForTesting
import androidx.ui.core.Constraints
import androidx.ui.core.IntPxSize
@@ -503,22 +504,15 @@
}
/**
- * Returns the Caret as a vertical bar for given text position, at which to paint the caret.
- *
- * Valid only after [layout] has been called.
- */
- fun getCaretForTextPosition(position: TextPosition): Pair<Offset, Offset> {
- assert(!needsLayout)
- return paragraph!!.getCaretForTextPosition(position)
- }
-
- /**
* Returns the bounding box as Rect of the character for given TextPosition. Rect includes the
* top, bottom, left and right of a character.
*
* Valid only after [layout] has been called.
+ *
+ * @hide
*/
- internal fun getBoundingBoxForTextPosition(textPosition: TextPosition): Rect {
+ @RestrictTo(RestrictTo.Scope.LIBRARY)
+ fun getBoundingBoxForTextPosition(textPosition: TextPosition): Rect {
assert(!needsLayout)
return paragraph!!.getBoundingBoxForTextPosition(textPosition)
}