| /* |
| * 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; |
| } |
| } |