Commit aeea7b36 authored by hywang's avatar hywang

1.增加日期判断,2020年以前禁止登录;

2.增加标签绑定功能
parent 2bbdab56
...@@ -9,8 +9,8 @@ android { ...@@ -9,8 +9,8 @@ android {
applicationId "com.phlx.anchorcollect_p" applicationId "com.phlx.anchorcollect_p"
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 29 targetSdkVersion 29
versionCode 6 versionCode 8
versionName "1.0.5" versionName "2.0.2"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
......
...@@ -87,6 +87,11 @@ ...@@ -87,6 +87,11 @@
android:configChanges="keyboardHidden|orientation|screenSize" android:configChanges="keyboardHidden|orientation|screenSize"
android:launchMode="singleTask" android:launchMode="singleTask"
android:windowSoftInputMode="stateHidden|adjustResize" /> android:windowSoftInputMode="stateHidden|adjustResize" />
<activity
android:name=".ui.bind.BindActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:launchMode="singleTask"
android:windowSoftInputMode="stateHidden|adjustResize" />
<service <service
......
...@@ -8,6 +8,7 @@ import androidx.annotation.VisibleForTesting; ...@@ -8,6 +8,7 @@ import androidx.annotation.VisibleForTesting;
import androidx.lifecycle.ViewModel; import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelProvider;
import com.phlx.anchorcollect_p.ui.bind.BindVM;
import com.phlx.anchorcollect_p.ui.fragment.vm.BasicsCollectVM; import com.phlx.anchorcollect_p.ui.fragment.vm.BasicsCollectVM;
import com.phlx.anchorcollect_p.ui.fragment.vm.BreedingRecordVM; import com.phlx.anchorcollect_p.ui.fragment.vm.BreedingRecordVM;
import com.phlx.anchorcollect_p.ui.fragment.vm.ImmunRecordVM; import com.phlx.anchorcollect_p.ui.fragment.vm.ImmunRecordVM;
...@@ -99,6 +100,8 @@ public class VMFactory extends ViewModelProvider.NewInstanceFactory { ...@@ -99,6 +100,8 @@ public class VMFactory extends ViewModelProvider.NewInstanceFactory {
} else if (modelClass.isAssignableFrom(CattleVM.class)) { } else if (modelClass.isAssignableFrom(CattleVM.class)) {
return (T) new CattleVM(mApplication, repository); return (T) new CattleVM(mApplication, repository);
} else if (modelClass.isAssignableFrom(BindVM.class)) {
return (T) new BindVM(mApplication, repository);
} else if (modelClass.isAssignableFrom(SettingVM.class)) { } else if (modelClass.isAssignableFrom(SettingVM.class)) {
return (T) new SettingVM(mApplication, repository); return (T) new SettingVM(mApplication, repository);
......
...@@ -14,10 +14,10 @@ import org.greenrobot.greendao.identityscope.IdentityScopeType; ...@@ -14,10 +14,10 @@ import org.greenrobot.greendao.identityscope.IdentityScopeType;
// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
/** /**
* Master of DAO (schema version 1): knows all DAOs. * Master of DAO (schema version 3): knows all DAOs.
*/ */
public class DaoMaster extends AbstractDaoMaster { public class DaoMaster extends AbstractDaoMaster {
public static final int SCHEMA_VERSION = 1; public static final int SCHEMA_VERSION = 3;
/** Creates underlying database table using DAOs. */ /** Creates underlying database table using DAOs. */
public static void createAllTables(Database db, boolean ifNotExists) { public static void createAllTables(Database db, boolean ifNotExists) {
......
...@@ -49,15 +49,15 @@ public class RetrofitClient { ...@@ -49,15 +49,15 @@ public class RetrofitClient {
private static final int CACHE_TIMEOUT = 10 * 1024 * 1024; private static final int CACHE_TIMEOUT = 10 * 1024 * 1024;
//服务端根路径 //服务端根路径
public static String baseUrl = public static String baseUrl =
// "serve.xlglmnmyzspt.org.cn"//正式 "serve.xlglmnmyzspt.org.cn"//正式
// "39.101.170.186"//阿里云测试 // "39.101.170.186"//阿里云测试
"192.168.8.135"//董 // "192.168.8.135"//董
// "192.168.43.154"//张敏 // "192.168.43.154"//张敏
; ;
public static String port = public static String port =
// ""//正式 ""//正式
// "9000"//阿里云测试 // "9000"//阿里云测试
"9000"//董 // "9000"//董
; ;
private static Context mContext = Utils.getContext(); private static Context mContext = Utils.getContext();
......
package com.phlx.anchorcollect_p.ui.bind;
import android.os.Bundle;
import androidx.lifecycle.ViewModelProviders;
import com.phlx.anchorcollect_p.R;
import com.phlx.anchorcollect_p.data.VMFactory;
import com.phlx.anchorcollect_p.databinding.ActivityBindBinding;
import com.phlx.anchorcollect_p.ui.base.BaseActivity;
import com.phlx.anchorcollect_p.ui.fragment.vm.BasicsCollectVM;
import me.tatarka.bindingcollectionadapter2.BR;
public class BindActivity extends BaseActivity<ActivityBindBinding, BindVM> {
@Override
public int initContentView(Bundle savedInstanceState) {
return R.layout.activity_bind;
}
@Override
public int initVariableId() {
return BR.viewModel;
}
@Override
public void initParam() {
super.initParam();
}
@Override
public BindVM initViewModel() {
VMFactory factory = VMFactory.getInstance(getApplication());
return ViewModelProviders.of(this, factory).get(BindVM.class);
}
@Override
public void initData() {
super.initData();
viewModel.initToolbar();
}
@Override
public void initViewObservable() {
super.initViewObservable();
}
}
package com.phlx.anchorcollect_p.ui.bind;
import android.annotation.SuppressLint;
import android.app.Application;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Handler;
import android.os.Message;
import android.util.SparseIntArray;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.databinding.ObservableArrayList;
import androidx.databinding.ObservableField;
import com.phlx.anchorcollect_p.App;
import com.phlx.anchorcollect_p.Configs;
import com.phlx.anchorcollect_p.R;
import com.phlx.anchorcollect_p.data.Repository;
import com.phlx.anchorcollect_p.db.DbUtil;
import com.phlx.anchorcollect_p.db.gen.CattleResumeEntityDao;
import com.phlx.anchorcollect_p.db.interf.DbQueryCallBack;
import com.phlx.anchorcollect_p.entity.CattleResumeEntity;
import com.phlx.anchorcollect_p.ui.base.BackBarVM;
import com.phlx.anchorcollect_p.util.TextUtil;
import com.phlx.anchorcollect_p.widget.ItemData;
import com.uhf.structures.InventoryData;
import com.uhf.structures.OnInventoryListener;
import org.greenrobot.greendao.query.QueryBuilder;
import org.greenrobot.greendao.query.WhereCondition;
import java.util.ArrayList;
import java.util.List;
import cn.wandersnail.commons.util.ToastUtils;
import me.goldze.mvvmhabit.binding.command.BindingCommand;
import me.goldze.mvvmhabit.binding.command.BindingConsumer;
import me.goldze.mvvmhabit.binding.viewadapter.spinner.IKeyAndValue;
import me.goldze.mvvmhabit.utils.StringUtils;
public class BindVM extends BackBarVM<Repository> implements OnInventoryListener {
public ObservableArrayList<IKeyAndValue> tagItemData;
private List<CattleResumeEntity> cattleResumeEntityList;
public ObservableField<String> individualNo = new ObservableField<>("");
public ObservableField<String> registrationNo = new ObservableField<>("");
private SoundPool soundPool;//盘点到标签时的提示音
private SparseIntArray musicId;
private boolean isScan = false;//是否在扫描
private String tag = "";//扫描到的标记
private CattleResumeEntity entity;
public BindVM(@NonNull Application application, Repository model) {
super(application, model);
soundPool = new SoundPool(2, AudioManager.STREAM_MUSIC, 5);
musicId = new SparseIntArray();
musicId.put(1, soundPool.load(getApplication(), R.raw.readcard, 1));
musicId.put(2, soundPool.load(getApplication(), R.raw.failure, 1));
}
@Override
public void onResume() {
super.onResume();
isScan = false;
tag = "";
App.getInstance().getLinkage().setOnInventoryListener(this);
}
//初始化ToolBar
public void initToolbar() {
setBackTitleText("绑定耳标");
setSettingVisibleObservable(View.GONE);
setBackRightTextVisible(View.VISIBLE);
setBackRightText(getApplication().getResources().getString(R.string.save));
initData();
}
private void initData() {
tagItemData = new ObservableArrayList<>();
cattleResumeEntityList = new ArrayList<>();
queryTag();
}
private void queryTag() {
tagItemData.clear();
cattleResumeEntityList.clear();
QueryBuilder<CattleResumeEntity> builder0 =
DbUtil.getInstance().getQueryBuilder(CattleResumeEntity.class)
.where(CattleResumeEntityDao.Properties.RegistrationNo.eq(""));
DbUtil.getInstance().setDbQueryCallBack(new DbQueryCallBack<CattleResumeEntity>() {
@Override
public void onSuccess(List<CattleResumeEntity> result) {
if (result != null && result.size() > 0) {
cattleResumeEntityList.addAll(result);
for (CattleResumeEntity cattleResumeEntity : result) {
tagItemData.add(new ItemData(cattleResumeEntity.getIndividualNo(), cattleResumeEntity.getIndividualNo()));
}
}
}
@Override
public void onFailed() {
ToastUtils.showShort("查询基础数据数量失败!");
dismissDialog();
}
}).queryAsyncAll(CattleResumeEntity.class, builder0);
}
public BindingCommand<IKeyAndValue> onTagSelectorCommand = new BindingCommand<>(new BindingConsumer<IKeyAndValue>() {
@Override
public void call(IKeyAndValue iKeyAndValue) {
individualNo.set(iKeyAndValue.getValue());
}
});
public BindingCommand onRegistrationNoClick = new BindingCommand(() -> startInventory());
@Override
protected void backRightTextOnClick() {
super.backRightTextOnClick();
if (StringUtils.isEmpty(individualNo.get())) {
ToastUtils.showShort("请选择可视耳标");
return;
}
if (StringUtils.isEmpty(registrationNo.get())) {
ToastUtils.showShort("请扫描标签");
return;
}
bindRfid();
}
private void bindRfid() {
for (CattleResumeEntity cattleResumeEntity : cattleResumeEntityList) {
if (cattleResumeEntity.getIndividualNo().equals(individualNo.get())) {
entity = cattleResumeEntity;
entity.setRegistrationNo(registrationNo.get());
entity.setUploadStatus("0");
break;
}
}
if (entity != null) {
long saveStatus = DbUtil.getInstance().insertOrReplace(entity);
if (saveStatus != -1) {
ToastUtils.showShort("耳标绑定成功!");
entity = null;
individualNo.set("");
registrationNo.set("");
queryTag();
} else {
ToastUtils.showShort("耳标绑定失败!");
}
}
}
//开始盘点一次
public void startInventory() {
if (!isScan) {
App.getInstance().getLinkage().startInventory(1, 0);
tag = "";
registrationNo.set("");
isScan = true;
} else {
App.getInstance().getLinkage().stopInventory();
isScan = false;
}
}
@SuppressLint("HandlerLeak")
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 0x333) {
InventoryData inventoryData = (InventoryData) msg.obj;
if (inventoryData.getDataLength() > 0 && inventoryData.getEpcLength() > 0) {
String epc = TextUtil.byteToHexString(inventoryData.getEPC_Data(), inventoryData.getEpcLength());
String tid = TextUtil.byteToHexString(inventoryData.getData(), inventoryData.getDataLength());
soundPool.play(musicId.get(1), 1, 1, 0, 0, 1);
App.getInstance().getLinkage().stopInventory();
if ("".equals(tag))
checkEpc(epc, tid);
}
}
}
};
private void checkEpc(String epc, String tid) {
tag = epc + tid;
registrationNo.set(epc);
isScan = false;
}
@Override
public void getInventoryData(InventoryData inventoryData) {
if (inventoryData != null) {
Message messenger = handler.obtainMessage();
messenger.what = 0x333;
messenger.obj = inventoryData;
handler.sendMessage(messenger);
}
}
}
...@@ -36,6 +36,7 @@ import com.phlx.anchorcollect_p.entity.PerformanceEntity; ...@@ -36,6 +36,7 @@ import com.phlx.anchorcollect_p.entity.PerformanceEntity;
import com.phlx.anchorcollect_p.entity.WeightManEntity; import com.phlx.anchorcollect_p.entity.WeightManEntity;
import com.phlx.anchorcollect_p.event.EventMsg; import com.phlx.anchorcollect_p.event.EventMsg;
import com.phlx.anchorcollect_p.event.EventTag; import com.phlx.anchorcollect_p.event.EventTag;
import com.phlx.anchorcollect_p.ui.bind.BindActivity;
import com.phlx.anchorcollect_p.ui.fragment.list.CollectGridItem; import com.phlx.anchorcollect_p.ui.fragment.list.CollectGridItem;
import com.phlx.anchorcollect_p.ui.setting.SettingActivity; import com.phlx.anchorcollect_p.ui.setting.SettingActivity;
import com.phlx.anchorcollect_p.ui.setting.SyncActivity; import com.phlx.anchorcollect_p.ui.setting.SyncActivity;
...@@ -283,11 +284,15 @@ public class BasicsCollectVM extends BaseViewModel<Repository> implements OnInve ...@@ -283,11 +284,15 @@ public class BasicsCollectVM extends BaseViewModel<Repository> implements OnInve
public BindingCommand onSyncClick = new BindingCommand(new BindingAction() { public BindingCommand onSyncClick = new BindingCommand(new BindingAction() {
@Override @Override
public void call() { public void call() {
if (!Configs.isOnLine) { // if (!Configs.isOnLine) {
ToastUtils.showShort("请在联网模式下同步数据!"); //// ToastUtils.showShort("请在联网模式下同步数据!");
return; //// return;
//// }
if (Configs.isOnLine) {
startActivity(SyncActivity.class);
} else {
startActivity(BindActivity.class);
} }
startActivity(SyncActivity.class);
} }
}); });
...@@ -326,8 +331,13 @@ public class BasicsCollectVM extends BaseViewModel<Repository> implements OnInve ...@@ -326,8 +331,13 @@ public class BasicsCollectVM extends BaseViewModel<Repository> implements OnInve
public void click(int id) { public void click(int id) {
if (StringUtils.isEmpty(rfid.get())) {
ToastUtils.showShort("请扫描耳标");
return;
}
if (StringUtils.isEmpty(tag.get())) { if (StringUtils.isEmpty(tag.get())) {
ToastUtils.showShort("请扫描耳标或者输入耳标信息"); ToastUtils.showShort("请输入可视耳标");
return; return;
} }
......
...@@ -104,6 +104,22 @@ public class LoginActivity extends BaseActivity<ActivityLoginBinding, LoginVM> { ...@@ -104,6 +104,22 @@ public class LoginActivity extends BaseActivity<ActivityLoginBinding, LoginVM> {
} }
} }
}); });
viewModel.dateEvent.observe(this, new Observer<Integer>() {
@Override
public void onChanged(Integer integer) {
new MaterialDialog.Builder(LoginActivity.this).canceledOnTouchOutside(false).title("系统提示").content("日期错误,请联网自动获取日期").positiveText("退出").onAny(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
if (which == DialogAction.POSITIVE) {
ModuleManager.destroyLibSO();
finish();
android.os.Process.killProcess(android.os.Process.myPid());
}
}
}).show();
}
});
} }
@Override @Override
......
...@@ -26,6 +26,7 @@ import com.phlx.anchorcollect_p.params.BaseResponse; ...@@ -26,6 +26,7 @@ import com.phlx.anchorcollect_p.params.BaseResponse;
import com.phlx.anchorcollect_p.params.CollectResponse; import com.phlx.anchorcollect_p.params.CollectResponse;
import com.phlx.anchorcollect_p.ui.main.MainActivity; import com.phlx.anchorcollect_p.ui.main.MainActivity;
import com.phlx.anchorcollect_p.ui.splash.SplashActivity; import com.phlx.anchorcollect_p.ui.splash.SplashActivity;
import com.phlx.anchorcollect_p.util.DateUtils;
import com.phlx.anchorcollect_p.util.StringUtil; import com.phlx.anchorcollect_p.util.StringUtil;
import com.phlx.anchorcollect_p.util.TextUtil; import com.phlx.anchorcollect_p.util.TextUtil;
...@@ -64,6 +65,9 @@ public class LoginVM extends BaseViewModel<Repository> { ...@@ -64,6 +65,9 @@ public class LoginVM extends BaseViewModel<Repository> {
//更新app //更新app
public SingleLiveEvent<Integer> appUpdateEvent = new SingleLiveEvent<>(); public SingleLiveEvent<Integer> appUpdateEvent = new SingleLiveEvent<>();
//手机时间问题,退出软件
public SingleLiveEvent<Integer> dateEvent = new SingleLiveEvent<>();
public int loginType;//登录后是否跳转, 0跳转main 1不跳转 public int loginType;//登录后是否跳转, 0跳转main 1不跳转
...@@ -83,20 +87,21 @@ public class LoginVM extends BaseViewModel<Repository> { ...@@ -83,20 +87,21 @@ public class LoginVM extends BaseViewModel<Repository> {
//清除用户名的点击事件 //清除用户名的点击事件
public BindingCommand clearUserNameOnClickCommand = new BindingCommand(() -> userName.set("")); public BindingCommand clearUserNameOnClickCommand = new BindingCommand(() -> userName.set(""));
//密码显示点击事件 //密码显示点击事件
public BindingCommand passwordShowSwitchOnClickCommand = public BindingCommand passwordShowSwitchOnClickCommand = new BindingCommand(() -> {
new BindingCommand(() -> { pSwitchEvent.setValue(pSwitchEvent.getValue() == null || !pSwitchEvent.getValue());
pSwitchEvent.setValue(pSwitchEvent.getValue() == null || !pSwitchEvent.getValue()); });
});
//用户名输入框焦点改变的回调事件 //用户名输入框焦点改变的回调事件
public BindingCommand<Boolean> onFocusChangeCommand = public BindingCommand<Boolean> onFocusChangeCommand = new BindingCommand<>(hasFocus -> {
new BindingCommand<>(hasFocus -> { if (hasFocus) {
if (hasFocus) { clearBtnVisibility.set(View.VISIBLE);
clearBtnVisibility.set(View.VISIBLE); } else {
} else { clearBtnVisibility.set(View.INVISIBLE);
clearBtnVisibility.set(View.INVISIBLE); }
} });
});
//离线,联机 //离线,联机
public BindingCommand<String> isOnlineCheckedChangeCommand = new BindingCommand<String>(s -> { public BindingCommand<String> isOnlineCheckedChangeCommand = new BindingCommand<String>(s -> {
if (s.equals("离线")) { if (s.equals("离线")) {
...@@ -105,10 +110,15 @@ public class LoginVM extends BaseViewModel<Repository> { ...@@ -105,10 +110,15 @@ public class LoginVM extends BaseViewModel<Repository> {
Configs.isOnLine = true; Configs.isOnLine = true;
} }
}); });
//登录按钮的点击事件 //登录按钮的点击事件
public BindingCommand loginOnClickCommand = new BindingCommand(new BindingAction() { public BindingCommand loginOnClickCommand = new BindingCommand(new BindingAction() {
@Override @Override
public void call() { public void call() {
if(Integer.parseInt(DateUtils.getYear())<2020){
dateEvent.call();
return;
}
if (Configs.isOnLine) { if (Configs.isOnLine) {
login(); login();
} else { } else {
......
package com.phlx.anchorcollect_p.util; package com.phlx.anchorcollect_p.util;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date; import java.util.Date;
public class DateUtils { public class DateUtils {
public static String getYear(){ public static String getYear() {
String year = ""; String year = "";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy"); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy");
year = simpleDateFormat.format(new Date()); year = simpleDateFormat.format(new Date());
return year; return year;
} }
public static long getYearLong() {
Calendar c1 = Calendar.getInstance();
c1.set(Integer.parseInt(getYear()), 0, 1, 0, 0, 0);
return c1.getTimeInMillis();
}
} }
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/tools"
xmlns:binding="http://schemas.android.com/apk/res-auto"
app:ignore="NamespaceTypo">
<data>
<import type="me.tatarka.bindingcollectionadapter2.BindingRecyclerViewAdapter" />
<import type="me.goldze.mvvmhabit.binding.viewadapter.recyclerview.LayoutManagers" />
<import type="me.goldze.mvvmhabit.binding.viewadapter.recyclerview.LineManagers" />
<variable
name="viewModel"
type="com.phlx.anchorcollect_p.ui.bind.BindVM" />
<variable
name="spinnerAdapter"
type="android.widget.ArrayAdapter" />
<variable
name="adapter"
type="BindingRecyclerViewAdapter" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/color_bg"
android:padding="5dp">
<include
android:id="@+id/include"
layout="@layout/layout_back_bar"
binding:backBarVM="@{viewModel.backBarVM}" />
<TextView
android:id="@+id/tv_rfid_text"
android:layout_width="0dp"
android:layout_height="@dimen/dp_45"
android:background="@drawable/bg_radius_stroke_white_5"
android:gravity="center"
android:layout_margin="@dimen/dp_20"
android:hint="未扫到电子耳标"
android:text="@{viewModel.registrationNo}"
android:textColor="@color/black"
binding:layout_constraintLeft_toLeftOf="parent"
binding:layout_constraintRight_toRightOf="parent"
binding:layout_constraintTop_toBottomOf="@+id/include"
onClickCommand="@{viewModel.onRegistrationNoClick}"
/>
<Spinner
android:id="@+id/colony_house_no_sp"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_40"
android:layout_marginTop="@dimen/dp_5"
android:gravity="center_vertical"
android:minHeight="@dimen/dp_40"
android:layout_margin="@dimen/dp_20"
android:spinnerMode="dialog"
binding:valueReply="@{viewModel.individualNo}"
app:adapter="@{spinnerAdapter}"
binding:itemDatas="@{viewModel.tagItemData}"
binding:onItemSelectedCommand="@{viewModel.onTagSelectorCommand}"
binding:layout_constraintLeft_toLeftOf="parent"
binding:layout_constraintRight_toRightOf="parent"
binding:layout_constraintTop_toBottomOf="@+id/tv_rfid_text"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
\ No newline at end of file
...@@ -44,6 +44,20 @@ ...@@ -44,6 +44,20 @@
binding:layout_constraintStart_toStartOf="parent" binding:layout_constraintStart_toStartOf="parent"
binding:layout_constraintTop_toTopOf="parent" /> binding:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_right_text"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="?selectableItemBackground"
android:gravity="center"
android:padding="12dp"
android:text="@{backBarVM.backRightText}"
android:textColor="@color/white"
android:textSize="16sp"
android:visibility="@{backBarVM.backRightTextVisibleObservable}"
binding:layout_constraintRight_toRightOf="parent"
binding:layout_constraintBaseline_toBaselineOf="@+id/tv_title"
binding:onClickCommand="@{backBarVM.backRightTextOnClick}" />
<ImageView <ImageView
android:id="@+id/iv_setting_icon" android:id="@+id/iv_setting_icon"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment