package com.materialdoc.ui.activity.home; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import com.google.gson.Gson; import com.materialdoc.R; import com.materialdoc.model.data.ChildItem; import com.materialdoc.model.data.ParentItem; import com.materialdoc.ui.activity.*; import com.materialdoc.ui.activity.input.InputActivity; import com.materialdoc.ui.activity.input.InputErrorLabelActivity; import com.materialdoc.ui.activity.input.InputFloatingLabelActivity; import com.materialdoc.ui.activity.input.InputFullWidthActivity; import com.materialdoc.ui.activity.input.InputMultiLineActivity; import com.materialdoc.ui.activity.input.InputSingleLineActivity; import com.materialdoc.ui.activity.tab.TabActivity; import com.materialdoc.ui.activity.tab.TabIconActivity; import com.materialdoc.ui.activity.tab.TabMultiActivity; import com.materialdoc.ui.activity.tab.TabStyledActivity; import com.materialdoc.ui.adapter.ItemAdapter; import com.materialdoc.ui.data.IViewType; import com.materialdoc.ui.data.ItemDisplayable; import com.materialdoc.ui.data.ItemID; import com.materialdoc.ui.data.TitleDisplayable; import com.materialdoc.utils.IOUtils; import com.materialdoc.utils.L; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import rx.Observable; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; import rx.functions.Func1; import rx.schedulers.Schedulers; public class HomeActivity extends AppCompatActivity { private ItemAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.ac_home); initRecycleView(); loadData(); initActionBar(); } private void initActionBar() { ActionBar actionBar = getSupportActionBar(); if(actionBar != null) { actionBar.setTitle(R.string.app_label); } } private void initRecycleView() { mAdapter = new ItemAdapter(); mAdapter.setListener(new ItemAdapter.Listener() { @Override public void onDocumentClicked(ItemDisplayable displayable) { handleDocumentClick(displayable); } }); LinearLayoutManager layoutManager = new LinearLayoutManager(this); RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView); recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(layoutManager); recyclerView.setItemAnimator(new DefaultItemAnimator()); recyclerView.setAdapter(mAdapter); } private void loadData() { Observable.create(loadDataFromAssets()) .map(toDisplayableList()) .subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<List<IViewType>>() { @Override public void call(List<IViewType> dataList) { mAdapter.setData(removeEmptyItems(dataList)); } }, new Action1<Throwable>() { @Override public void call(Throwable e) { L.e("Error during loading json data list", e); } }); } @NonNull private List<IViewType> removeEmptyItems(@NonNull List<IViewType> dataList) { List<IViewType> resultList = new ArrayList<>(); for (IViewType type : dataList) { if (type instanceof TitleDisplayable && !TextUtils.isEmpty(((TitleDisplayable) type).getTitle())) { resultList.add(type); } else if (type instanceof ItemDisplayable && !TextUtils.isEmpty(((ItemDisplayable) type).getTitle()) && !TextUtils.isEmpty(((ItemDisplayable) type).getDescription())) { resultList.add(type); } } return resultList; } @NonNull private Observable.OnSubscribe<List<ParentItem>> loadDataFromAssets() { return new Observable.OnSubscribe<List<ParentItem>>() { @Override public void call(Subscriber<? super List<ParentItem>> subscriber) { try { InputStream inputStream = getAssets().open("json/data.json"); String json = IOUtils.toString(inputStream); Gson gson = new Gson(); ParentItem[] parentItemArr = gson.fromJson(json, ParentItem[].class); subscriber.onNext(Arrays.asList(parentItemArr)); subscriber.onCompleted(); } catch (IOException e) { subscriber.onError(e); } } }; } @NonNull private Func1<List<ParentItem>, List<IViewType>> toDisplayableList() { return new Func1<List<ParentItem>, List<IViewType>>() { @Override public List<IViewType> call(List<ParentItem> parentItemList) { List<IViewType> typeList = new ArrayList<>(); for (ParentItem parentItem : parentItemList) { typeList.add(new TitleDisplayable(parentItem.title)); if (parentItem.itemsList == null) { continue; } for (ChildItem item : parentItem.itemsList) { typeList.add(toDisplayable(item)); } } return typeList; } }; } @NonNull private ItemDisplayable toDisplayable(ChildItem item) { ItemDisplayable displayable = new ItemDisplayable(); displayable.setId(item.id); displayable.setTitle(item.title); displayable.setDescription(item.description); return displayable; } private void handleDocumentClick(ItemDisplayable displayable) { int documentId = displayable.getId(); switch (documentId) { //buttons case ItemID.RAISED_BUTTON: RaisedButtonActivity.start(this); break; case ItemID.FLAT_BUTTON: FlatButtonActivity.start(this); break; case ItemID.FLOATING_ACTION_BUTTONS: FloatingButtonActivity.start(this); break; //cards case ItemID.CARD_VIEW: CardViewActivity.start(this); break; //chips case ItemID.CHIP: break; //dialog case ItemID.ALERT: AlertDialogActivity.start(this); break; case ItemID.CONFIRMATION_DIALOGS: ConfirmationDialogActivity.start(this); break; case ItemID.FULL_SCREEN_DIALOGS: break; //menu case ItemID.MENU: MenuActivity.start(this); break; case ItemID.MENU_STYLED: StyledMenuActivity.start(this); break; //pickers case ItemID.DATE_PICKER: DatePickerActivity.start(this); break; case ItemID.TIME_PICKER: TimePickerActivity.start(this); break; //progress case ItemID.CIRCULAR_PROGRESS: CircularProgressActivity.start(this); break; case ItemID.LINEAR_PROGRESS: LinearProgressActivity.start(this); break; case ItemID.SWIPE_DOWN_TO_REFRESH: SwipeToRefreshActivity.start(this); break; case ItemID.SCROLL_UP_TO_LOAD_MORE: break; //selection controls case ItemID.CHECK_BOX: CheckBoxActivity.start(this); break; case ItemID.RADIO_BUTTON: RadioButtonActivity.start(this); break; case ItemID.SWITCH: SwitchActivity.start(this); break; //sliders case ItemID.CONTINUOUS_SLIDER: break; //message alerts case ItemID.SNACK_BAR: SnackBarActivity.start(this); break; case ItemID.TOAST: ToastActivity.start(this); break; //tabs case ItemID.TABS_TEXT_ONLY: TabActivity.start(this); break; case ItemID.TABS_ICON_ONLY: TabIconActivity.start(this); break; case ItemID.TABS_ICON_AND_TEXT: TabMultiActivity.start(this); break; case ItemID.TABS_STYLED: TabStyledActivity.start(this); break; //text field case ItemID.INPUT_FIELD: InputActivity.start(this); break; case ItemID.INPUT_FIELD_SINGLE_LINE: InputSingleLineActivity.start(this); break; case ItemID.INPUT_FIELD_MULTI_LINE: InputMultiLineActivity.start(this); break; case ItemID.INPUT_FIELD_FULL_WIDTH: InputFullWidthActivity.start(this); break; case ItemID.INPUT_FIELD_FLOATING_LABEL: InputFloatingLabelActivity.start(this); break; case ItemID.INPUT_FIELD_ERROR_LABEL: InputErrorLabelActivity.start(this); break; //toolbars case ItemID.TOOLBAR_DEFAULT: DefaultToolbarActivity.start(this); break; case ItemID.TOOLBAR_STYLED: StyledToolbarActivity.start(this); break; case ItemID.TOOLBAR_ICONS: IconsToolbarActivity.start(this); break; case ItemID.TOOLBAR_BACK: BackToolbarActivity.start(this); break; case ItemID.TOOLBAR_BLANK: BlankToolbarActivity.start(this); break; //other case ItemID.RATING_BAR: RatingBarActivity.start(this); break; } } }