package com.alibaba.genie.panel.basic.base;
import android.app.Application;
import android.arch.lifecycle.LifecycleOwner;
import android.arch.lifecycle.Observer;
import android.arch.lifecycle.ViewModel;
import android.arch.lifecycle.ViewModelProvider;
import android.arch.lifecycle.ViewModelStoreOwner;
import android.content.Context;
import android.databinding.DataBindingUtil;
import android.databinding.ViewDataBinding;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.constraint.ConstraintLayout;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import com.alibaba.genie.panel.basic.R;
import com.alibaba.genie.panel.basic.base.mvvm.BaseViewModel;
import com.alibaba.genie.panel.basic.base.mvvm.IBaseView;
import com.alibaba.genie.panel.basic.component.bus.LiveBus;
import com.alibaba.genie.panel.basic.widget.IotToast;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public abstract class BaseLayout<T extends ViewDataBinding, VM extends BaseViewModel> extends ConstraintLayout
implements IBaseView, View.OnClickListener {
protected LiveBus liveBus = LiveBus.getInstance();
protected FrameLayout root;
protected FrameLayout container;
protected Context context;
@NonNull
protected T binding;
public VM viewModel;
public BaseLayout(@NonNull Context context) {
this(context, null);
}
public BaseLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public BaseLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.context = getContext();
initTypeArray(context, attrs, defStyleAttr);
binding = DataBindingUtil.inflate(LayoutInflater.from(context), initContentView(), this, true);
root = findViewById(R.id.layout_root);
Class vmClass = getViewModelClass();
viewModel = (VM) createViewModel(null, vmClass);
binding.setVariable(initVariableId(), viewModel);
initData();
initView();
initViewObservable();
registerUiChangeLiveDataCallBack();
}
protected void initTypeArray(Context context, AttributeSet attrs, int defStyleAttr) {
}
private Class getViewModelClass() {
Type type = getClass().getGenericSuperclass();
if (type instanceof ParameterizedType) {
Type[] actualTypeArguments = ((ParameterizedType) type).getActualTypeArguments();
return (Class) actualTypeArguments[actualTypeArguments.length-1];
} else {
return BaseViewModel.class;
}
}
@NonNull
public ViewModelProvider.Factory getDefaultViewModelProviderFactory() {
return ViewModelProvider.AndroidViewModelFactory.getInstance((Application) getContext().getApplicationContext());
}
public <T extends ViewModel> T createViewModel(ViewModelStoreOwner owner, Class<T> cls) {
return getDefaultViewModelProviderFactory().create(cls);
}
public abstract int initContentView();
@Override
public boolean initData() {
return true;
}
@Override
public void initViewObservable() {
}
@Override
public void onClick(View v) {
}
public LifecycleOwner getLifecycleOwner() {
if (getContext() instanceof LifecycleOwner) {
return (LifecycleOwner) getContext();
}
throw new UnsupportedOperationException(
"如果想要在自定义布局中使用 LiveBus ,Context 必须是一个 LifecycleOwner" + "\n"
+ "If you want to use the LiveBus, the Context must be a LifecycleOwner");
}
protected void showLoading() {
BaseViewActivity activity = getActivity();
if (activity != null) {
activity.showLoading();
}
}
public void showLoading(String info) {
BaseViewActivity activity = getActivity();
if (activity != null) {
activity.showLoading(info);
}
}
protected void hideLoading() {
BaseViewActivity activity = getActivity();
if (activity != null) {
activity.hideLoading();
}
}
protected void showToast(String msg){
IotToast.makeIconText(context, msg).show();
}
protected BaseViewActivity getActivity() {
if (context instanceof BaseViewActivity) {
return (BaseViewActivity) context;
}
return null;
}
protected void registerUiChangeLiveDataCallBack() {
viewModel.getUiChange().showToastEvent.observe(getActivity(), new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
showToast(s);
}
});
viewModel.getUiChange().showLoadingEvent.observe(getActivity(), new Observer<String>() {
@Override
public void onChanged(String info) {
if (TextUtils.isEmpty(info)) {
showLoading();
} else {
showLoading(info);
}
}
});
viewModel.getUiChange().hideStateViewEvent.observe(getActivity(), new Observer<Void>() {
@Override
public void onChanged(Void aVoid) {
hideLoading();
}
});
}
}