package com.tresorit.zerokitsdk.cache; import android.os.Bundle; import android.support.v4.util.LongSparseArray; import android.support.v7.app.AppCompatActivity; import java.util.concurrent.atomic.AtomicLong; public abstract class ComponentCacheActivity extends AppCompatActivity implements ComponentCache { private static final String NEXT_ID_KEY = "next-presenter-id"; private NonConfigurationInstance nonConfigurationInstance; @Override protected void onCreate(Bundle savedInstanceState) { nonConfigurationInstance = (NonConfigurationInstance) getLastCustomNonConfigurationInstance(); if (nonConfigurationInstance == null) { long seed; if (savedInstanceState == null) seed = 0; else seed = savedInstanceState.getLong(NEXT_ID_KEY); nonConfigurationInstance = new NonConfigurationInstance(seed); } super.onCreate(savedInstanceState); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putLong(NEXT_ID_KEY, nonConfigurationInstance.nextId.get()); } @Override public Object onRetainCustomNonConfigurationInstance() { return nonConfigurationInstance; } @Override public long generateId() { return nonConfigurationInstance.nextId.getAndIncrement(); } @SuppressWarnings("unchecked") @Override public final <C> C getComponent(long index) { return (C) nonConfigurationInstance.components.get(index); } @Override public void setComponent(long index, Object component) { nonConfigurationInstance.components.put(index, component); } private static class NonConfigurationInstance { final LongSparseArray<Object> components; final AtomicLong nextId; NonConfigurationInstance(long seed) { components = new LongSparseArray<>(); nextId = new AtomicLong(seed); } } }