diff options
32 files changed, 15 insertions, 820 deletions
@@ -75,9 +75,6 @@ android_library { "androidx.lifecycle_lifecycle-extensions", "androidx.lifecycle_lifecycle-runtime-ktx", "androidx.lifecycle_lifecycle-viewmodel-ktx", - "androidx.savedstate_savedstate-ktx", - "dagger2", - "jsr330", "kotlin-stdlib", "kotlinx_coroutines", "kotlinx-coroutines-android", @@ -86,8 +83,6 @@ android_library { "SystemUIFlagsLib", ], - plugins: ["dagger2-compiler"], - lint: { strict_updatability_linting: false, }, diff --git a/AndroidManifest-app.xml b/AndroidManifest-app.xml index ba9afe28..57ea497b 100644 --- a/AndroidManifest-app.xml +++ b/AndroidManifest-app.xml @@ -17,22 +17,18 @@ */ --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - package="com.android.intentresolver" - android:versionCode="0" - android:versionName="2021-11" - coreApp="true"> + package="com.android.intentresolver" + android:versionCode="0" + android:versionName="2021-11" + coreApp="true"> <application - android:name=".IntentResolverApplication" android:hardwareAccelerated="true" android:label="@string/app_label" android:directBootAware="true" android:forceQueryable="true" android:requiredForAllUsers="true" - android:supportsRtl="true" - tools:replace="android:appComponentFactory" - android:appComponentFactory=".dagger.InjectedAppComponentFactory"> + android:supportsRtl="true"> <!-- This alias needs to be maintained until there are no more devices that could be upgrading from T QPR3. (b/283722356) --> diff --git a/java/src/com/android/intentresolver/ApplicationComponentOwner.kt b/java/src/com/android/intentresolver/ApplicationComponentOwner.kt deleted file mode 100644 index fb39814c..00000000 --- a/java/src/com/android/intentresolver/ApplicationComponentOwner.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.android.intentresolver - -import com.android.intentresolver.dagger.ApplicationComponent - -/** - * Interface that should be implemented by the [Application][android.app.Application] object as the - * owner of the [ApplicationComponent]. - */ -interface ApplicationComponentOwner { - /** - * Invokes the given [action] when the [ApplicationComponent] has been created. If it has - * already been created, then it invokes [action] immediately. - */ - fun doWhenApplicationComponentReady(action: (ApplicationComponent) -> Unit) -} diff --git a/java/src/com/android/intentresolver/ChooserActivity.java b/java/src/com/android/intentresolver/ChooserActivity.java index 8edbba08..d302233f 100644 --- a/java/src/com/android/intentresolver/ChooserActivity.java +++ b/java/src/com/android/intentresolver/ChooserActivity.java @@ -72,7 +72,6 @@ import android.view.animation.LinearInterpolator; import android.widget.TextView; import androidx.annotation.MainThread; -import androidx.lifecycle.HasDefaultViewModelProviderFactory; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -88,8 +87,6 @@ import com.android.intentresolver.contentpreview.BasePreviewViewModel; import com.android.intentresolver.contentpreview.ChooserContentPreviewUi; import com.android.intentresolver.contentpreview.HeadlineGeneratorImpl; import com.android.intentresolver.contentpreview.PreviewViewModel; -import com.android.intentresolver.dagger.InjectedViewModelFactory; -import com.android.intentresolver.dagger.ViewModelComponent; import com.android.intentresolver.flags.FeatureFlagRepository; import com.android.intentresolver.flags.FeatureFlagRepositoryFactory; import com.android.intentresolver.grid.ChooserGridAdapter; @@ -102,14 +99,11 @@ import com.android.intentresolver.model.AppPredictionServiceResolverComparator; import com.android.intentresolver.model.ResolverRankerServiceResolverComparator; import com.android.intentresolver.shortcuts.AppPredictorFactory; import com.android.intentresolver.shortcuts.ShortcutLoader; -import com.android.intentresolver.ui.ChooserViewModel; import com.android.intentresolver.widget.ImagePreviewView; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.content.PackageMonitor; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; -import org.jetbrains.annotations.NotNull; - import java.io.File; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -125,15 +119,13 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.function.Consumer; -import javax.inject.Inject; - /** * The Chooser Activity handles intent resolution specifically for sharing intents - * for example, as generated by {@see android.content.Intent#createChooser(Intent, CharSequence)}. * */ public class ChooserActivity extends ResolverActivity implements - ResolverListAdapter.ResolverListCommunicator, HasDefaultViewModelProviderFactory { + ResolverListAdapter.ResolverListCommunicator { private static final String TAG = "ChooserActivity"; /** @@ -173,11 +165,6 @@ public class ChooserActivity extends ResolverActivity implements private static final int SCROLL_STATUS_SCROLLING_VERTICAL = 1; private static final int SCROLL_STATUS_SCROLLING_HORIZONTAL = 2; - private ViewModelProvider.Factory mViewModelFactory; - private final ViewModelComponent.Builder mViewModelComponentBuilder; - - private ChooserViewModel mViewModel; - @IntDef(flag = false, prefix = { "TARGET_TYPE_" }, value = { TARGET_TYPE_DEFAULT, TARGET_TYPE_CHOOSER_TARGET, @@ -239,33 +226,16 @@ public class ChooserActivity extends ResolverActivity implements private boolean mExcludeSharedText = false; - @Inject - public ChooserActivity(ViewModelComponent.Builder builder) { - mViewModelComponentBuilder = builder; - } - - @NotNull - @Override - public final ViewModelProvider.Factory getDefaultViewModelProviderFactory() { - if (mViewModelFactory == null) { - mViewModelFactory = new InjectedViewModelFactory(mViewModelComponentBuilder, - getDefaultViewModelCreationExtras(), - getReferrer()); - } - return mViewModelFactory; - } + public ChooserActivity() {} @Override protected void onCreate(Bundle savedInstanceState) { - Log.d(TAG, "onCreate"); Tracer.INSTANCE.markLaunched(); final long intentReceivedTime = System.currentTimeMillis(); mLatencyTracker.onActionStart(ACTION_LOAD_SHARE_SHEET); getEventLog().logSharesheetTriggered(); - mViewModel = new ViewModelProvider(this).get(ChooserViewModel.class); - mFeatureFlagRepository = createFeatureFlagRepository(); mIntegratedDeviceComponents = getIntegratedDeviceComponents(); @@ -282,9 +252,7 @@ public class ChooserActivity extends ResolverActivity implements return; } - // Note: Uses parent ViewModelProvider.Factory because RefinementManager is not injectable - mRefinementManager = new ViewModelProvider(this, super.getDefaultViewModelProviderFactory()) - .get(ChooserRefinementManager.class); + mRefinementManager = new ViewModelProvider(this).get(ChooserRefinementManager.class); mRefinementManager.getRefinementCompletion().observe(this, completion -> { if (completion.consume()) { @@ -306,7 +274,7 @@ public class ChooserActivity extends ResolverActivity implements BasePreviewViewModel previewViewModel = new ViewModelProvider(this, createPreviewViewModelFactory()) - .get(PreviewViewModel.class); + .get(BasePreviewViewModel.class); mChooserContentPreviewUi = new ChooserContentPreviewUi( getLifecycle(), previewViewModel.createOrReuseProvider(mChooserRequest), diff --git a/java/src/com/android/intentresolver/IntentForwarderActivity.java b/java/src/com/android/intentresolver/IntentForwarderActivity.java index d69a6c71..5e8945f1 100644 --- a/java/src/com/android/intentresolver/IntentForwarderActivity.java +++ b/java/src/com/android/intentresolver/IntentForwarderActivity.java @@ -57,8 +57,6 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import javax.inject.Inject; - /** * This is used in conjunction with * {@link DevicePolicyManager#addCrossProfileIntentFilter} to enable intents to @@ -86,11 +84,6 @@ public class IntentForwarderActivity extends Activity { private MetricsLogger mMetricsLogger; protected ExecutorService mExecutorService; - @Inject - public IntentForwarderActivity() { - super(); - } - @Override protected void onDestroy() { super.onDestroy(); diff --git a/java/src/com/android/intentresolver/IntentResolverApplication.kt b/java/src/com/android/intentresolver/IntentResolverApplication.kt deleted file mode 100644 index 61df7fff..00000000 --- a/java/src/com/android/intentresolver/IntentResolverApplication.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.android.intentresolver - -import android.app.Application -import com.android.intentresolver.dagger.ApplicationComponent -import com.android.intentresolver.dagger.DaggerApplicationComponent - -/** [Application] that maintains the [ApplicationComponent]. */ -open class IntentResolverApplication : Application(), ApplicationComponentOwner { - - private lateinit var applicationComponent: ApplicationComponent - - private val pendingDaggerActions = mutableSetOf<(ApplicationComponent) -> Unit>() - - open fun createApplicationComponentBuilder() = DaggerApplicationComponent.builder() - - override fun onCreate() { - super.onCreate() - applicationComponent = createApplicationComponentBuilder().application(this).build() - pendingDaggerActions.forEach { it.invoke(applicationComponent) } - pendingDaggerActions.clear() - } - - override fun doWhenApplicationComponentReady(action: (ApplicationComponent) -> Unit) { - if (this::applicationComponent.isInitialized) { - action.invoke(applicationComponent) - } else { - pendingDaggerActions.add(action) - } - } -} diff --git a/java/src/com/android/intentresolver/ResolverActivity.java b/java/src/com/android/intentresolver/ResolverActivity.java index 252d0a41..35c7e897 100644 --- a/java/src/com/android/intentresolver/ResolverActivity.java +++ b/java/src/com/android/intentresolver/ResolverActivity.java @@ -127,8 +127,6 @@ import java.util.Objects; import java.util.Set; import java.util.function.Supplier; -import javax.inject.Inject; - /** * This is a copy of ResolverActivity to support IntentResolver's ChooserActivity. This code is * *not* the resolver that is actually triggered by the system right now (you want @@ -139,7 +137,6 @@ import javax.inject.Inject; public class ResolverActivity extends FragmentActivity implements ResolverListAdapter.ResolverListCommunicator { - @Inject public ResolverActivity() { mIsIntentPicker = getClass().equals(ResolverActivity.class); } diff --git a/java/src/com/android/intentresolver/dagger/ActivityBinderModule.kt b/java/src/com/android/intentresolver/dagger/ActivityBinderModule.kt deleted file mode 100644 index 7c997ef7..00000000 --- a/java/src/com/android/intentresolver/dagger/ActivityBinderModule.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.android.intentresolver.dagger - -import android.app.Activity -import com.android.intentresolver.ChooserActivity -import com.android.intentresolver.IntentForwarderActivity -import com.android.intentresolver.ResolverActivity -import dagger.Binds -import dagger.Module -import dagger.multibindings.ClassKey -import dagger.multibindings.IntoMap - -/** Injection instructions for injectable [Activities][Activity]. */ -@Module -interface ActivityBinderModule { - - @Binds - @IntoMap - @ClassKey(ChooserActivity::class) - @ActivityScope - fun bindChooserActivity(activity: ChooserActivity): Activity - - @Binds - @IntoMap - @ClassKey(ResolverActivity::class) - @ActivityScope - fun bindResolverActivity(activity: ResolverActivity): Activity - - @Binds - @IntoMap - @ClassKey(IntentForwarderActivity::class) - @ActivityScope - fun bindIntentForwarderActivity(activity: IntentForwarderActivity): Activity -} diff --git a/java/src/com/android/intentresolver/dagger/ActivityComponent.kt b/java/src/com/android/intentresolver/dagger/ActivityComponent.kt deleted file mode 100644 index bf5ff761..00000000 --- a/java/src/com/android/intentresolver/dagger/ActivityComponent.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.android.intentresolver.dagger - -import android.app.Activity -import dagger.Subcomponent -import javax.inject.Provider -import javax.inject.Scope - -@MustBeDocumented @Retention(AnnotationRetention.RUNTIME) @Scope annotation class ActivityScope - -/** Subcomponent for injections across the life of an Activity. */ -@ActivityScope -@Subcomponent(modules = [ActivityModule::class, ActivityBinderModule::class]) -interface ActivityComponent { - - @Subcomponent.Factory - interface Factory { - fun create(): ActivityComponent - } - - fun activities(): Map<Class<*>, @JvmSuppressWildcards Provider<Activity>> -} diff --git a/java/src/com/android/intentresolver/dagger/ActivityModule.kt b/java/src/com/android/intentresolver/dagger/ActivityModule.kt deleted file mode 100644 index f6a2229d..00000000 --- a/java/src/com/android/intentresolver/dagger/ActivityModule.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.android.intentresolver.dagger - -import dagger.Module - -/** Bindings provided to [@ActivityScope][ActivityScope]. */ -@Module interface ActivityModule diff --git a/java/src/com/android/intentresolver/dagger/ApplicationComponent.kt b/java/src/com/android/intentresolver/dagger/ApplicationComponent.kt deleted file mode 100644 index 9fc57712..00000000 --- a/java/src/com/android/intentresolver/dagger/ApplicationComponent.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.android.intentresolver.dagger - -import android.app.Application -import dagger.BindsInstance -import dagger.Component -import javax.inject.Singleton - -/** Top level component for injections across the life of the process. */ -@Singleton -@Component(modules = [ApplicationModule::class]) -interface ApplicationComponent { - - @Component.Builder - interface Builder { - @BindsInstance fun application(application: Application): Builder - - fun build(): ApplicationComponent - } - - fun inject(appComponentFactory: InjectedAppComponentFactory) -} diff --git a/java/src/com/android/intentresolver/dagger/ApplicationModule.kt b/java/src/com/android/intentresolver/dagger/ApplicationModule.kt deleted file mode 100644 index 4986d7e1..00000000 --- a/java/src/com/android/intentresolver/dagger/ApplicationModule.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.android.intentresolver.dagger - -import android.app.Application -import android.content.Context -import com.android.intentresolver.dagger.qualifiers.App -import dagger.Module -import dagger.Provides -import javax.inject.Singleton - -/** - * Bindings provided to [ApplicationComponent] and children. - * - * These are all @Singleton scope, one for the duration of the process. - */ -@Module( - subcomponents = [ActivityComponent::class, ViewModelComponent::class], - includes = [ReceiverBinderModule::class, CoroutinesModule::class], -) -interface ApplicationModule { - - companion object { - - @JvmStatic - @Provides - @Singleton - @App - fun applicationContext(app: Application): Context = app.applicationContext - } -} diff --git a/java/src/com/android/intentresolver/dagger/CoroutinesModule.kt b/java/src/com/android/intentresolver/dagger/CoroutinesModule.kt deleted file mode 100644 index 5fda2c30..00000000 --- a/java/src/com/android/intentresolver/dagger/CoroutinesModule.kt +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2023 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 com.android.intentresolver.dagger - -import com.android.intentresolver.dagger.qualifiers.Background -import com.android.intentresolver.dagger.qualifiers.Main -import dagger.Module -import dagger.Provides -import javax.inject.Singleton -import kotlinx.coroutines.CoroutineDispatcher -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.SupervisorJob - -@Module -interface CoroutinesModule { - companion object { - @JvmStatic - @Provides - @Singleton - @Main - fun mainDispatcher(): CoroutineDispatcher = Dispatchers.Main.immediate - - @JvmStatic - @Provides - @Singleton - @Main - fun mainCoroutineScope(@Main mainDispatcher: CoroutineDispatcher) = - CoroutineScope(SupervisorJob() + mainDispatcher) - - @JvmStatic - @Provides - @Singleton - @Background - fun backgroundDispatcher(): CoroutineDispatcher = Dispatchers.IO - } -} diff --git a/java/src/com/android/intentresolver/dagger/InjectedAppComponentFactory.kt b/java/src/com/android/intentresolver/dagger/InjectedAppComponentFactory.kt deleted file mode 100644 index db209ef0..00000000 --- a/java/src/com/android/intentresolver/dagger/InjectedAppComponentFactory.kt +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (C) 2023 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 com.android.intentresolver.dagger - -import android.app.Activity -import android.app.Application -import android.content.BroadcastReceiver -import android.content.Intent -import android.util.Log -import androidx.core.app.AppComponentFactory -import com.android.intentresolver.ApplicationComponentOwner -import javax.inject.Inject -import javax.inject.Provider - -/** Provides instances of application components, delegates construction to Dagger. */ -class InjectedAppComponentFactory : AppComponentFactory() { - - @set:Inject lateinit var activityComponentBuilder: ActivityComponent.Factory - - @set:Inject - lateinit var receivers: Map<Class<*>, @JvmSuppressWildcards Provider<BroadcastReceiver>> - - override fun instantiateApplicationCompat(cl: ClassLoader, className: String): Application { - val app = super.instantiateApplicationCompat(cl, className) - if (app !is ApplicationComponentOwner) { - throw RuntimeException("App must be ApplicationComponentOwner") - } - app.doWhenApplicationComponentReady { it.inject(this) } - return app - } - - override fun instantiateActivityCompat( - cl: ClassLoader, - className: String, - intent: Intent?, - ): Activity { - return runCatching { - val activities = activityComponentBuilder.create().activities() - instantiate(className, activities) - } - .onFailure { - if (it is UninitializedPropertyAccessException) { - // This should never happen but if it did it would cause errors that could - // be very difficult to identify, so we log it out of an abundance of - // caution. - Log.e(TAG, "Tried to instantiate $className before AppComponent", it) - } - } - .getOrNull() - ?: super.instantiateActivityCompat(cl, className, intent) - } - - override fun instantiateReceiverCompat( - cl: ClassLoader, - className: String, - intent: Intent?, - ): BroadcastReceiver { - return instantiate(className, receivers) - ?: super.instantiateReceiverCompat(cl, className, intent) - } - - private fun <T> instantiate(className: String, providers: Map<Class<*>, Provider<T>>): T? { - return runCatching { providers[Class.forName(className)]?.get() } - .onFailure { - if (it is UninitializedPropertyAccessException) { - // This should never happen but if it did it would cause errors that could - // be very difficult to identify, so we log it out of an abundance of - // caution. - Log.e(TAG, "Tried to instantiate $className before AppComponent", it) - } - } - .getOrNull() - } - - companion object { - private const val TAG = "AppComponentFactory" - } -} diff --git a/java/src/com/android/intentresolver/dagger/InjectedViewModelFactory.kt b/java/src/com/android/intentresolver/dagger/InjectedViewModelFactory.kt deleted file mode 100644 index f0906d3e..00000000 --- a/java/src/com/android/intentresolver/dagger/InjectedViewModelFactory.kt +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (C) 2023 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 com.android.intentresolver.dagger - -import android.net.Uri -import android.os.Bundle -import androidx.lifecycle.DEFAULT_ARGS_KEY -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import androidx.lifecycle.viewmodel.CreationExtras -import java.io.Closeable -import javax.inject.Provider -import kotlin.coroutines.CoroutineContext -import kotlinx.coroutines.CoroutineName -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.SupervisorJob -import kotlinx.coroutines.cancel -import kotlinx.coroutines.isActive - -/** Instantiates new ViewModel instances using Dagger. */ -class InjectedViewModelFactory( - private val viewModelComponentBuilder: ViewModelComponent.Builder, - creationExtras: CreationExtras, - private val referrer: Uri, -) : ViewModelProvider.Factory { - - private val defaultArgs = creationExtras[DEFAULT_ARGS_KEY] ?: Bundle() - - private fun viewModelScope(viewModelClass: Class<*>) = - CloseableCoroutineScope( - SupervisorJob() + CoroutineName(viewModelClass.simpleName) + Dispatchers.Main.immediate - ) - - private fun <T> newViewModel( - providerMap: Map<Class<*>, Provider<ViewModel>>, - modelClass: Class<T> - ): T { - val provider = - providerMap[modelClass] - ?: error( - "Unable to create an instance of $modelClass. " + - "Does the class have a binding in ViewModelComponent?" - ) - return modelClass.cast(provider.get()) - } - - override fun <T : ViewModel> create(modelClass: Class<T>): T { - val viewModelScope = viewModelScope(modelClass) - val viewModelComponent = - viewModelComponentBuilder - .coroutineScope(viewModelScope) - .intentExtras(defaultArgs) - .referrer(referrer) - .build() - val viewModel = newViewModel(viewModelComponent.viewModels(), modelClass) - viewModel.addCloseable(viewModelScope) - return viewModel - } -} - -internal class CloseableCoroutineScope(context: CoroutineContext) : Closeable, CoroutineScope { - override val coroutineContext: CoroutineContext = context - - override fun close() { - if (isActive) { - coroutineContext.cancel() - } - } -} diff --git a/java/src/com/android/intentresolver/dagger/ReceiverBinderModule.kt b/java/src/com/android/intentresolver/dagger/ReceiverBinderModule.kt deleted file mode 100644 index 32ce2f45..00000000 --- a/java/src/com/android/intentresolver/dagger/ReceiverBinderModule.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.android.intentresolver.dagger - -import android.content.BroadcastReceiver -import dagger.Module -import dagger.multibindings.Multibinds - -/** Injection instructions for injectable [BroadcastReceivers][BroadcastReceiver] */ -@Module -interface ReceiverBinderModule { - - @Multibinds fun bindReceivers(): Map<Class<*>, @JvmSuppressWildcards BroadcastReceiver> -} diff --git a/java/src/com/android/intentresolver/dagger/ViewModelBinderModule.kt b/java/src/com/android/intentresolver/dagger/ViewModelBinderModule.kt deleted file mode 100644 index 91ba039c..00000000 --- a/java/src/com/android/intentresolver/dagger/ViewModelBinderModule.kt +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2023 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 com.android.intentresolver.dagger - -import androidx.lifecycle.ViewModel -import com.android.intentresolver.ui.ChooserViewModel -import dagger.Binds -import dagger.Module -import dagger.multibindings.ClassKey -import dagger.multibindings.IntoMap - -/** Defines a map of injectable ViewModel classes. */ -@Module -interface ViewModelBinderModule { - @Binds - @IntoMap - @ClassKey(ChooserViewModel::class) - @ViewModelScope - fun chooserViewModel(viewModel: ChooserViewModel): ViewModel -} diff --git a/java/src/com/android/intentresolver/dagger/ViewModelComponent.kt b/java/src/com/android/intentresolver/dagger/ViewModelComponent.kt deleted file mode 100644 index 3e2e2681..00000000 --- a/java/src/com/android/intentresolver/dagger/ViewModelComponent.kt +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2023 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 com.android.intentresolver.dagger - -import android.net.Uri -import android.os.Bundle -import com.android.intentresolver.dagger.qualifiers.Referrer -import com.android.intentresolver.dagger.qualifiers.ViewModel -import dagger.BindsInstance -import dagger.Subcomponent -import javax.inject.Provider -import javax.inject.Scope -import kotlin.annotation.AnnotationRetention.RUNTIME -import kotlinx.coroutines.CoroutineScope - -@Scope @Retention(RUNTIME) @MustBeDocumented annotation class ViewModelScope - -/** - * Provides dependencies within [ViewModelScope] within a [ViewModel]. - * - * @see InjectedViewModelFactory - */ -@ViewModelScope -@Subcomponent(modules = [ViewModelModule::class, ViewModelBinderModule::class]) -interface ViewModelComponent { - - /** - * Binds instance values from the creating Activity to make them available for injection within - * [ViewModelScope]. - */ - @Subcomponent.Builder - interface Builder { - @BindsInstance fun intentExtras(@ViewModel intentExtras: Bundle): Builder - - @BindsInstance fun referrer(@Referrer uri: Uri): Builder - - @BindsInstance fun coroutineScope(@ViewModel scope: CoroutineScope): Builder - - fun build(): ViewModelComponent - } - - fun viewModels(): Map<Class<*>, @JvmSuppressWildcards Provider<androidx.lifecycle.ViewModel>> -} diff --git a/java/src/com/android/intentresolver/dagger/ViewModelModule.kt b/java/src/com/android/intentresolver/dagger/ViewModelModule.kt deleted file mode 100644 index 23320311..00000000 --- a/java/src/com/android/intentresolver/dagger/ViewModelModule.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.android.intentresolver.dagger - -import dagger.Module - -/** Provides bindings shared among components within [@ViewModelScope][ViewModelScope]. */ -@Module abstract class ViewModelModule diff --git a/java/src/com/android/intentresolver/dagger/qualifiers/Qualifiers.kt b/java/src/com/android/intentresolver/dagger/qualifiers/Qualifiers.kt deleted file mode 100644 index fa50170e..00000000 --- a/java/src/com/android/intentresolver/dagger/qualifiers/Qualifiers.kt +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2023 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 com.android.intentresolver.dagger.qualifiers - -import javax.inject.Qualifier - -// Note: 'qualifiers' package avoids name collisions in Dagger code. - -@Qualifier @MustBeDocumented @Retention(AnnotationRetention.RUNTIME) annotation class App - -@Qualifier @MustBeDocumented @Retention(AnnotationRetention.RUNTIME) annotation class Activity - -@Qualifier @MustBeDocumented @Retention(AnnotationRetention.RUNTIME) annotation class ViewModel - -@Qualifier @MustBeDocumented @Retention(AnnotationRetention.RUNTIME) annotation class Main - -@Qualifier @MustBeDocumented @Retention(AnnotationRetention.RUNTIME) annotation class Background - -@Qualifier @MustBeDocumented @Retention(AnnotationRetention.RUNTIME) annotation class Delegate - -@Qualifier @MustBeDocumented @Retention(AnnotationRetention.RUNTIME) annotation class Default - -@Qualifier @MustBeDocumented @Retention(AnnotationRetention.RUNTIME) annotation class Referrer diff --git a/java/src/com/android/intentresolver/ui/ChooserViewModel.kt b/java/src/com/android/intentresolver/ui/ChooserViewModel.kt deleted file mode 100644 index 817f0b6c..00000000 --- a/java/src/com/android/intentresolver/ui/ChooserViewModel.kt +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2023 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 com.android.intentresolver.ui - -import android.util.Log -import androidx.lifecycle.ViewModel -import com.android.intentresolver.dagger.qualifiers.ViewModel as ViewModelQualifier -import javax.inject.Inject -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.awaitCancellation -import kotlinx.coroutines.launch - -const val TAG = "ChooserViewModel" - -/** The primary container for ViewModelScope dependencies. */ -class ChooserViewModel -@Inject -constructor( - @ViewModelQualifier val viewModelScope: CoroutineScope, -) : ViewModel()
\ No newline at end of file diff --git a/java/tests/Android.bp b/java/tests/Android.bp index 3936b38e..90c7fb7a 100644 --- a/java/tests/Android.bp +++ b/java/tests/Android.bp @@ -20,6 +20,7 @@ android_test { static_libs: [ "IntentResolver-core", "androidx.test.core", + "androidx.test.rules", "androidx.test.ext.junit", "androidx.test.ext.truth", "androidx.test.espresso.contrib", diff --git a/java/tests/AndroidManifest.xml b/java/tests/AndroidManifest.xml index 9f8dd41c..05830c4c 100644 --- a/java/tests/AndroidManifest.xml +++ b/java/tests/AndroidManifest.xml @@ -15,8 +15,7 @@ --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - package="com.android.intentresolver.tests"> + package="com.android.intentresolver.tests"> <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="30" /> @@ -26,10 +25,7 @@ <uses-permission android:name="android.permission.WRITE_DEVICE_CONFIG"/> <uses-permission android:name="android.permission.READ_DEVICE_CONFIG" /> - <application - android:name="com.android.intentresolver.TestApplication" - tools:replace="android:appComponentFactory" - android:appComponentFactory="com.android.intentresolver.dagger.InjectedAppComponentFactory"> + <application android:name="com.android.intentresolver.TestApplication"> <uses-library android:name="android.test.runner" /> <activity android:name="com.android.intentresolver.ChooserWrapperActivity" /> <activity android:name="com.android.intentresolver.ResolverWrapperActivity" /> diff --git a/java/tests/src/com/android/intentresolver/ChooserWrapperActivity.java b/java/tests/src/com/android/intentresolver/ChooserWrapperActivity.java index 49305a6c..8608cf72 100644 --- a/java/tests/src/com/android/intentresolver/ChooserWrapperActivity.java +++ b/java/tests/src/com/android/intentresolver/ChooserWrapperActivity.java @@ -37,7 +37,6 @@ import androidx.lifecycle.ViewModelProvider; import com.android.intentresolver.AbstractMultiProfilePagerAdapter.CrossProfileIntentsChecker; import com.android.intentresolver.chooser.DisplayResolveInfo; import com.android.intentresolver.chooser.TargetInfo; -import com.android.intentresolver.dagger.TestViewModelComponent; import com.android.intentresolver.flags.FeatureFlagRepository; import com.android.intentresolver.grid.ChooserGridAdapter; import com.android.intentresolver.icons.TargetDataLoader; @@ -48,8 +47,6 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import java.util.List; import java.util.function.Consumer; -import javax.inject.Inject; - /** * Simple wrapper around chooser activity to be able to initiate it under test. For more * information, see {@code com.android.internal.app.ChooserWrapperActivity}. @@ -59,11 +56,6 @@ public class ChooserWrapperActivity static final ChooserActivityOverrideData sOverrides = ChooserActivityOverrideData.getInstance(); private UsageStatsManager mUsm; - @Inject - public ChooserWrapperActivity(TestViewModelComponent.Builder builder) { - super(builder); - } - // ResolverActivity (the base class of ChooserActivity) inspects the launched-from UID at // onCreate and needs to see some non-negative value in the test. @Override diff --git a/java/tests/src/com/android/intentresolver/ResolverWrapperActivity.java b/java/tests/src/com/android/intentresolver/ResolverWrapperActivity.java index 11e7dffd..401ede26 100644 --- a/java/tests/src/com/android/intentresolver/ResolverWrapperActivity.java +++ b/java/tests/src/com/android/intentresolver/ResolverWrapperActivity.java @@ -44,8 +44,6 @@ import java.util.List; import java.util.function.Consumer; import java.util.function.Function; -import javax.inject.Inject; - /* * Simple wrapper around chooser activity to be able to initiate it under test */ @@ -55,7 +53,6 @@ public class ResolverWrapperActivity extends ResolverActivity { private final CountingIdlingResource mLabelIdlingResource = new CountingIdlingResource("LoadLabelTask"); - @Inject public ResolverWrapperActivity() { super(/* isIntentPicker= */ true); } diff --git a/java/tests/src/com/android/intentresolver/TestApplication.kt b/java/tests/src/com/android/intentresolver/TestApplication.kt index 4f5aefb9..849cfbab 100644 --- a/java/tests/src/com/android/intentresolver/TestApplication.kt +++ b/java/tests/src/com/android/intentresolver/TestApplication.kt @@ -16,13 +16,12 @@ package com.android.intentresolver +import android.app.Application import android.content.Context import android.os.UserHandle -import com.android.intentresolver.dagger.DaggerTestApplicationComponent -class TestApplication : IntentResolverApplication() { - override fun createApplicationComponentBuilder() = DaggerTestApplicationComponent.builder() +class TestApplication : Application() { // return the current context as a work profile doesn't really exist in these tests override fun createContextAsUser(user: UserHandle, flags: Int): Context = this -} +}
\ No newline at end of file diff --git a/java/tests/src/com/android/intentresolver/dagger/TestActivityBinderModule.kt b/java/tests/src/com/android/intentresolver/dagger/TestActivityBinderModule.kt deleted file mode 100644 index c08bc3b2..00000000 --- a/java/tests/src/com/android/intentresolver/dagger/TestActivityBinderModule.kt +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2023 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 com.android.intentresolver.dagger - -import android.app.Activity -import com.android.intentresolver.ChooserWrapperActivity -import com.android.intentresolver.ResolverWrapperActivity -import dagger.Binds -import dagger.Module -import dagger.multibindings.ClassKey -import dagger.multibindings.IntoMap - -@Module -interface TestActivityBinderModule { - @Binds - @IntoMap - @ClassKey(ResolverWrapperActivity::class) - @ActivityScope - fun resolverWrapperActivity(activity: ResolverWrapperActivity): Activity - - @Binds - @IntoMap - @ClassKey(ChooserWrapperActivity::class) - @ActivityScope - fun chooserWrapperActivity(activity: ChooserWrapperActivity): Activity -} diff --git a/java/tests/src/com/android/intentresolver/dagger/TestActivityComponent.kt b/java/tests/src/com/android/intentresolver/dagger/TestActivityComponent.kt deleted file mode 100644 index 4416c852..00000000 --- a/java/tests/src/com/android/intentresolver/dagger/TestActivityComponent.kt +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2023 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 com.android.intentresolver.dagger - -import dagger.Subcomponent - -@ActivityScope -@Subcomponent( - modules = [ActivityModule::class, ActivityBinderModule::class, TestActivityBinderModule::class] -) -interface TestActivityComponent : ActivityComponent { - @Subcomponent.Factory - interface Factory : ActivityComponent.Factory { - override fun create(): TestActivityComponent - } -} diff --git a/java/tests/src/com/android/intentresolver/dagger/TestApplicationComponent.kt b/java/tests/src/com/android/intentresolver/dagger/TestApplicationComponent.kt deleted file mode 100644 index 224c46c6..00000000 --- a/java/tests/src/com/android/intentresolver/dagger/TestApplicationComponent.kt +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2023 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 com.android.intentresolver.dagger - -import android.app.Application -import dagger.BindsInstance -import dagger.Component -import javax.inject.Singleton - -@Singleton -@Component(modules = [TestApplicationModule::class]) -interface TestApplicationComponent : ApplicationComponent { - @Component.Builder - interface Builder : ApplicationComponent.Builder { - @BindsInstance - override fun application(application: Application): TestApplicationComponent.Builder - - override fun build(): TestApplicationComponent - } -} diff --git a/java/tests/src/com/android/intentresolver/dagger/TestApplicationModule.kt b/java/tests/src/com/android/intentresolver/dagger/TestApplicationModule.kt deleted file mode 100644 index 714748d2..00000000 --- a/java/tests/src/com/android/intentresolver/dagger/TestApplicationModule.kt +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2023 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 com.android.intentresolver.dagger - -import dagger.Binds -import dagger.Module -import javax.inject.Singleton - -@Module( - subcomponents = [TestActivityComponent::class, TestViewModelComponent::class], - includes = [ReceiverBinderModule::class, CoroutinesModule::class] -) -interface TestApplicationModule : ApplicationModule { - - /** Required to support field injection of [InjectedAppComponentFactory] */ - @Binds - @Singleton - fun activityComponent(component: TestActivityComponent.Factory): ActivityComponent.Factory - - /** Required to support injection into Activity instances */ - @Binds - @Singleton - fun viewModelComponent(component: TestViewModelComponent.Builder): ViewModelComponent.Builder -} diff --git a/java/tests/src/com/android/intentresolver/dagger/TestViewModelComponent.kt b/java/tests/src/com/android/intentresolver/dagger/TestViewModelComponent.kt deleted file mode 100644 index 539b3f36..00000000 --- a/java/tests/src/com/android/intentresolver/dagger/TestViewModelComponent.kt +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2023 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 com.android.intentresolver.dagger - -import dagger.Subcomponent - -/** A ViewModelComponent for tests which replaces ViewModelModule -> TestViewModelModule */ -@ViewModelScope -@Subcomponent(modules = [TestViewModelModule::class, ViewModelBinderModule::class]) -interface TestViewModelComponent : ViewModelComponent { - @Subcomponent.Builder - interface Builder : ViewModelComponent.Builder { - override fun build(): TestViewModelComponent - } -} diff --git a/java/tests/src/com/android/intentresolver/dagger/TestViewModelModule.kt b/java/tests/src/com/android/intentresolver/dagger/TestViewModelModule.kt deleted file mode 100644 index 28f4fa73..00000000 --- a/java/tests/src/com/android/intentresolver/dagger/TestViewModelModule.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.android.intentresolver.dagger - -import dagger.Module - -/** Provides bindings shared among components within [@ViewModelScope][ViewModelScope]. */ -@Module abstract class TestViewModelModule |