package com.android.pump.app; import android.app.Application; import androidx.annotation.NonNull; import androidx.annotation.UiThread; import androidx.recyclerview.widget.RecyclerView.RecycledViewPool; import com.android.pump.concurrent.Executors; import com.android.pump.db.DataProvider; import com.android.pump.db.MediaDb; import com.android.pump.provider.KnowledgeGraph; import com.android.pump.ui.CustomRecycledViewPool; import com.android.pump.util.Globals; import com.android.pump.util.ImageLoader; import java.util.concurrent.Executor; @UiThread public abstract class GlobalsApplication extends Application implements Globals.Provider { private Executor mExecutor; private ImageLoader mImageLoader; private RecycledViewPool mRecycledViewPool; private MediaDb mMediaDb; @Override public void onTrimMemory(int level) { super.onTrimMemory(level); // TODO(b/123038906) Implement } @Override public @NonNull ImageLoader getImageLoader() { if (mImageLoader == null) { mImageLoader = new ImageLoader(getContentResolver(), getExecutor()); } return mImageLoader; } @Override public @NonNull RecycledViewPool getRecycledViewPool() { if (mRecycledViewPool == null) { mRecycledViewPool = new CustomRecycledViewPool(); } return mRecycledViewPool; } @Override public @NonNull MediaDb getMediaDb() { if (mMediaDb == null) { mMediaDb = new MediaDb(getContentResolver(), getDataProvider(), getExecutor()); // TODO When can we release mMediaDb? } return mMediaDb; } private @NonNull Executor getExecutor() { if (mExecutor == null) { // TODO Adjust pool size mExecutor = Executors.newFixedUniqueThreadPool( Runtime.getRuntime().availableProcessors() * 2 + 1); } return mExecutor; } private @NonNull DataProvider getDataProvider() { return KnowledgeGraph.getInstance(); } }