feat: 增加绘制辅助线功能

This commit is contained in:
xiaoyan 2023-03-17 13:55:52 +08:00
parent c5e4a216bc
commit 506299b3a3
13 changed files with 307 additions and 38 deletions

View File

@ -17,8 +17,8 @@ android {
applicationId "com.navinfo.outdoor"
minSdkVersion 24
targetSdkVersion 30
versionCode 47
versionName "8.230223"
versionCode 48
versionName "8.230309"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
ndk {

View File

@ -1,5 +1,6 @@
package com.navinfo.outdoor.activity;
import com.elvishew.xlog.XLog;
import com.github.lazylibrary.util.ShellUtils;
import com.google.gson.Gson;
import com.kongzue.dialog.interfaces.OnDialogButtonClickListener;
@ -34,12 +35,17 @@ import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.navinfo.outdoor.R;
@ -109,11 +115,13 @@ public class HomeActivity extends BaseActivity {
// 注册位置更新的lifeCycle
getLifecycle().addObserver(LocationLifeCycle.getInstance());
} else {
finish();
}
}
@Override
public void onStart() {
super.onStart();

View File

@ -6,6 +6,10 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.net.Uri;
import android.os.Build;
import android.os.CountDownTimer;
@ -19,6 +23,7 @@ import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.core.content.FileProvider;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.ProcessLifecycleOwner;
import com.elvishew.xlog.LogConfiguration;
@ -68,7 +73,6 @@ import java.util.List;
* 以及自启动 获取token 获取用户信息
*/
public class MainActivity extends BaseActivity {
private Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message msg) {

View File

@ -9,17 +9,13 @@ import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.Matrix;
import android.location.Location;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
@ -28,7 +24,6 @@ import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@ -43,16 +38,13 @@ import com.navinfo.outdoor.R;
import com.navinfo.outdoor.api.Constant;
import com.navinfo.outdoor.api.UserApplication;
import com.navinfo.outdoor.base.BaseActivity;
import com.navinfo.outdoor.room.PoiEntity;
import com.navinfo.outdoor.util.AWMp4ParserHelper;
import com.navinfo.outdoor.util.BackHandlerHelper;
import com.navinfo.outdoor.util.GPSUtils;
import com.navinfo.outdoor.util.Geohash;
import com.navinfo.outdoor.util.GeometryTools;
import com.navinfo.outdoor.util.Gps;
import com.navinfo.outdoor.util.LocationLifeCycle;
import com.navinfo.outdoor.util.MyLocation;
import com.navinfo.outdoor.util.MyTecentLocationSource;
import com.navinfo.outdoor.util.SensorOritationLifecycle;
import com.navinfo.outdoor.util.SystemTTS;
import com.navinfo.outdoor.util.TimestampUtil;
import com.navinfo.outdoor.util.ToastUtils;
@ -64,10 +56,8 @@ import com.otaliastudios.cameraview.FileCallback;
import com.otaliastudios.cameraview.PictureResult;
import com.otaliastudios.cameraview.controls.Mode;
import com.otaliastudios.cameraview.size.AspectRatio;
import com.otaliastudios.cameraview.size.Size;
import com.otaliastudios.cameraview.size.SizeSelector;
import com.otaliastudios.cameraview.size.SizeSelectors;
import com.tencent.map.geolocation.TencentLocation;
import com.tencent.tencentmap.mapsdk.maps.CameraUpdate;
import com.tencent.tencentmap.mapsdk.maps.CameraUpdateFactory;
import com.tencent.tencentmap.mapsdk.maps.TencentMap;
@ -92,26 +82,19 @@ import org.locationtech.jts.geom.MultiLineString;
import com.wanghong.webpnative.WebPNative;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import static com.tencent.tencentmap.mapsdk.maps.model.MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE;
import static com.tencent.tencentmap.mapsdk.maps.model.MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
@ -119,8 +102,6 @@ import io.reactivex.ObservableOnSubscribe;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Action;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;
/**
@ -159,6 +140,8 @@ public class PicturesActivity extends BaseActivity implements View.OnClickListen
private static int BRIGHTNESS=40, FRAMENESS=30;
@SuppressLint("SimpleDateFormat")
private SimpleDateFormat formatter;
private SensorOritationLifecycle sensorOritationLifecycle;
private TextView tvDegrees;
private Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(@NonNull Message msg) {
@ -194,6 +177,14 @@ public class PicturesActivity extends BaseActivity implements View.OnClickListen
// 设置当前界面亮度为40%
setWindowBrightness(BRIGHTNESS);
LocationLifeCycle.getInstance().startGPSLocation();
sensorOritationLifecycle = new SensorOritationLifecycle(this);
getLifecycle().addObserver(sensorOritationLifecycle);
sensorOritationLifecycle.setDegreesChangeListener(new SensorOritationLifecycle.DegreesChangeListener() {
@Override
public void onDegreesChangeListener(float xDegree, float yDegree, float zDegree) {
tvDegrees.setText("x:"+xDegree+"\ny:"+yDegree+"\nz:"+zDegree);
}
});
}
@Override
@ -206,6 +197,7 @@ public class PicturesActivity extends BaseActivity implements View.OnClickListen
@Override
protected void initView() {
super.initView();
tvDegrees = findViewById(R.id.tv_degrees);
if (getIntent() != null) {
finalVideoPath = getIntent().getStringExtra(Constant.INTENT_JPG_PATH);
type = getIntent().getIntExtra(Constant.INTENT_TYPE, 0);
@ -914,6 +906,9 @@ public class PicturesActivity extends BaseActivity implements View.OnClickListen
// 退出后切换主定位模式为腾讯定位
LocationLifeCycle.getInstance().setMainLocationFrom(LocationLifeCycle.LOCATION_FROM.TENCENT);
LocationLifeCycle.getInstance().stopGPSLocation();
if (sensorOritationLifecycle!=null) {
getLifecycle().removeObserver(sensorOritationLifecycle);
}
}
// @Subscribe(threadMode = ThreadMode.MAIN)

View File

@ -0,0 +1,42 @@
package com.navinfo.outdoor.activity
import android.os.Bundle
import android.view.View
import android.view.View.OnClickListener
import androidx.lifecycle.ViewModelProvider
import com.navinfo.outdoor.base.BaseViewBindingActivity
import com.navinfo.outdoor.databinding.ActivityPicturesBinding
import com.navinfo.outdoor.util.LocationLifeCycle
import com.navinfo.outdoor.util.SensorOritationLifecycle
import com.navinfo.outdoor.util.SensorOritationLifecycle.DegreesChangeListener
import com.navinfo.outdoor.viewmodel.RxPicturesViewModel
class RXPicturesActivity: BaseViewBindingActivity(), OnClickListener {
private lateinit var binding: ActivityPicturesBinding
private lateinit var viewModel: RxPicturesViewModel
private val sensorOritationLifecycle: SensorOritationLifecycle by lazy { SensorOritationLifecycle(this) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityPicturesBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.camera.snapshotMaxWidth = 1920
binding.camera.snapshotMaxHeight = 1440
binding.camera.setOnClickListener(this)
viewModel = ViewModelProvider(this).get(RxPicturesViewModel::class.java)
LocationLifeCycle.getInstance().startGPSLocation()
lifecycle.addObserver(sensorOritationLifecycle)
sensorOritationLifecycle.degreesChangeListener = object : DegreesChangeListener {
override fun onDegreesChangeListener(xDegree: Float, yDegree: Float, zDegree: Float) {
binding.tvDegrees.text = "x:$xDegree\ny:$yDegree\nz:$zDegree"
}
}
}
override fun onClick(p0: View?) {
}
}

View File

@ -0,0 +1,84 @@
package com.navinfo.outdoor.base
import android.content.DialogInterface
import android.content.Intent
import android.graphics.drawable.ColorDrawable
import android.os.Bundle
import android.provider.Settings
import android.view.KeyEvent
import android.view.LayoutInflater
import android.view.View
import android.widget.TextView
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import com.github.lazylibrary.util.StringUtils
import com.gyf.immersionbar.ImmersionBar
import com.navinfo.outdoor.R
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
open class BaseViewBindingActivity: AppCompatActivity() {
private var alertDialog: AlertDialog? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// setScreenRoate(true);
//初始化,默认透明状态栏和黑色导航栏
ImmersionBar.with(this).init()
Collector.addActivity(this)
if (!EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().register(this)
}
}
fun showLoadingDialog() {
showLoadingDialog(null)
}
fun showLoadingDialog(msg: String?) {
alertDialog?.dismiss()
alertDialog = AlertDialog.Builder(this).create()
alertDialog!!.window?.setBackgroundDrawable(ColorDrawable())
alertDialog!!.setCancelable(false)
alertDialog!!.setOnKeyListener(DialogInterface.OnKeyListener { dialog: DialogInterface?, keyCode: Int, event: KeyEvent? -> keyCode == KeyEvent.KEYCODE_SEARCH || keyCode == KeyEvent.KEYCODE_BACK })
//loading样式
val view: View = LayoutInflater.from(this).inflate(R.layout.loading, null)
val tv = view.findViewById<TextView>(R.id.progressBar_tx)
if (!StringUtils.isBlank(msg)) {
tv.text = msg
}
alertDialog!!.setView(view)
alertDialog!!.setCanceledOnTouchOutside(false)
alertDialog!!.show()
}
fun setLoadingDialogText(s: String?) {
//给loading 添加文字
val view = alertDialog!!.findViewById<TextView>(R.id.progressBar_tx)
view!!.text = s
}
fun dismissLoadingDialog() {
if (null != alertDialog && alertDialog!!.isShowing()) {
alertDialog!!.dismiss()
}
}
override fun onDestroy() {
super.onDestroy()
dismissLoadingDialog()
Collector.removeActivity(this)
if (EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().unregister(this)
}
}
@Subscribe(sticky = true)
open fun onEventMainThrean(data: Map<String?, String>) {
if (data["code"] === "101") {
// 返回开启GPS导航设置界面
val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
startActivityForResult(intent, 0)
}
}
}

View File

@ -24,7 +24,6 @@ import androidx.core.widget.NestedScrollView;
import com.bumptech.glide.Glide;
import com.github.lazylibrary.util.FileUtils;
import com.github.lazylibrary.util.StringUtils;
import com.github.lazylibrary.util.ZipUtil;
import com.google.gson.Gson;
import com.hjq.permissions.OnPermissionCallback;
import com.hjq.permissions.Permission;
@ -40,7 +39,6 @@ import com.navinfo.outdoor.activity.FragmentManagement;
import com.navinfo.outdoor.activity.PicturesActivity;
import com.navinfo.outdoor.api.Constant;
import com.navinfo.outdoor.base.BaseDrawerFragment;
import com.navinfo.outdoor.bean.OtherUploadPicBean;
import com.navinfo.outdoor.bean.PoiVideoBean;
import com.navinfo.outdoor.bean.UnPolygonTaskBean;
import com.navinfo.outdoor.http.Callback;
@ -48,7 +46,6 @@ import com.navinfo.outdoor.http.HttpInterface;
import com.navinfo.outdoor.http.OkGoBuilder;
import com.navinfo.outdoor.room.ChargingPileEntity;
import com.navinfo.outdoor.room.InsertAndUpdateUtils;
import com.navinfo.outdoor.room.PoiDao;
import com.navinfo.outdoor.room.PoiDatabase;
import com.navinfo.outdoor.room.PoiEntity;
import com.navinfo.outdoor.util.AWMp4ParserHelper;
@ -61,8 +58,6 @@ import com.navinfo.outdoor.util.PoiSaveUtils;
import com.navinfo.outdoor.util.PreserveUtils;
import com.navinfo.outdoor.util.TimestampUtil;
import com.navinfo.outdoor.util.ToastUtils;
import com.navinfo.outdoor.util.UploadUtils;
import com.navinfo.outdoor.util.ZipUtils;
import com.sothree.slidinguppanel.SlidingUpPanelLayout;
import com.tencent.tencentmap.mapsdk.maps.model.BitmapDescriptor;
import com.tencent.tencentmap.mapsdk.maps.model.BitmapDescriptorFactory;
@ -80,7 +75,6 @@ import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
* 寻宝-上报弹窗-poi录像

View File

@ -26,7 +26,6 @@ import androidx.core.widget.NestedScrollView;
import com.bumptech.glide.Glide;
import com.github.lazylibrary.util.FileUtils;
import com.github.lazylibrary.util.StringUtils;
import com.github.lazylibrary.util.ZipUtil;
import com.google.gson.Gson;
import com.hjq.permissions.OnPermissionCallback;
import com.hjq.permissions.Permission;
@ -34,12 +33,10 @@ import com.hjq.permissions.XXPermissions;
import com.kongzue.dialog.interfaces.OnDialogButtonClickListener;
import com.kongzue.dialog.util.BaseDialog;
import com.kongzue.dialog.util.DialogSettings;
import com.kongzue.dialog.v3.CustomDialog;
import com.kongzue.dialog.v3.MessageDialog;
import com.kongzue.dialog.v3.WaitDialog;
import com.lzy.okgo.model.HttpParams;
import com.navinfo.outdoor.R;
import com.navinfo.outdoor.activity.AutoTakePictureActivity;
import com.navinfo.outdoor.activity.FragmentManagement;
import com.navinfo.outdoor.activity.PicturesActivity;
import com.navinfo.outdoor.api.Constant;
@ -51,8 +48,6 @@ import com.navinfo.outdoor.util.PoiSaveUtils;
import com.navinfo.outdoor.util.PreserveUtils;
import com.navinfo.outdoor.util.TimestampUtil;
import com.navinfo.outdoor.util.ToastUtils;
import com.navinfo.outdoor.util.UploadUtils;
import com.navinfo.outdoor.bean.OtherUploadPicBean;
import com.navinfo.outdoor.bean.RoadSaveBean;
import com.navinfo.outdoor.bean.UnPolygonTaskBean;
import com.navinfo.outdoor.http.Callback;
@ -60,13 +55,11 @@ import com.navinfo.outdoor.http.HttpInterface;
import com.navinfo.outdoor.http.OkGoBuilder;
import com.navinfo.outdoor.room.ChargingPileEntity;
import com.navinfo.outdoor.room.InsertAndUpdateUtils;
import com.navinfo.outdoor.room.PoiDao;
import com.navinfo.outdoor.room.PoiDatabase;
import com.navinfo.outdoor.room.PoiEntity;
import com.navinfo.outdoor.util.AWMp4ParserHelper;
import com.navinfo.outdoor.util.Geohash;
import com.navinfo.outdoor.util.GeometryTools;
import com.navinfo.outdoor.util.ZipUtils;
import com.sothree.slidinguppanel.SlidingUpPanelLayout;
import com.tencent.tencentmap.mapsdk.maps.model.BitmapDescriptor;
import com.tencent.tencentmap.mapsdk.maps.model.BitmapDescriptorFactory;
@ -85,7 +78,6 @@ import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/*
* 寻宝-点击上传弹窗-道路

View File

@ -3,6 +3,7 @@ package com.navinfo.outdoor.util;
import android.content.Context;
import android.location.Location;
import android.os.Message;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.lifecycle.DefaultLifecycleObserver;
@ -90,6 +91,11 @@ public class LocationLifeCycle implements DefaultLifecycleObserver {
}
} else if (msg.arg1 == LOCATION_FROM.TENCENT.ordinal()) {
tencentLocation = (TencentLocation) msg.obj;
// Log.d("LocationLifeCycle",
// "isMockGps:"+tencentLocation.isMockGps()
// +",FakeReason:"+tencentLocation.getFakeReason()
// +"Provider:"+tencentLocation.getProvider()
// +"SourceProvider:"+tencentLocation.getSourceProvider()+tencentLocation.getGpsQuality());
if (msg.arg1 == mainLocationFrom.ordinal()) { // 如果当前定位方式是主要定位方式
MyLocation location = new MyLocation(tencentLocation.getProvider(), tencentLocation);
//设置经纬度以及精度

View File

@ -0,0 +1,90 @@
package com.navinfo.outdoor.util
import android.content.Context
import android.hardware.Sensor
import android.hardware.SensorEvent
import android.hardware.SensorEventListener
import android.hardware.SensorManager
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
class SensorOritationLifecycle(val context: Context): DefaultLifecycleObserver {
private var sensorManager: SensorManager? = null
private var accelerometer: Sensor? = null
private var magnetic :android.hardware.Sensor? = null
private var seneorListener: SensorEventListener? = null
private var accelerometerValues = FloatArray(3)
private var magneticFieldValues = FloatArray(3)
var zDegree: Float = 0f
var xDegree: Float = 0f
var yDegree: Float = 0f
var degreesChangeListener: DegreesChangeListener? = null
override fun onCreate(owner: LifecycleOwner) {
super.onCreate(owner)
/**
* 初始化传感器
* */
/**
* 初始化传感器
*/
seneorListener = object : SensorEventListener {
override fun onSensorChanged(sensorEvent: SensorEvent) {
// 获取角度信息
if (sensorEvent.sensor.type == Sensor.TYPE_ACCELEROMETER) {
accelerometerValues = sensorEvent.values
}
if (sensorEvent.sensor.type == Sensor.TYPE_MAGNETIC_FIELD) {
magneticFieldValues = sensorEvent.values
}
calculateOrientation()
}
override fun onAccuracyChanged(sensor: Sensor, i: Int) {}
}
sensorManager = context.getSystemService(Context.SENSOR_SERVICE) as SensorManager
if (sensorManager!=null) {
with(sensorManager!!) {
accelerometer = getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
magnetic = getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD)
registerListener(
seneorListener,
accelerometer,
SensorManager.SENSOR_DELAY_NORMAL
)
registerListener(
seneorListener,
magnetic,
SensorManager.SENSOR_DELAY_NORMAL
)
}
}
}
override fun onDestroy(owner: LifecycleOwner) {
super.onDestroy(owner)
if (sensorManager != null) {
sensorManager!!.unregisterListener(seneorListener)
}
}
// 计算方向
private fun calculateOrientation() {
val values = FloatArray(3)
val R = FloatArray(9)
SensorManager.getRotationMatrix(
R, null, accelerometerValues,
magneticFieldValues
)
SensorManager.getOrientation(R, values)
zDegree = Math.toDegrees(values[0].toDouble()).toFloat()
xDegree = Math.toDegrees(values[1].toDouble()).toFloat()
yDegree = Math.toDegrees(values[2].toDouble()).toFloat()
degreesChangeListener?.onDegreesChangeListener(xDegree, yDegree, zDegree)
}
interface DegreesChangeListener {
fun onDegreesChangeListener(xDegree: Float, yDegree: Float, zDegree: Float)
}
}

View File

@ -0,0 +1,42 @@
package com.navinfo.outdoor.viewmodel
import android.content.Intent
import androidx.lifecycle.ViewModel
import com.navinfo.outdoor.api.Constant
import com.tencent.tencentmap.mapsdk.maps.interfaces.Removable
import java.io.File
import java.util.*
class RxPicturesViewModel: ViewModel() {
private var finalVideoPath: String? = null// 摄像后最终保存的文件名
private var geoWkt:String? = null
private var detail:String? = null
private var type = 0
private val radioPicture = 0
private var videoIndex = -1
private var paperFile: File? = null
private var logFile:java.io.File? = null
private val removables = mutableListOf<Removable>()
private fun initDataFromIntent(intent: Intent): Boolean {
if (intent != null) {
finalVideoPath = intent.getStringExtra(Constant.INTENT_JPG_PATH)
type = intent.getIntExtra(Constant.INTENT_TYPE, 0)
geoWkt = intent.getStringExtra(Constant.INTENT_GEO_WKT)
detail = intent.getStringExtra(Constant.INTENT_DETAIL)
if (finalVideoPath != null) {
val file: File = File(finalVideoPath)
paperFile =
File(Objects.requireNonNull(file.parentFile).absoluteFile.toString() + "/" + "paper.txt")
videoIndex = file.name.replace(".webp", "").toInt()
if (videoIndex == 0) {
videoIndex = -1
} else {
videoIndex = videoIndex - 1
}
}
return true
}
return false
}
}

View File

@ -31,4 +31,10 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<TextView
android:id="@+id/tv_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="@id/tab_layout"></TextView>
</androidx.constraintlayout.widget.ConstraintLayout >

View File

@ -275,5 +275,11 @@
app:layout_constraintBottom_toBottomOf="@id/capture_picture"
app:layout_constraintLeft_toRightOf="@id/capture_picture"
app:layout_constraintRight_toRightOf="parent" />
<TextView
android:id="@+id/tv_degrees"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
></TextView>
</androidx.constraintlayout.widget.ConstraintLayout>