summaryrefslogtreecommitdiffstats
path: root/src/com/android/messaging/FactoryImpl.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/messaging/FactoryImpl.java')
-rw-r--r--src/com/android/messaging/FactoryImpl.java245
1 files changed, 245 insertions, 0 deletions
diff --git a/src/com/android/messaging/FactoryImpl.java b/src/com/android/messaging/FactoryImpl.java
new file mode 100644
index 0000000..a862308
--- /dev/null
+++ b/src/com/android/messaging/FactoryImpl.java
@@ -0,0 +1,245 @@
+/*
+ * Copyright (C) 2015 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.messaging;
+
+import android.content.Context;
+import android.os.Process;
+import android.telephony.SmsManager;
+import android.util.SparseArray;
+
+import com.android.messaging.datamodel.DataModel;
+import com.android.messaging.datamodel.DataModelImpl;
+import com.android.messaging.datamodel.MemoryCacheManager;
+import com.android.messaging.datamodel.ParticipantRefresh.ContactContentObserver;
+import com.android.messaging.datamodel.data.ParticipantData;
+import com.android.messaging.datamodel.media.BugleMediaCacheManager;
+import com.android.messaging.datamodel.media.MediaCacheManager;
+import com.android.messaging.datamodel.media.MediaResourceManager;
+import com.android.messaging.sms.BugleCarrierConfigValuesLoader;
+import com.android.messaging.ui.UIIntents;
+import com.android.messaging.ui.UIIntentsImpl;
+import com.android.messaging.util.Assert;
+import com.android.messaging.util.BugleApplicationPrefs;
+import com.android.messaging.util.BugleGservices;
+import com.android.messaging.util.BugleGservicesImpl;
+import com.android.messaging.util.BuglePrefs;
+import com.android.messaging.util.BugleSubscriptionPrefs;
+import com.android.messaging.util.BugleWidgetPrefs;
+import com.android.messaging.util.LogUtil;
+import com.android.messaging.util.MediaUtil;
+import com.android.messaging.util.MediaUtilImpl;
+import com.android.messaging.util.OsUtil;
+import com.android.messaging.util.PhoneUtils;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+class FactoryImpl extends Factory {
+ private BugleApplication mApplication;
+ private DataModel mDataModel;
+ private BugleGservices mBugleGservices;
+ private BugleApplicationPrefs mBugleApplicationPrefs;
+ private BugleWidgetPrefs mBugleWidgetPrefs;
+ private Context mApplicationContext;
+ private UIIntents mUIIntents;
+ private MemoryCacheManager mMemoryCacheManager;
+ private MediaResourceManager mMediaResourceManager;
+ private MediaCacheManager mMediaCacheManager;
+ private ContactContentObserver mContactContentObserver;
+ private PhoneUtils mPhoneUtils;
+ private MediaUtil mMediaUtil;
+ private SparseArray<BugleSubscriptionPrefs> mSubscriptionPrefs;
+ private BugleCarrierConfigValuesLoader mCarrierConfigValuesLoader;
+
+ // Cached instance for Pre-L_MR1
+ private static final Object PHONEUTILS_INSTANCE_LOCK = new Object();
+ private static PhoneUtils sPhoneUtilsInstancePreLMR1 = null;
+ // Cached subId->instance for L_MR1 and beyond
+ private static final ConcurrentHashMap<Integer, PhoneUtils> sPhoneUtilsInstanceCacheLMR1 =
+ new ConcurrentHashMap<>();
+
+ private FactoryImpl() {
+ }
+
+ public static Factory register(final Context applicationContext,
+ final BugleApplication application) {
+ // This only gets called once (from BugleApplication.onCreate), but its not called in tests.
+ Assert.isTrue(!sRegistered);
+ Assert.isNull(Factory.get());
+
+ final FactoryImpl factory = new FactoryImpl();
+ Factory.setInstance(factory);
+ sRegistered = true;
+
+ // At this point Factory is published. Services can now get initialized and depend on
+ // Factory.get().
+ factory.mApplication = application;
+ factory.mApplicationContext = applicationContext;
+ factory.mMemoryCacheManager = new MemoryCacheManager();
+ factory.mMediaCacheManager = new BugleMediaCacheManager();
+ factory.mMediaResourceManager = new MediaResourceManager();
+ factory.mBugleGservices = new BugleGservicesImpl(applicationContext);
+ factory.mBugleApplicationPrefs = new BugleApplicationPrefs(applicationContext);
+ factory.mDataModel = new DataModelImpl(applicationContext);
+ factory.mBugleWidgetPrefs = new BugleWidgetPrefs(applicationContext);
+ factory.mUIIntents = new UIIntentsImpl();
+ factory.mContactContentObserver = new ContactContentObserver();
+ factory.mMediaUtil = new MediaUtilImpl();
+ factory.mSubscriptionPrefs = new SparseArray<BugleSubscriptionPrefs>();
+ factory.mCarrierConfigValuesLoader = new BugleCarrierConfigValuesLoader(applicationContext);
+
+ Assert.initializeGservices(factory.mBugleGservices);
+ LogUtil.initializeGservices(factory.mBugleGservices);
+
+ if (OsUtil.hasRequiredPermissions()) {
+ factory.onRequiredPermissionsAcquired();
+ }
+
+ return factory;
+ }
+
+ @Override
+ public void onRequiredPermissionsAcquired() {
+ if (sInitialized) {
+ return;
+ }
+ sInitialized = true;
+
+ mApplication.initializeSync(this);
+
+ final Thread asyncInitialization = new Thread() {
+ @Override
+ public void run() {
+ Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
+ mApplication.initializeAsync(FactoryImpl.this);
+ }
+ };
+ asyncInitialization.start();
+ }
+
+ @Override
+ public Context getApplicationContext() {
+ return mApplicationContext;
+ }
+
+ @Override
+ public DataModel getDataModel() {
+ return mDataModel;
+ }
+
+ @Override
+ public BugleGservices getBugleGservices() {
+ return mBugleGservices;
+ }
+
+ @Override
+ public BuglePrefs getApplicationPrefs() {
+ return mBugleApplicationPrefs;
+ }
+
+ @Override
+ public BuglePrefs getWidgetPrefs() {
+ return mBugleWidgetPrefs;
+ }
+
+ @Override
+ public BuglePrefs getSubscriptionPrefs(int subId) {
+ subId = PhoneUtils.getDefault().getEffectiveSubId(subId);
+ BugleSubscriptionPrefs pref = mSubscriptionPrefs.get(subId);
+ if (pref == null) {
+ synchronized (this) {
+ if ((pref = mSubscriptionPrefs.get(subId)) == null) {
+ pref = new BugleSubscriptionPrefs(getApplicationContext(), subId);
+ mSubscriptionPrefs.put(subId, pref);
+ }
+ }
+ }
+ return pref;
+ }
+
+ @Override
+ public UIIntents getUIIntents() {
+ return mUIIntents;
+ }
+
+ @Override
+ public MemoryCacheManager getMemoryCacheManager() {
+ return mMemoryCacheManager;
+ }
+
+ @Override
+ public MediaResourceManager getMediaResourceManager() {
+ return mMediaResourceManager;
+ }
+
+ @Override
+ public MediaCacheManager getMediaCacheManager() {
+ return mMediaCacheManager;
+ }
+
+ @Override
+ public ContactContentObserver getContactContentObserver() {
+ return mContactContentObserver;
+ }
+
+ @Override
+ public PhoneUtils getPhoneUtils(int subId) {
+ if (OsUtil.isAtLeastL_MR1()) {
+ if (subId == ParticipantData.DEFAULT_SELF_SUB_ID) {
+ subId = SmsManager.getDefaultSmsSubscriptionId();
+ }
+ if (subId < 0) {
+ LogUtil.w(LogUtil.BUGLE_TAG, "PhoneUtils.getForLMR1(): invalid subId = " + subId);
+ subId = ParticipantData.DEFAULT_SELF_SUB_ID;
+ }
+ PhoneUtils instance = sPhoneUtilsInstanceCacheLMR1.get(subId);
+ if (instance == null) {
+ instance = new PhoneUtils.PhoneUtilsLMR1(subId);
+ sPhoneUtilsInstanceCacheLMR1.putIfAbsent(subId, instance);
+ }
+ return instance;
+ } else {
+ Assert.isTrue(subId == ParticipantData.DEFAULT_SELF_SUB_ID);
+ if (sPhoneUtilsInstancePreLMR1 == null) {
+ synchronized (PHONEUTILS_INSTANCE_LOCK) {
+ if (sPhoneUtilsInstancePreLMR1 == null) {
+ sPhoneUtilsInstancePreLMR1 = new PhoneUtils.PhoneUtilsPreLMR1();
+ }
+ }
+ }
+ return sPhoneUtilsInstancePreLMR1;
+ }
+ }
+
+ @Override
+ public void reclaimMemory() {
+ mMemoryCacheManager.reclaimMemory();
+ }
+
+ @Override
+ public void onActivityResume() {
+ }
+
+ @Override
+ public MediaUtil getMediaUtil() {
+ return mMediaUtil;
+ }
+
+ @Override
+ public BugleCarrierConfigValuesLoader getCarrierConfigValuesLoader() {
+ return mCarrierConfigValuesLoader;
+ }
+}