diff --git a/app/src/main/java/com/example/zxa01/iotclient/common/http/Api.java b/app/src/main/java/com/example/zxa01/iotclient/common/http/Api.java index 723fff543c48de03a18791d94647fc9d6d793e88..2364cc0d24cb76f40a9c5bbe624c3f84d5bdca13 100644 --- a/app/src/main/java/com/example/zxa01/iotclient/common/http/Api.java +++ b/app/src/main/java/com/example/zxa01/iotclient/common/http/Api.java @@ -49,6 +49,13 @@ public class Api { @GET("/api/breeds/list/all") Call<Object> getPrivacyPolicyReport(); + + @GET("/api/breeds/list/all") + Call<Object> updatePrivacyPolicyChoice(); + + @GET("/api/breeds/list/all") + Call<Object> getRecord(); + // @GET("/api/breed/{breed}/images") // Call<DogBreedImages> getImagesByBreed(@Path("breed") String breed); diff --git a/app/src/main/java/com/example/zxa01/iotclient/detail/viewModel/DetailViewModel.java b/app/src/main/java/com/example/zxa01/iotclient/detail/viewModel/DetailViewModel.java index 7bc66cd63a77e6d41f65a9d349cf8f31641f42af..81a4d9c1d81c4f5df8045b2d87c8eb49a9537b8d 100644 --- a/app/src/main/java/com/example/zxa01/iotclient/detail/viewModel/DetailViewModel.java +++ b/app/src/main/java/com/example/zxa01/iotclient/detail/viewModel/DetailViewModel.java @@ -1,5 +1,6 @@ package com.example.zxa01.iotclient.detail.viewModel; +import com.example.zxa01.iotclient.R; import com.example.zxa01.iotclient.common.pojo.device.Device; import com.example.zxa01.iotclient.detail.model.DetailModel; import com.example.zxa01.iotclient.privacy.view.PrivacyActivity; @@ -9,6 +10,8 @@ import android.content.Context; import android.content.Intent; import android.databinding.ObservableBoolean; import android.databinding.ObservableField; +import android.view.Gravity; +import android.widget.Toast; public class DetailViewModel extends ViewModel { @@ -43,5 +46,8 @@ public class DetailViewModel extends ViewModel { public void downloadPrivacyReport() { // TODO download + Toast toast = Toast.makeText(context, R.string.detail_report_download, Toast.LENGTH_LONG); + toast.setGravity(Gravity.BOTTOM,0,15); + toast.show(); } } diff --git a/app/src/main/java/com/example/zxa01/iotclient/home/HomeActivity.java b/app/src/main/java/com/example/zxa01/iotclient/home/HomeActivity.java index 61a91c6dc10cc4302f188971964d06b9738096b9..9de7b63d706edab39c56e5fcdf90fee75d16f79c 100644 --- a/app/src/main/java/com/example/zxa01/iotclient/home/HomeActivity.java +++ b/app/src/main/java/com/example/zxa01/iotclient/home/HomeActivity.java @@ -2,8 +2,7 @@ package com.example.zxa01.iotclient.home; import com.example.zxa01.iotclient.R; import com.example.zxa01.iotclient.databinding.ActivityHomeBinding; import com.example.zxa01.iotclient.home.device.view.DeviceFragment; -import com.example.zxa01.iotclient.home.device.viewModel.DeviceViewModel; -import com.example.zxa01.iotclient.home.record.RecordFragment; +import com.example.zxa01.iotclient.home.record.view.RecordFragment; import com.example.zxa01.iotclient.home.setting.SettingFragment; import android.content.Intent; import android.net.Uri; @@ -82,7 +81,7 @@ public class HomeActivity extends AppCompatActivity implements // new DeviceViewModel().createDevice(intent.getStringExtra("SCAN_RESULT")); } else { new AlertDialog.Builder(this) - .setMessage(R.string.qrcode_error) + .setMessage(R.string.create_qrcode_error) .show(); } } diff --git a/app/src/main/java/com/example/zxa01/iotclient/home/device/model/DeviceModel.java b/app/src/main/java/com/example/zxa01/iotclient/home/device/model/DeviceModel.java index 52d915f08a50920ad3f6562c5f8218be728eda51..f15d85dc7f7653eef4e76b89c0d7578b4bf88a56 100644 --- a/app/src/main/java/com/example/zxa01/iotclient/home/device/model/DeviceModel.java +++ b/app/src/main/java/com/example/zxa01/iotclient/home/device/model/DeviceModel.java @@ -1,21 +1,25 @@ package com.example.zxa01.iotclient.home.device.model; + import com.example.zxa01.iotclient.common.http.Api; import com.example.zxa01.iotclient.common.pojo.device.Device; import com.example.zxa01.iotclient.common.pojo.device.Manufacturer; import com.example.zxa01.iotclient.common.pojo.device.Model; + import android.arch.lifecycle.MutableLiveData; import android.databinding.BaseObservable; import android.util.Log; + import java.util.ArrayList; import java.util.List; + import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; public class DeviceModel extends BaseObservable { - private List<Device> deviceList; - private MutableLiveData<List<Device>> devices; + private List<Device> devices = new ArrayList<>(); + private MutableLiveData<List<Device>> devicesMLD = new MutableLiveData<>(); // fake private Device oxygenDevice = new Device() @@ -31,21 +35,17 @@ public class DeviceModel extends BaseObservable { .setDescription("本è¨å‚™æ˜¯ç‚ºç¬¦åˆä¸åŒé ˜åŸŸåŠç…§è·æ‡‰ç”¨è€Œè¨è¨ˆï¼Œä¸¦æŠŠé€™äº›ç‰¹è‰²èžå…¥å°å¦‚指節的分æžå„€ä¸ï¼Œå¯åœ¨æ•¸ç§’內釿¸¬å‡ºæº–確å¯é 的血氧åŠå¿ƒè·³å€¼ã€‚") .setUrl("https://www.amazon.com/Pulse-Oximeter-Blood-Oxygen-Monitor/dp/B00HXXO332")) .setUPC("B00HXXO332") - .setLocation("25.013068, 121.541651") - .setStatus(Device.Status.Disconnected); - + .setLocation("25.013068, 121.541651"); public DeviceModel() { - deviceList = new ArrayList<>(); - devices = new MutableLiveData<>(); } public void addDevice(Device device) { - deviceList.add(device); + devices.add(device); } - public MutableLiveData<List<Device>> getDevices() { - return devices; + public MutableLiveData<List<Device>> getDevicesMLD() { + return devicesMLD; } public void fetchDevices() { @@ -53,10 +53,8 @@ public class DeviceModel extends BaseObservable { @Override public void onResponse(Call<Object> call, Response<Object> response) { // TODO transfer response - Log.i("Test", response.message()); - addDevice(oxygenDevice); addDevice(oxygenDevice); - devices.setValue(deviceList); + devicesMLD.setValue(devices); } @Override diff --git a/app/src/main/java/com/example/zxa01/iotclient/home/device/view/DeviceFragment.java b/app/src/main/java/com/example/zxa01/iotclient/home/device/view/DeviceFragment.java index 87ad0658e885a28ea33bf2135267166a3630de5f..4bf577879413643f62312c809b60d1b87fe96bed 100644 --- a/app/src/main/java/com/example/zxa01/iotclient/home/device/view/DeviceFragment.java +++ b/app/src/main/java/com/example/zxa01/iotclient/home/device/view/DeviceFragment.java @@ -52,7 +52,7 @@ public class DeviceFragment extends Fragment { private void init() { viewModel.refreshDevices(); - viewModel.getDevices().observe(this, deviceList -> viewModel.setAdapter(deviceList)); + viewModel.observeDevicesMLD().observe(this, viewModel::setAdapter); } private void drawDialog() { diff --git a/app/src/main/java/com/example/zxa01/iotclient/home/device/view/create/DeviceCreateFragment.java b/app/src/main/java/com/example/zxa01/iotclient/home/device/view/create/DeviceCreateFragment.java index 244c105e833c6f1faf9e568e59ee56b222c5d760..e9623d69e8a3620b66e8c9949952860e3216569a 100644 --- a/app/src/main/java/com/example/zxa01/iotclient/home/device/view/create/DeviceCreateFragment.java +++ b/app/src/main/java/com/example/zxa01/iotclient/home/device/view/create/DeviceCreateFragment.java @@ -35,13 +35,13 @@ public class DeviceCreateFragment extends DialogFragment { public Dialog onCreateDialog(Bundle savedInstanceState) { return new AlertDialog.Builder(getActivity()) .setView(R.layout.fragment_device_create) - .setNeutralButton(R.string.button_qrcode, + .setNeutralButton(R.string.create_button_qrcode, (dialog, whichButton) -> qrcodeIntent() ) - .setPositiveButton(R.string.button_correct, + .setPositiveButton(R.string.create_button_correct, (dialog, whichButton) -> viewModel.createDevice("address") ) - .setNegativeButton(R.string.button_cancel, (dialog, whichButton) -> { + .setNegativeButton(R.string.create_button_cancel, (dialog, whichButton) -> { }) .create(); } diff --git a/app/src/main/java/com/example/zxa01/iotclient/home/device/viewModel/DeviceViewModel.java b/app/src/main/java/com/example/zxa01/iotclient/home/device/viewModel/DeviceViewModel.java index bb7620c49a9c6600dfc6450979b4470f416a5fb4..fcdc2fa761c0bdf40d0736f3896e4f0588370fb0 100644 --- a/app/src/main/java/com/example/zxa01/iotclient/home/device/viewModel/DeviceViewModel.java +++ b/app/src/main/java/com/example/zxa01/iotclient/home/device/viewModel/DeviceViewModel.java @@ -32,8 +32,8 @@ public class DeviceViewModel extends ViewModel { deviceModel.fetchDevices(); } - public MutableLiveData<List<Device>> getDevices() { - return deviceModel.getDevices(); + public MutableLiveData<List<Device>> observeDevicesMLD() { + return deviceModel.getDevicesMLD(); } public void createDevice(String address) { @@ -46,18 +46,18 @@ public class DeviceViewModel extends ViewModel { */ public Device getDeviceAt(Integer index) { - if (deviceModel.getDevices().getValue() != null && + if (deviceModel.getDevicesMLD().getValue() != null && index != null && - deviceModel.getDevices().getValue().size() > index) { - return deviceModel.getDevices().getValue().get(index); + deviceModel.getDevicesMLD().getValue().size() > index) { + return deviceModel.getDevicesMLD().getValue().get(index); } return null; } public void onDevicesClick(Integer index) { - if (deviceModel.getDevices().getValue() != null && + if (deviceModel.getDevicesMLD().getValue() != null && index != null && - deviceModel.getDevices().getValue().size() > index) { + deviceModel.getDevicesMLD().getValue().size() > index) { // TODO detail of device context.startActivity( new Intent(context, DetailActivity.class) @@ -73,9 +73,9 @@ public class DeviceViewModel extends ViewModel { return adapter; } - public void setAdapter(List<Device> deviceList) { + public void setAdapter(List<Device> devices) { this.isLoading.set(false); - this.adapter.setDevices(deviceList); + this.adapter.setDevices(devices); this.adapter.notifyDataSetChanged(); } diff --git a/app/src/main/java/com/example/zxa01/iotclient/home/record/RecordFragment.java b/app/src/main/java/com/example/zxa01/iotclient/home/record/RecordFragment.java deleted file mode 100644 index beefe8d2d0c1df77b9425d49a2656a1cbf90d46e..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/example/zxa01/iotclient/home/record/RecordFragment.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.example.zxa01.iotclient.home.record; - -import android.content.Context; -import android.net.Uri; -import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import com.example.zxa01.iotclient.R; - -/** - * A simple {@link Fragment} subclass. - * Activities that contain this fragment must implement the - * {@link RecordFragment.OnFragmentInteractionListener} interface - * to handle interaction events. - * Use the {@link RecordFragment#newInstance} factory method to - * create an instance of this fragment. - */ -public class RecordFragment extends Fragment { - // TODO: Rename parameter arguments, choose names that match - // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER - private static final String ARG_PARAM1 = "param1"; - private static final String ARG_PARAM2 = "param2"; - - // TODO: Rename and change types of parameters - private String mParam1; - private String mParam2; - - private OnFragmentInteractionListener mListener; - - public RecordFragment() { - // Required empty public constructor - } - - /** - * Use this factory method to create a new instance of - * this fragment using the provided parameters. - * - * @param param1 Parameter 1. - * @param param2 Parameter 2. - * @return A new instance of fragment PrivacyFragment. - */ - // TODO: Rename and change types and number of parameters - public static RecordFragment newInstance(String param1, String param2) { - RecordFragment fragment = new RecordFragment(); - Bundle args = new Bundle(); - args.putString(ARG_PARAM1, param1); - args.putString(ARG_PARAM2, param2); - fragment.setArguments(args); - return fragment; - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - if (getArguments() != null) { - mParam1 = getArguments().getString(ARG_PARAM1); - mParam2 = getArguments().getString(ARG_PARAM2); - } - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_record, container, false); - } - - // TODO: Rename method, update argument and hook method into UI event - public void onButtonPressed(Uri uri) { - if (mListener != null) { - mListener.onPrivacyFragment(uri); - } - } - - @Override - public void onAttach(Context context) { - super.onAttach(context); - if (context instanceof OnFragmentInteractionListener) { - mListener = (OnFragmentInteractionListener) context; - } else { - throw new RuntimeException(context.toString() - + " must implement OnFragmentInteractionListener"); - } - } - - @Override - public void onDetach() { - super.onDetach(); - mListener = null; - } - - /** - * This interface must be implemented by activities that contain this - * fragment to allow an interaction in this fragment to be communicated - * to the activity and potentially other fragments contained in that - * activity. - * <p> - * See the Android Training lesson <a href= - * "http://developer.android.com/training/basics/fragments/communicating.html" - * >Communicating with Other Fragments</a> for more information. - */ - public interface OnFragmentInteractionListener { - // TODO: Update argument type and name - void onPrivacyFragment(Uri uri); - } -} diff --git a/app/src/main/java/com/example/zxa01/iotclient/home/record/model/RecordModel.java b/app/src/main/java/com/example/zxa01/iotclient/home/record/model/RecordModel.java new file mode 100644 index 0000000000000000000000000000000000000000..9dfdd51f7b80914145cc05d1c3e833a36f08a62b --- /dev/null +++ b/app/src/main/java/com/example/zxa01/iotclient/home/record/model/RecordModel.java @@ -0,0 +1,141 @@ +package com.example.zxa01.iotclient.home.record.model; + +import android.arch.lifecycle.MutableLiveData; +import android.databinding.BaseObservable; +import android.util.Log; + +import com.example.zxa01.iotclient.common.http.Api; +import com.example.zxa01.iotclient.common.pojo.device.Device; +import com.example.zxa01.iotclient.common.pojo.device.Manufacturer; +import com.example.zxa01.iotclient.common.pojo.device.Model; +import com.example.zxa01.iotclient.common.pojo.privacy.PrivacyPolicy; +import com.example.zxa01.iotclient.common.pojo.privacy.PrivacyPolicyReport; +import com.example.zxa01.iotclient.common.pojo.privacy.p3p.Access; +import com.example.zxa01.iotclient.common.pojo.privacy.p3p.Collector; +import com.example.zxa01.iotclient.common.pojo.privacy.p3p.Datum; +import com.example.zxa01.iotclient.common.pojo.privacy.p3p.Dispute; +import com.example.zxa01.iotclient.common.pojo.privacy.p3p.Purpose; +import com.example.zxa01.iotclient.common.pojo.privacy.p3p.Recipient; +import com.example.zxa01.iotclient.common.pojo.privacy.p3p.Remedy; +import com.example.zxa01.iotclient.common.pojo.privacy.p3p.Retention; +import com.example.zxa01.iotclient.common.pojo.privacy.p3p.Statement; + +import java.util.ArrayList; +import java.util.List; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +public class RecordModel extends BaseObservable { + + private List<PrivacyPolicyReport> privacyPolicyReports = new ArrayList<>(); + private MutableLiveData<List<PrivacyPolicyReport>> privacyPolicyReportsMLD = new MutableLiveData<>(); + + private Device oxygenDevice = new Device() + .setUDN("a1252c49-4188-4e6d-a32e-66604c664fb8") + .setName("指尖å¼è¡€æ°§æ©Ÿ") + .setType(Device.Type.Sensor) + .setManufacturer(new Manufacturer() + .setName("Facelake") + .setSerialNumber("3176927193") + .setUrl("http://facelake.com")) + .setModel(new Model() + .setName("指尖å¼è¡€æ°§æ©Ÿ") + .setDescription("本è¨å‚™æ˜¯ç‚ºç¬¦åˆä¸åŒé ˜åŸŸåŠç…§è·æ‡‰ç”¨è€Œè¨è¨ˆï¼Œä¸¦æŠŠé€™äº›ç‰¹è‰²èžå…¥å°å¦‚指節的分æžå„€ä¸ï¼Œå¯åœ¨æ•¸ç§’內釿¸¬å‡ºæº–確å¯é 的血氧åŠå¿ƒè·³å€¼ã€‚") + .setUrl("https://www.amazon.com/Pulse-Oximeter-Blood-Oxygen-Monitor/dp/B00HXXO332")) + .setUPC("B00HXXO332") + .setLocation("25.013068, 121.541651") + .setStatus(Device.Status.Disconnected); + + private PrivacyPolicyReport oxygenPrivacyPolicyReport = new PrivacyPolicyReport() + .setId("0cfb6be3-6f0f-4e63-85b8-e9c936707c0b") + .setVersion("1.0") + .setDescription("為æä¾›æ‚¨æœ€ä½³çš„äº’å‹•ç…§è·æœå‹™ï¼Œæœ¬APP部分æœå‹™å…§å®¹å¯èƒ½æœƒè«‹æ‚¨æä¾›å¿ƒè·³è³‡è¨ŠåŠè¡€æ°§é£½å’Œåº¦è³‡è¨Šï¼Œä»¥ä½œç‚ºæŒçºŒè‡ªå‹•追蹤心率的技術,æä¾›æ•´æ—¥å¥åº·ç‹€æ³çš„æ·±å…¥åˆ†æžä»¥åŠé‹å‹•強度的資訊。") + .setDevice(oxygenDevice) + .addPrivacyPolicy(new PrivacyPolicy() + .setId("119df569-06b1-4d63-84cd-bde7c9e4ab7e") + .setDescription("為æä¾›æ‚¨æœ€ä½³çš„äº’å‹•ç…§è·æœå‹™ï¼Œæœ¬APP部分æœå‹™å…§å®¹å¯èƒ½æœƒè«‹æ‚¨æä¾›è¡€æ°§é£½å’Œåº¦è³‡è¨Šï¼Œä»¥ä½œç‚ºå‘¼å¸ç³»çµ±ç–¾ç—…ã€å¾ªç’°ç³»çµ±ç–¾ç—…ã€å…¶å®ƒæ²»ç™‚ã€æª¢æŸ¥å¼•èµ·çš„æå‚·ä¹‹é 端醫療照è·åˆ†æžè³‡æ–™ã€‚") + .setCollector(new Collector() + .setName("å¥åº·ä¿ƒé€²ä¸å¿ƒ") + .setEmail("hcc@gmail.com.tw") + .setPhone("0988415875")) + .setAccess(Access.OTHER_IDENT) + .setDispute(new Dispute() + .setRelatedOrganization("地方法院") + .setType(Dispute.Type.LAW)) + .addRemedy(new Remedy() + .setType(Remedy.Type.LAW)) + .addStatement(new Statement() + .setConsequence("a1252c49-4188-4e6d-a32e-66604c664fb9") + .addPurpose(new Purpose() + .setType(Purpose.Type.PSEUDO_ANALYSIS) + .setDescription("本APP會使用者è’集血氧飽和度資訊作為呼å¸ç³»çµ±ç–¾ç—…ã€å¾ªç’°ç³»çµ±ç–¾ç—…ã€å…¶å®ƒæ²»ç™‚ã€æª¢æŸ¥å¼•èµ·çš„æå‚·ä¹‹é 端醫療照è·åˆ†æžè³‡æ–™ã€‚")) + .addDatum(new Datum() + .setType(Datum.Type.HEALTH) + .setDescription("血氧飽和度資訊")) + .addRecipient(new Recipient() + .setEntity("å¥åº·ä¿ƒé€²ä¸å¿ƒ") + .setType(Recipient.Type.OURS)) + .setRetention(Retention.STATED_PURPOSE))) + .addPrivacyPolicy(new PrivacyPolicy() + .setId("abe5ca7b-780e-4857-87e6-014870fe0a3f") + .setDescription("為æä¾›æ‚¨æœ€ä½³çš„äº’å‹•ç…§è·æœå‹™ï¼Œæœ¬APP會è’集使用者心跳資訊,作為æŒçºŒè‡ªå‹•追蹤心率的技術,æä¾›æ•´æ—¥å¥åº·ç‹€æ³çš„æ·±å…¥åˆ†æžä»¥åŠé‹å‹•強度的資訊。") + .setCollector(new Collector() + .setName("å¥åº·ä¿ƒé€²ä¸å¿ƒ") + .setEmail("hcc@gmail.com.tw") + .setPhone("0988415875")) + .setAccess(Access.OTHER_IDENT) + .setDispute(new Dispute() + .setRelatedOrganization("地方法院") + .setType(Dispute.Type.LAW)) + .addRemedy(new Remedy() + .setType(Remedy.Type.CORRECT)) + .addRemedy(new Remedy() + .setType(Remedy.Type.LAW)) + .addRemedy(new Remedy() + .setType(Remedy.Type.MONEY)) + .addStatement(new Statement() + .setConsequence("a1252c49-4188-4e6d-a32e-66604c664fba") + .addPurpose(new Purpose() + .setType(Purpose.Type.INDIVIDUAL_ANALYSIS) + .setDescription("本APP會è’集使用者心跳資訊,作為æŒçºŒè‡ªå‹•追蹤心率的技術,æä¾›æ•´æ—¥å¥åº·ç‹€æ³çš„æ·±å…¥åˆ†æžä»¥åŠé‹å‹•強度的資訊。")) + .addDatum(new Datum() + .setType(Datum.Type.HEALTH) + .setDescription("心跳資訊")) + .addRecipient(new Recipient() + .setEntity("å¥åº·ä¿ƒé€²ä¸å¿ƒ") + .setType(Recipient.Type.OURS)) + .setRetention(Retention.STATED_PURPOSE))); + public RecordModel(){ + + } + + public void addPrivacyPolicyReport(PrivacyPolicyReport privacyPolicyReport){ + privacyPolicyReports.add(privacyPolicyReport); + } + + public MutableLiveData<List<PrivacyPolicyReport>> getPrivacyPolicyReportsMLD() { + return privacyPolicyReportsMLD; + } + + public void fetchRecord() { + Callback<Object> callback = new Callback<Object>() { + @Override + public void onResponse(Call<Object> call, Response<Object> response) { + // TODO transfer response + addPrivacyPolicyReport(oxygenPrivacyPolicyReport); + privacyPolicyReportsMLD.setValue(privacyPolicyReports); + } + + @Override + public void onFailure(Call<Object> call, Throwable t) { + Log.e("fetchDevices - onFailure()", t.getMessage(), t); + } + }; + + Api.getApi().getRecord().enqueue(callback); + + } + +} diff --git a/app/src/main/java/com/example/zxa01/iotclient/home/record/view/RecordAdapter.java b/app/src/main/java/com/example/zxa01/iotclient/home/record/view/RecordAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..3f36004dc8ecd563ac7951c1304a1ec783d8f5d3 --- /dev/null +++ b/app/src/main/java/com/example/zxa01/iotclient/home/record/view/RecordAdapter.java @@ -0,0 +1,74 @@ +package com.example.zxa01.iotclient.home.record.view; + +import android.databinding.DataBindingUtil; +import android.databinding.ViewDataBinding; +import android.support.annotation.LayoutRes; +import android.support.annotation.NonNull; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.ViewGroup; +import com.example.zxa01.iotclient.BR; +import com.example.zxa01.iotclient.common.pojo.privacy.PrivacyPolicyReport; +import com.example.zxa01.iotclient.home.record.viewModel.RecordViewModel; + +import java.util.List; + +public class RecordAdapter extends RecyclerView.Adapter<RecordAdapter.MyViewHolder> { + + private int layoutId; + private List<PrivacyPolicyReport> privacyPolicyReports; + private RecordViewModel viewModel; + + public RecordAdapter(@LayoutRes int layoutId, RecordViewModel viewModel) { + this.layoutId = layoutId; + this.viewModel = viewModel; + } + + private int getLayoutIdForPosition(int position) { + return layoutId; + } + + @Override + public RecordAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new RecordAdapter.MyViewHolder(DataBindingUtil.inflate( + LayoutInflater.from(parent.getContext()), viewType, parent, false)); + } + + @Override + public void onBindViewHolder(RecordAdapter.MyViewHolder holder, int position) { + holder.bind(viewModel, position); + } + + @Override + public int getItemCount() { + return privacyPolicyReports == null ? 0 : privacyPolicyReports.size(); + } + + @Override + public int getItemViewType(int position) { + return getLayoutIdForPosition(position); + } + + public void setPrivacyPolicyReports(List<PrivacyPolicyReport> privacyPolicyReports) { + this.privacyPolicyReports = privacyPolicyReports; + } + + class MyViewHolder extends RecyclerView.ViewHolder { + + final ViewDataBinding binding; + + MyViewHolder(ViewDataBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } + + void bind(RecordViewModel viewModel, Integer position) { + viewModel.getPrivacyPolicyReportAt(position); + binding.setVariable(BR.viewModel, viewModel); + binding.setVariable(BR.position, position); + binding.executePendingBindings(); + } + + } + +} diff --git a/app/src/main/java/com/example/zxa01/iotclient/home/record/view/RecordFragment.java b/app/src/main/java/com/example/zxa01/iotclient/home/record/view/RecordFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..05ff1e493ffab04c22e572b48fc618be6d8e71e1 --- /dev/null +++ b/app/src/main/java/com/example/zxa01/iotclient/home/record/view/RecordFragment.java @@ -0,0 +1,59 @@ +package com.example.zxa01.iotclient.home.record.view; + +import android.content.Context; +import android.databinding.DataBindingUtil; +import android.net.Uri; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v7.widget.LinearLayoutManager; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.example.zxa01.iotclient.R; +import com.example.zxa01.iotclient.databinding.FragmentRecordBinding; +import com.example.zxa01.iotclient.home.record.viewModel.RecordViewModel; + +public class RecordFragment extends Fragment { + + + private FragmentRecordBinding binding; + private RecordViewModel viewModel; + + public RecordFragment() { + } + + public static RecordFragment newInstance(String param1, String param2) { + return new RecordFragment(); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_record, container, false); + viewModel = new RecordViewModel(binding.getRoot().getContext()); + binding.setViewModel(viewModel); + binding.recordRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); + init(); + return binding.getRoot(); + } + + @Override + public void onAttach(Context context) { + super.onAttach(context); + } + + @Override + public void onDetach() { + super.onDetach(); + } + + private void init() { + viewModel.refreshRecord(); + viewModel.observePrivacyPolicyReportsMLDD().observe(this, viewModel::setAdapter); + } + + public interface OnFragmentInteractionListener { + void onPrivacyFragment(Uri uri); + } +} diff --git a/app/src/main/java/com/example/zxa01/iotclient/home/record/viewModel/RecordViewModel.java b/app/src/main/java/com/example/zxa01/iotclient/home/record/viewModel/RecordViewModel.java new file mode 100644 index 0000000000000000000000000000000000000000..9a454dd1eb2ca485a8903dba6ebed9a6f4a5be0a --- /dev/null +++ b/app/src/main/java/com/example/zxa01/iotclient/home/record/viewModel/RecordViewModel.java @@ -0,0 +1,78 @@ +package com.example.zxa01.iotclient.home.record.viewModel; + +import android.arch.lifecycle.MutableLiveData; +import android.arch.lifecycle.ViewModel; +import android.content.Context; +import android.content.Intent; +import android.databinding.ObservableBoolean; + +import com.example.zxa01.iotclient.R; +import com.example.zxa01.iotclient.common.pojo.privacy.PrivacyPolicyReport; +import com.example.zxa01.iotclient.home.record.model.RecordModel; +import com.example.zxa01.iotclient.home.record.view.RecordAdapter; +import com.example.zxa01.iotclient.privacy.view.PrivacyActivity; + +import java.util.List; + +public class RecordViewModel extends ViewModel { + + public ObservableBoolean isLoading = new ObservableBoolean(true); + private RecordModel recordModel = new RecordModel(); + private RecordAdapter adapter = new RecordAdapter(R.layout.recycler_view_record, this); + private Context context; + + public RecordViewModel(Context context) { + this.context = context; + } + + /** + * model + */ + + public void refreshRecord() { + recordModel.fetchRecord(); + } + + public MutableLiveData<List<PrivacyPolicyReport>> observePrivacyPolicyReportsMLDD() { + return recordModel.getPrivacyPolicyReportsMLD(); + } + + /** + * child model + */ + + public PrivacyPolicyReport getPrivacyPolicyReportAt(Integer index) { + if (recordModel.getPrivacyPolicyReportsMLD().getValue() != null && + index != null && + recordModel.getPrivacyPolicyReportsMLD().getValue().size() > index) { + return recordModel.getPrivacyPolicyReportsMLD().getValue().get(index); + } + return null; + } + + public void onPrivacyPolicyReportClick(Integer index) { + if (recordModel.getPrivacyPolicyReportsMLD().getValue() != null && + index != null && + recordModel.getPrivacyPolicyReportsMLD().getValue().size() > index) { + // TODO detail of device + context.startActivity( + new Intent(context, PrivacyActivity.class) + .putExtra("index", index)); + } + } + + /** + * adapter + */ + + public RecordAdapter getAdapter() { + return adapter; + } + + public void setAdapter(List<PrivacyPolicyReport> privacyPolicyReports) { + this.isLoading.set(false); + this.adapter.setPrivacyPolicyReports(privacyPolicyReports); + this.adapter.notifyDataSetChanged(); + } + +} diff --git a/app/src/main/java/com/example/zxa01/iotclient/login/view/LoginActivity.java b/app/src/main/java/com/example/zxa01/iotclient/login/view/LoginActivity.java index 50bb61288935fb721770027839b061d5c1681a17..408c3b9b45e4d9ffbc45d29f41d44621a3a2d735 100644 --- a/app/src/main/java/com/example/zxa01/iotclient/login/view/LoginActivity.java +++ b/app/src/main/java/com/example/zxa01/iotclient/login/view/LoginActivity.java @@ -34,8 +34,7 @@ public class LoginActivity extends AppCompatActivity { } private void init() { - viewModel.isAuthorized().observe(this, - isAuthorized -> viewModel.checkAuthorized(isAuthorized)); + viewModel.isAuthorized().observe(this,viewModel::checkAuthorized); } } diff --git a/app/src/main/java/com/example/zxa01/iotclient/privacy/model/PrivacyModel.java b/app/src/main/java/com/example/zxa01/iotclient/privacy/model/PrivacyModel.java index adc946fdddab561a6728aeeaed78a663ea5b1b54..d74b8a5381c1a14455054991d49c5af529589bcc 100644 --- a/app/src/main/java/com/example/zxa01/iotclient/privacy/model/PrivacyModel.java +++ b/app/src/main/java/com/example/zxa01/iotclient/privacy/model/PrivacyModel.java @@ -3,6 +3,8 @@ package com.example.zxa01.iotclient.privacy.model; import android.arch.lifecycle.MutableLiveData; import android.databinding.BaseObservable; import android.util.Log; +import android.view.Gravity; +import android.widget.Toast; import com.example.zxa01.iotclient.common.http.Api; import com.example.zxa01.iotclient.common.pojo.device.Device; @@ -19,13 +21,15 @@ import com.example.zxa01.iotclient.common.pojo.privacy.p3p.Recipient; import com.example.zxa01.iotclient.common.pojo.privacy.p3p.Remedy; import com.example.zxa01.iotclient.common.pojo.privacy.p3p.Retention; import com.example.zxa01.iotclient.common.pojo.privacy.p3p.Statement; + import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; public class PrivacyModel extends BaseObservable { - private MutableLiveData<PrivacyPolicyReport> privacyPolicyReport; + private MutableLiveData<Boolean> isUploadMLD; + private MutableLiveData<PrivacyPolicyReport> privacyPolicyReportMLD; // fake p3p private Device oxygenDevice = new Device() @@ -105,11 +109,14 @@ public class PrivacyModel extends BaseObservable { .setRetention(Retention.STATED_PURPOSE))); public PrivacyModel() { - privacyPolicyReport = new MutableLiveData<>(); + privacyPolicyReportMLD = new MutableLiveData<>(); + privacyPolicyReportMLD.setValue(new PrivacyPolicyReport()); + isUploadMLD = new MutableLiveData<>(); + isUploadMLD.setValue(false); } - public MutableLiveData<PrivacyPolicyReport> getPrivacyPolicyReport() { - return privacyPolicyReport; + public MutableLiveData<PrivacyPolicyReport> getPrivacyPolicyReportMLD() { + return privacyPolicyReportMLD; } public void fetchPrivacyPolicyReport() { @@ -117,8 +124,7 @@ public class PrivacyModel extends BaseObservable { @Override public void onResponse(Call<Object> call, Response<Object> response) { // TODO transfer response - Log.i("Test", response.message()); - privacyPolicyReport.setValue(oxygenPrivacyPolicyReport); + privacyPolicyReportMLD.setValue(oxygenPrivacyPolicyReport); } @Override @@ -131,9 +137,26 @@ public class PrivacyModel extends BaseObservable { } + public MutableLiveData<Boolean> getIsUploadMLD() { + return isUploadMLD; + } + + public void updatePrivacyPolicyChoice(String privacyId, boolean consent) { + isUploadMLD.setValue(true); + Callback<Object> callback = new Callback<Object>() { + @Override + public void onResponse(Call<Object> call, Response<Object> response) { + // TODO transfer response + isUploadMLD.setValue(false); + } + + @Override + public void onFailure(Call<Object> call, Throwable t) { + Log.e("updatePrivacyPolicyChoice - onFailure()", t.getMessage(), t); + } + }; - public void updatePP(String privacyId,boolean consent) { - // TODO update å好 + Api.getApi().updatePrivacyPolicyChoice().enqueue(callback); } } diff --git a/app/src/main/java/com/example/zxa01/iotclient/privacy/view/PrivacyActivity.java b/app/src/main/java/com/example/zxa01/iotclient/privacy/view/PrivacyActivity.java index f81ada8dc2fb09cdb5a92279ac5f66c66833352d..4929c19c70e21384ca4d28ad66f296bfeda82150 100644 --- a/app/src/main/java/com/example/zxa01/iotclient/privacy/view/PrivacyActivity.java +++ b/app/src/main/java/com/example/zxa01/iotclient/privacy/view/PrivacyActivity.java @@ -1,6 +1,9 @@ package com.example.zxa01.iotclient.privacy.view; import android.databinding.DataBindingUtil; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentTransaction; +import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.MenuItem; @@ -8,6 +11,7 @@ import android.view.MenuItem; import com.example.zxa01.iotclient.R; import com.example.zxa01.iotclient.databinding.ActivityPrivacyBinding; import com.example.zxa01.iotclient.detail.viewModel.DetailViewModel; +import com.example.zxa01.iotclient.home.device.view.create.DeviceCreateFragment; import com.example.zxa01.iotclient.privacy.viewModel.PrivacyViewModel; public class PrivacyActivity extends AppCompatActivity { @@ -28,8 +32,8 @@ public class PrivacyActivity extends AppCompatActivity { private void init() { viewModel.fetchPrivacyPolicyReport(); - viewModel.getPrivacyPolicyReport().observe(this, - privacyPolicies -> viewModel.setAdapter(privacyPolicies.getPolicies())); + viewModel.observePrivacyPolicyReportMLD().observe(this, viewModel::setPrivacyPolicyReport); + viewModel.observeIsLoading().observe(this, viewModel::setIsUpload); } @Override @@ -39,4 +43,6 @@ public class PrivacyActivity extends AppCompatActivity { } return super.onOptionsItemSelected(item); } + + } diff --git a/app/src/main/java/com/example/zxa01/iotclient/privacy/view/PrivacyAdapter.java b/app/src/main/java/com/example/zxa01/iotclient/privacy/view/PrivacyAdapter.java index f4b2f192d180c40c20add736919ce989e1a3820c..675f261c8b42cfa09d73cf3aa5ae0879f168c6e4 100644 --- a/app/src/main/java/com/example/zxa01/iotclient/privacy/view/PrivacyAdapter.java +++ b/app/src/main/java/com/example/zxa01/iotclient/privacy/view/PrivacyAdapter.java @@ -52,7 +52,7 @@ public class PrivacyAdapter extends RecyclerView.Adapter<PrivacyAdapter.MyViewHo return getLayoutIdForPosition(position); } - public void setDevices(List<PrivacyPolicy> privacyPolicyList) { + public void setPrivacyPolicyList(List<PrivacyPolicy> privacyPolicyList) { this.privacyPolicyList = privacyPolicyList; } diff --git a/app/src/main/res/layout/activity_detail.xml b/app/src/main/res/layout/activity_detail.xml index 92d1a35f2d4e36af530cf43a1eeec3caa3fe7439..0330ca9ed597f23a5cb5f7e63ebc61394282b7c4 100644 --- a/app/src/main/res/layout/activity_detail.xml +++ b/app/src/main/res/layout/activity_detail.xml @@ -51,7 +51,7 @@ android:layout_width="@dimen/layout_width" android:layout_height="wrap_content" android:padding="@dimen/padding_sm" - android:text="éš±ç§æ”¿ç–" + android:text="@string/privacy_title" android:textAlignment="textEnd" android:textColor="@color/colorAccent" android:textSize="@dimen/font" @@ -62,20 +62,20 @@ style="@style/Widget.AppCompat.Button.Colored" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textSize="@dimen/font" + android:textSize="@dimen/font_sm" android:padding="@dimen/padding" android:onClick="@{()->viewModel.settingPrivacy()}" - android:text="å好è¨å®š" /> + android:text="@string/detail_preference_setting" /> <Button android:id="@+id/buttonPrivacyReport" style="@style/Widget.AppCompat.Button.Colored" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textSize="@dimen/font" + android:textSize="@dimen/font_sm" android:padding="@dimen/padding" android:onClick="@{()->viewModel.downloadPrivacyReport()}" - android:text="æª¢æ¸¬å ±å‘Šä¸‹è¼‰" /> + android:text="@string/detail_detect_report" /> </LinearLayout> diff --git a/app/src/main/res/layout/activity_privacy.xml b/app/src/main/res/layout/activity_privacy.xml index b2b25d292e7dc9c60fc0161229b6f99982cfdbc4..432388b8d31144061997d1e2ed08e77f4da1ad34 100644 --- a/app/src/main/res/layout/activity_privacy.xml +++ b/app/src/main/res/layout/activity_privacy.xml @@ -12,22 +12,38 @@ type="com.example.zxa01.iotclient.privacy.viewModel.PrivacyViewModel" /> </data> - <android.support.constraint.ConstraintLayout + <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/colorWhite" tools:context=".privacy.view.PrivacyActivity"> + <ProgressBar + android:id="@+id/progressBar" + style="@style/Widget.AppCompat.ProgressBar" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:secondaryProgress="40" + android:theme="@style/ProgressTheme" + android:visibility="@{viewModel.isLoading ? View.VISIBLE : View.GONE}" /> + <LinearLayout android:id="@+id/linearLayout" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="vertical"> + android:background="@color/colorWhite" + android:orientation="vertical" + android:visibility="@{viewModel.isLoading ? View.GONE : View.VISIBLE}" + tools:context=".privacy.view.PrivacyActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_margin="@dimen/margin_lg" + android:layout_marginLeft="@dimen/margin_lg" + android:layout_marginTop="@dimen/margin_lg" + android:layout_marginRight="@dimen/margin_lg" + android:layout_marginBottom="@dimen/margin" android:background="@drawable/border_bottom_xl" android:orientation="horizontal" android:padding="@dimen/padding_sm"> @@ -37,7 +53,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" - android:text="éš±ç§æ”¿ç–å ±å‘Š" + android:text="@string/title_privacy" android:textColor="@color/colorAccent" android:textSize="@dimen/font_lg" /> @@ -46,7 +62,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" - android:text="版本 1.0" + android:text='@{@string/privacy_version+" "+viewModel.privacyPolicyReport.version}' android:textAlignment="textEnd" /> </LinearLayout> @@ -55,11 +71,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="@dimen/margin_lg" - android:layout_marginTop="@dimen/margin_sm" android:layout_marginRight="@dimen/margin_lg" + android:paddingBottom="@dimen/margin" android:background="@drawable/border_bottom" - android:padding="@dimen/padding_sm" - android:text="æè¿°" /> + android:text="@{viewModel.privacyPolicyReport.description}" /> <TextView android:id="@+id/textViewDescription2" @@ -69,7 +84,7 @@ android:layout_marginTop="@dimen/margin_sm" android:layout_marginRight="@dimen/margin_lg" android:padding="@dimen/padding_sm" - android:text="我們會ä¾ç…§ä¸‹åˆ—æ”¿ç–æ”¶é›†ç›¸é—œè³‡æ–™" /> + android:text="@string/privacy_request" /> <android.support.v7.widget.RecyclerView android:id="@+id/privacy_recycler_view" @@ -82,5 +97,5 @@ </LinearLayout> - </android.support.constraint.ConstraintLayout> + </FrameLayout> </layout> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_create.xml b/app/src/main/res/layout/fragment_device_create.xml index 5ec3d68087326525c70aca13e949ca41b20abe81..3ba8b3bb696b63f01f335388bccb351d7cd377b6 100644 --- a/app/src/main/res/layout/fragment_device_create.xml +++ b/app/src/main/res/layout/fragment_device_create.xml @@ -25,7 +25,7 @@ android:background="@color/colorLighter" android:fontFamily="monospace" android:padding="@dimen/padding" - android:text="@string/title_device_create" + android:text="@string/create_title" android:textAlignment="center" android:textSize="@dimen/font" /> @@ -34,7 +34,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/margin_sm" - android:hint="@string/input_placeholder" + android:hint="@string/create_input_placeholder" android:padding="@dimen/padding_lg" /> diff --git a/app/src/main/res/layout/fragment_record.xml b/app/src/main/res/layout/fragment_record.xml index 5c81417f472abca44c9c7ca20d6899f636b3ac5b..e3f3c15a2aebd0597f22bdd0b9a69e1f7d7d3e78 100644 --- a/app/src/main/res/layout/fragment_record.xml +++ b/app/src/main/res/layout/fragment_record.xml @@ -1,13 +1,66 @@ <?xml version="1.0" encoding="utf-8"?> -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="match_parent" - tools:context=".home.record.RecordFragment"> +<layout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> - <TextView + <data> + + <import type="android.view.View" /> + + <variable + name="viewModel" + type="com.example.zxa01.iotclient.home.record.viewModel.RecordViewModel" /> + </data> + + <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" - android:text="records" /> + tools:context=".home.record.view.RecordFragment"> + + <ProgressBar + android:id="@+id/progressBar" + style="@style/Widget.AppCompat.ProgressBar" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:secondaryProgress="40" + android:theme="@style/ProgressTheme" + android:visibility="@{viewModel.isLoading ? View.VISIBLE : View.GONE}" /> + + + <LinearLayout + android:id="@+id/linearLayout" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@color/colorWhite" + android:orientation="vertical" + android:visibility="@{viewModel.isLoading ? View.GONE : View.VISIBLE}"> + + <TextView + android:id="@+id/textViewTitle" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingLeft="@dimen/padding" + android:paddingTop="@dimen/padding_lg" + android:paddingRight="@dimen/padding" + android:paddingBottom="@dimen/padding" + android:background="@drawable/border_bottom_xl" + android:text="@string/record_title" + android:textColor="@color/colorAccent" + android:textSize="@dimen/font_lg" + android:textStyle="bold" /> + + <android.support.v7.widget.RecyclerView + android:id="@+id/record_recycler_view" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:clipToPadding="false" + android:layout_marginTop="@dimen/margin" + app:setAdapter="@{viewModel.getAdapter()}" + tools:listitem="@layout/recycler_view_record" /> + + </LinearLayout> + -</FrameLayout> \ No newline at end of file + </FrameLayout> +</layout> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_setting.xml b/app/src/main/res/layout/fragment_setting.xml index fa8b7ea49f463c83d4ba177d1657be8f98c20404..479fcf87841ad320541d6a04bee44611ed7bbe75 100644 --- a/app/src/main/res/layout/fragment_setting.xml +++ b/app/src/main/res/layout/fragment_setting.xml @@ -10,4 +10,5 @@ android:layout_width="match_parent" android:layout_height="match_parent" tools:listitem="@layout/recycler_view_setting" /> + </FrameLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/recycler_view_privacy.xml b/app/src/main/res/layout/recycler_view_privacy.xml index 7df397c3bb53b27722f02827fc47bcb7c5edb0b8..f375c5d37b8e78e4c1c002f7893ea87fd1ca59df 100644 --- a/app/src/main/res/layout/recycler_view_privacy.xml +++ b/app/src/main/res/layout/recycler_view_privacy.xml @@ -1,7 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<layout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools"> +<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> @@ -21,7 +19,6 @@ android:layout_margin="@dimen/margin_sm" android:background="@drawable/shadow" android:elevation="2dp" - android:onClick="@{()->viewModel.onChangeClick(position)}" android:padding="@dimen/margin"> <LinearLayout @@ -29,6 +26,15 @@ android:layout_height="match_parent" android:orientation="vertical"> + <TextView + android:id="@+id/textViewTitle" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_weight="1" + android:text="@string/title_privacy" + android:textColor="@color/colorAccent" + android:textSize="@dimen/font_lg" /> + <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" @@ -38,7 +44,7 @@ android:id="@+id/textViewPrivacy" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="éš±ç§æ”¿ç– 1" + android:text='@{@string/privacy_title+" "+String.valueOf(position+1)}' android:textColor="@color/colorGray" android:textSize="@dimen/font" /> @@ -47,8 +53,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" - android:text="拒絕/åŒæ„ " - android:onClick="@{()->viewModel.onChangeClick(position)}" + android:onClick="@{(view)->viewModel.onChangeClick(position,view)}" + android:text="@string/privacy_content" android:textAlignment="textEnd" android:thumbTextPadding="@dimen/padding_lg" /> diff --git a/app/src/main/res/layout/recycler_view_record.xml b/app/src/main/res/layout/recycler_view_record.xml new file mode 100644 index 0000000000000000000000000000000000000000..77f865702dd22c274850c5b094e4b1fc213635a4 --- /dev/null +++ b/app/src/main/res/layout/recycler_view_record.xml @@ -0,0 +1,70 @@ +<?xml version="1.0" encoding="utf-8"?> +<layout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools"> + + <data> + + <variable + name="position" + type="java.lang.Integer" /> + + <variable + name="viewModel" + type="com.example.zxa01.iotclient.home.record.viewModel.RecordViewModel" /> + </data> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@drawable/border_bottom" + android:orientation="vertical" + android:onClick="@{()->viewModel.onPrivacyPolicyReportClick(position)}" + + android:padding="@dimen/margin"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="horizontal"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@{viewModel.getPrivacyPolicyReportAt(position).device.name}" + android:textColor="@color/colorLight" + android:textSize="18sp" + android:textStyle="bold" + tools:text="@tools:sample/lorem" /> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:paddingBottom="@dimen/padding_sm" + android:text='@{@string/privacy_version+" "+String.valueOf(position+1)}' + android:textSize="@dimen/font_sm" + tools:text="@tools:sample/lorem" /> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@{viewModel.getPrivacyPolicyReportAt(position).description}" + tools:text="@tools:sample/lorem" /> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text='2019.04.23' + tools:text="@tools:sample/lorem" /> + + </LinearLayout> + + </LinearLayout> + + </LinearLayout> + +</layout> \ No newline at end of file diff --git a/app/src/main/res/menu/navigation.xml b/app/src/main/res/menu/navigation.xml index 39c7f1f7337f15c8d5a3ebd9fbdbae5930f28e10..45e0dd2272ae361d048ab8084d64e0534ddf1031 100644 --- a/app/src/main/res/menu/navigation.xml +++ b/app/src/main/res/menu/navigation.xml @@ -9,7 +9,7 @@ <item android:id="@+id/navigation_privacy" android:icon="@drawable/ic_lock_outline_black_24dp" - android:title="@string/nav_privacy" /> + android:title="@string/nav_record" /> <item android:id="@+id/navigation_setting" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b506b19f34a5dff3f2920292ac4c7f240ea8be4d..36569a6bf3dad1259fb758d3e5330b431d695597 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2,22 +2,41 @@ <!--Title--> <string name="title_detail">è£ç½®è³‡è¨Š</string> - <string name="title_privacy">éš±ç§å好è¨å®š</string> + <string name="title_privacy">éš±ç§é¸æ“‡è¨å®š</string> <string name="title_setting">è¨å®š</string> - <string name="title_device_create">新增è£ç½®</string> <!--Home--> <string name="app_name">IOTClient</string> <string name="nav_device">Device</string> - <string name="nav_privacy">Privacy</string> + <string name="nav_record">Record</string> <string name="nav_setting">Setting</string> <!--Create--> - <string name="input_placeholder">請輸入è£ç½®çš„UDN</string> - <string name="button_qrcode">QRcode</string> - <string name="button_correct">新增</string> - <string name="button_cancel">返回</string> - <string name="qrcode_error">æ ¼å¼éŒ¯èª¤</string> + <string name="create_title">新增è£ç½®</string> + <string name="create_input_placeholder">請輸入è£ç½®çš„UDN</string> + <string name="create_button_qrcode">QRcode</string> + <string name="create_button_correct">新增</string> + <string name="create_button_cancel">返回</string> + <string name="create_qrcode_error">æ ¼å¼éŒ¯èª¤</string> + + + <!--Detail--> + <string name="detail_preference_setting">éš±ç§å好è¨å®š</string> + <string name="detail_detect_report">æª¢æ¸¬å ±å‘Šä¸‹è¼‰</string> + <string name="detail_report_download">下載ä¸...</string> + + <!--Privacy--> + <string name="privacy_report_title">éš±ç§æ”¿ç–å ±å‘Š</string> + <string name="privacy_version">版本</string> + <string name="privacy_request">我們會ä¾ç…§ä¸‹åˆ—æ”¿ç–æ”¶é›†ç›¸é—œè³‡æ–™</string> + <string name="privacy_title">éš±ç§æ”¿ç–</string> + <string name="privacy_content">拒絕/åŒæ„</string> + <string name="privacy_loading_title">éš±ç§é¸æ“‡å„²å˜ä¸</string> + <string name="privacy_loading_message">è«‹ç¨å¾Œ...</string> + + <!--Record--> + <string name="record_title">éš±ç§é¸æ“‡è¨˜éŒ„</string> + <string name="record_view">檢視</string> <!--Login-->