package org.sorz.lab.smallcloudemoji.activites; import android.app.ActionBar; import android.app.Activity; import android.app.Fragment; import android.app.FragmentManager; import android.content.Intent; import android.graphics.Bitmap; import android.os.Bundle; import android.util.LruCache; import android.view.MenuItem; import android.view.View; import org.sorz.lab.smallcloudemoji.R; import org.sorz.lab.smallcloudemoji.db.DaoSession; import org.sorz.lab.smallcloudemoji.db.DatabaseHelper; import org.sorz.lab.smallcloudemoji.db.DatabaseUpgrader; import org.sorz.lab.smallcloudemoji.fragments.RepositoryFragment; import org.sorz.lab.smallcloudemoji.fragments.SettingsFragment; import org.sorz.lab.smallcloudemoji.fragments.SourceFragment; import org.sorz.lab.smallcloudemoji.fragments.StoreFragment; import org.sorz.lab.smallcloudemoji.interfaces.IconCacheHolder; import java.util.Stack; public class SettingsActivity extends Activity implements FragmentManager.OnBackStackChangedListener, SettingsFragment.OnSourceManageClickListener, RepositoryFragment.OnEmoticonStoreClickListener, StoreFragment.OnSourceClickListener, IconCacheHolder { private final static String REPOSITORY_FRAGMENT_IS_SHOWING = "REPOSITORY_FRAGMENT_IS_SHOWING"; private final static String STORE_FRAGMENT_IS_SHOWING = "STORE_FRAGMENT_IS_SHOWING"; public final static int REQUEST_FOR_ADDING_REPOSITORY = 1; private LruCache<String, Bitmap> iconCache; private RepositoryFragment repositoryFragment; private StoreFragment storeFragment; private boolean tabletLayout; private Stack<CharSequence> titleHistory = new Stack<CharSequence>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getFragmentManager().addOnBackStackChangedListener(this); // Open database. DatabaseHelper databaseHelper = DatabaseHelper.getInstance(this, true); DaoSession daoSession = databaseHelper.getDaoSession(); DatabaseUpgrader.checkAndDoUpgrade(this, daoSession); setContentView(R.layout.activity_settings); repositoryFragment = (RepositoryFragment) getFragmentManager() .findFragmentById(R.id.repository_frag); tabletLayout = repositoryFragment != null; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == android.R.id.home) { getFragmentManager().popBackStack(); return true; } return super.onOptionsItemSelected(item); } @Override protected void onSaveInstanceState(Bundle outState) { outState.putBoolean(REPOSITORY_FRAGMENT_IS_SHOWING, repositoryFragment != null && !repositoryFragment.isHidden()); outState.putBoolean(STORE_FRAGMENT_IS_SHOWING, storeFragment != null && !storeFragment.isHidden()); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { if (!tabletLayout) { if (savedInstanceState.getBoolean(REPOSITORY_FRAGMENT_IS_SHOWING, false)) { onSourceManageClick(); } else if (savedInstanceState.getBoolean(STORE_FRAGMENT_IS_SHOWING, false)) { onSourceManageClick(); onEmoticonStoreClick(); } } else { if (savedInstanceState.getBoolean(STORE_FRAGMENT_IS_SHOWING, false)) { onEmoticonStoreClick(); } } } @Override public void onDestroy() { super.onDestroy(); DatabaseHelper.getInstance(this).close(); } private void setActionBarTitle(int id) { ActionBar actionBar = getActionBar(); if (actionBar != null) { titleHistory.push(actionBar.getTitle()); titleHistory.push(getString(id)); } } @Override public void onBackStackChanged() { ActionBar actionBar = getActionBar(); if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled( getFragmentManager().getBackStackEntryCount() > 0); if (!titleHistory.empty()) actionBar.setTitle(titleHistory.pop()); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_FOR_ADDING_REPOSITORY) { if (repositoryFragment != null) repositoryFragment.onActivityResult(requestCode, resultCode, data); if (storeFragment != null) storeFragment.onActivityResult(requestCode, resultCode, data); } super.onActivityResult(requestCode, resultCode, data); } @Override public boolean onSourceManageClick() { if (tabletLayout) return false; setActionBarTitle(R.string.pref_source_manage_title); FragmentManager fragmentManager = getFragmentManager(); Fragment settingsFragment = fragmentManager.findFragmentById(R.id.settings_frag); if (repositoryFragment == null) repositoryFragment = new RepositoryFragment(); fragmentManager.beginTransaction() .hide(settingsFragment) .add(R.id.settings_container, repositoryFragment) .addToBackStack(null) .commit(); return true; } @Override public void onEmoticonStoreClick() { setActionBarTitle(R.string.title_emoticon_store); FragmentManager fragmentManager = getFragmentManager(); if (storeFragment == null) storeFragment = StoreFragment.newInstance(getString(R.string.store_url)); fragmentManager.beginTransaction() .hide(repositoryFragment) .add(R.id.settings_container, storeFragment) .addToBackStack(null) .commit(); } @Override public void onSourceClick(long sourceId) { setActionBarTitle(R.string.title_emoticon_store); FragmentManager fragmentManager = getFragmentManager(); SourceFragment sourceFragment = SourceFragment.newInstance(sourceId); fragmentManager.beginTransaction() .hide(storeFragment) .add(R.id.settings_container, sourceFragment) .addToBackStack(null) .commit(); } public void hideRepository(View view) { repositoryFragment.hideRepository(view); } public void moveUpRepository(View view) { repositoryFragment.moveUpRepository(view); } public void moveDownRepository(View view) { repositoryFragment.moveDownRepository(view); } public void popMoreMenu(View view) { repositoryFragment.popMoreMenu(view); } @Override public synchronized LruCache<String, Bitmap> getIconCache() { if (iconCache == null) { // Get max available VM memory in KiB. final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); // Use 1/16th of the available memory for icon cache. // ~70 icons in 120 x 120px for 64MiB available memory. final int cacheSize = maxMemory / 16; iconCache = new LruCache<String, Bitmap>(cacheSize) { @Override protected int sizeOf(String key, Bitmap bitmap) { // The cache size will be measured in kilobytes rather than // number of items. return bitmap.getByteCount() / 1024; } }; } return iconCache; } }