package com.bwx.bequick;
import java.util.ArrayList;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import com.bwx.bequick.fwk.Setting;
public class ListSettingsLayout {
private final LinearLayout mList;
private final SettingsApplication mApp;
public ListSettingsLayout(View parent, SettingsApplication app) {
mList = (LinearLayout) parent.findViewById(R.id.settings_list);
mApp = app;
}
public void updateLayout(Activity activity) {
final LayoutInflater inflater = activity.getLayoutInflater();
final ArrayList<Setting> settings = mApp.getSettings();
final int settingCount = getSettingsCount(settings);
final LinearLayout layout = mList;
// Go through all settings and ensure they have corresponding
// views in the layout. Then remove not used views in such.
for (int settingIndex = 0; settingIndex < settingCount; settingIndex++) {
int layoutIndex = settingIndex << 1;
View layoutView = layout.getChildCount() < layoutIndex ? null : layout.getChildAt(layoutIndex);
Setting setting = settings.get(settingIndex + 1);
View settingView = setting.getAssignedRenderer().getView(inflater, setting, null, activity);
if (layoutView == null) {
// we just need to append setting view
safelyRemoveViewFromParent(layout, layoutIndex, settingView);
// add setting view
layout.addView(settingView);
// add delimiter if it is not the last setting
ImageView delimiter = new ImageView(activity);
delimiter.setImageResource(android.R.drawable.divider_horizontal_dim_dark);
layout.addView(delimiter);
settingView.setTag(delimiter);
} else if (layoutView != settingView) {
// we just need to remove current view and put setting view instead
// replace view
layout.removeView(layoutView);
// detach it from a parent if there is a parent
safelyRemoveViewFromParent(layout, layoutIndex, settingView);
layout.addView(settingView, layoutIndex); // add setting view
settingView.setTag(layout.getChildAt(layoutIndex + 1)); // reuse delimiter
}
// else - do nothing, this is same view
}
// if we have more views then settings, we have to remove redundant views
final int layoutCount = layout.getChildCount();
final int expectedCount = settingCount << 1;
if (layoutCount > expectedCount) {
layout.removeViews(expectedCount, layoutCount - expectedCount);
}
}
/**
* removes setting view and its delimiter from a parent
* @param layout
* @param layoutIndex
* @param settingView
*/
private void safelyRemoveViewFromParent(LinearLayout layout, int layoutIndex, View settingView) {
LinearLayout parent = (LinearLayout) settingView.getParent();
if (parent != null) {
View delimiter = (View) settingView.getTag();
parent.removeView(settingView);
parent.removeView(delimiter);
}
}
private int getSettingsCount(ArrayList<Setting> settings) {
int size = settings.size();
for (int index=0; index<size; index++) {
int id = settings.get(index).id;
if (id == Setting.GROUP_HIDDEN) return index - 1;
}
return size;
}
}