/* * 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. */ package com.android.dialer.app.contactinfo; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v7.app.AppCompatActivity; import com.android.dialer.phonenumbercache.ContactInfo; import com.android.dialer.util.ExpirableCache; /** * Fragment without any UI whose purpose is to retain an instance of {@link ExpirableCache} across * configuration change through the use of {@link #setRetainInstance(boolean)}. This is done as * opposed to implementing {@link android.os.Parcelable} as it is a less widespread change. */ public class ExpirableCacheHeadlessFragment extends Fragment { private static final String FRAGMENT_TAG = "ExpirableCacheHeadlessFragment"; private static final int CONTACT_INFO_CACHE_SIZE = 100; private ExpirableCache retainedCache = ExpirableCache.create(CONTACT_INFO_CACHE_SIZE); @NonNull public static ExpirableCacheHeadlessFragment attach(@NonNull AppCompatActivity parentActivity) { return attach(parentActivity.getSupportFragmentManager()); } @NonNull private static ExpirableCacheHeadlessFragment attach(FragmentManager fragmentManager) { ExpirableCacheHeadlessFragment fragment = (ExpirableCacheHeadlessFragment) fragmentManager.findFragmentByTag(FRAGMENT_TAG); if (fragment == null) { fragment = new ExpirableCacheHeadlessFragment(); // Allowing state loss since in rare cases this is called after activity's state is saved and // it's fine if the cache is lost. fragmentManager.beginTransaction().add(fragment, FRAGMENT_TAG).commitNowAllowingStateLoss(); } return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); } public ExpirableCache getRetainedCache() { return retainedCache; } }