新增云台控制按钮

yt_mpremote
liuguijing 3 months ago
parent 5bb02cd10d
commit 3fedd401eb

@ -3,6 +3,7 @@ package com.xypower.mpremote;
public class Constants {
public static final String PACKAGE_NAME_MP = "com.xypower.mpapp";
public static final String PACKAGE_NAME_MPMASTER = "com.xypower.mpmaster";
public static final String REMOTE_PATH_ROOT = "/sdcard/" + PACKAGE_NAME_MP + "/";
public static final String REMOTE_PATH_DATA = REMOTE_PATH_ROOT + "data/";
public static final String REMOTE_PATH_DATA_CHANNELS = REMOTE_PATH_ROOT + "data/channels/";
@ -22,6 +23,7 @@ public class Constants {
public static final String KEY_GSM_VENDOR_NAME = "gsm.operator.alpha";
public static final String KEY_APP_MP_VERSION = "mpapp.version";
public static final String KEY_APP_MPMASTER_VERSION = "mpmaster.version";
public static final String KEY_PREFIX_GLOBAL_SETTING = "settings.global.";

@ -1,16 +1,19 @@
package com.xypower.mpremote;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.res.Resources;
import android.database.Cursor;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.text.Html;
import android.text.TextUtils;
import android.util.Base64;
@ -21,7 +24,10 @@ import android.widget.Toast;
import com.xypower.common.FilesUtils;
import com.xypower.common.JSONUtils;
import com.xypower.common.MicroPhotoContext;
import com.xypower.mpremote.adapter.ItemAdapter;
import com.xypower.mpremote.bean.ChannelBean;
import com.xypower.mpremote.databinding.ActivityDeviceBinding;
import com.xypower.mpremote.interfaces.OnItemClickListener;
import com.xypower.mpremote.utils.AdbUtils;
import com.xypower.mpremote.utils.AlertDialogUtils;
import com.xypower.mpremote.utils.FileUtils;
@ -41,14 +47,14 @@ import java.util.Map;
import dadb.AdbShellResponse;
import dadb.Dadb;
public class DeviceActivity extends AppCompatActivity implements View.OnClickListener {
public class DeviceActivity extends AppCompatActivity implements View.OnClickListener, OnItemClickListener {
private static final String TAG = "ADB";
public static final int RSSI_LEVELS = 5;
private ActivityDeviceBinding binding;
private Handler mHandler = new Handler();
private Handler mHandler;
private String mCmdId;
private Map<String, String> mProps = new HashMap<>();
private Map<String, String> mProps = new HashMap<>();//存储从设备端获取的设备信息
private Map<Integer, JSONObject> mChannelCfgs = new HashMap();
private String mSerialNo = "";
private MicroPhotoContext.AppConfig mAppConfig = new MicroPhotoContext.AppConfig();
@ -59,6 +65,11 @@ public class DeviceActivity extends AppCompatActivity implements View.OnClickLis
private String configPath;//存放App配置文件
private String tmp;//存放配置文件的目录
private AlertDialog alertDialog;
private ItemAdapter photoitemAdapter;
private ArrayList<ChannelBean> channelList = new ArrayList<>();//用于存放通道信息
private ItemAdapter videoitemAdapter;
private static final int photoAdapter = 1;
private static final int videoAdapter = 2;
@Override
protected void onCreate(Bundle savedInstanceState) {
@ -67,15 +78,49 @@ public class DeviceActivity extends AppCompatActivity implements View.OnClickLis
setContentView(binding.getRoot());
initData();
initView();
initHandler();
initEvent();
}
private void initHandler() {
mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
switch (msg.what) {
case 1:
AlertDialogUtils.dismiss(alertDialog);
showAppInfo();
break;
case 2:
Toast.makeText(DeviceActivity.this, R.string.err_dev_failed_to_connect, Toast.LENGTH_LONG).show();
break;
case 3:
updateRecycleView(channelList);
break;
}
}
};
}
private void initEvent() {
//加载设备信息
loadDeviceInfo( true);
loadDeviceInfo(true);
}
private void initView() {
photoitemAdapter = new ItemAdapter();
photoitemAdapter.setAdapterType(photoAdapter);
photoitemAdapter.setOnClickListener(this);
binding.recyclerViewPhoto.setAdapter(photoitemAdapter);
binding.recyclerViewPhoto.setLayoutManager(new GridLayoutManager(this, 3));
videoitemAdapter = new ItemAdapter();
videoitemAdapter.setAdapterType(videoAdapter);
videoitemAdapter.setOnClickListener(this);
binding.recyclerViewVideo.setAdapter(videoitemAdapter);
binding.recyclerViewVideo.setLayoutManager(new GridLayoutManager(this, 3));
binding.ytControl.setOnClickListener(this);
binding.takePhoto1.setOnClickListener(this);
binding.takePhoto2.setOnClickListener(this);
binding.takePhoto3.setOnClickListener(this);
@ -94,6 +139,8 @@ public class DeviceActivity extends AppCompatActivity implements View.OnClickLis
//获取配置文件在本机的存储路径
tmp = FileUtils.join(getFilesDir(), "tmp");
configPath = FileUtils.join(tmp, "App.json");
}
@Override
@ -114,25 +161,15 @@ public class DeviceActivity extends AppCompatActivity implements View.OnClickLis
} catch (Exception ex) {
ex.printStackTrace();
}
mHandler.post(new Runnable() {
@Override
public void run() {
alertDialog.dismiss();
showAppInfo();
}
});
mHandler.sendMessage(mHandler.obtainMessage(1));
}
}).start();
}
private void runImpl() {
Dadb adb = AdbManager.getAdb(mDeviceIp, AdbUtils.DEFAULT_ADB_PORT);
if (adb == null) {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
Toast.makeText(DeviceActivity.this, R.string.err_dev_failed_to_connect, Toast.LENGTH_LONG).show();
}
}, 100);
mHandler.sendMessage(mHandler.obtainMessage(2));
return;
}
boolean res = false;
@ -145,23 +182,13 @@ public class DeviceActivity extends AppCompatActivity implements View.OnClickLis
if (appConfig != null) {
mAppConfig = appConfig;
}
DeviceActivity.this.mHandler.post(new Runnable() {
@Override
public void run() {
DeviceActivity.this.showAppInfo();
}
});
}
final int numberOfChannels = (mAppConfig != null) ? mAppConfig.channels : 0;
mHandler.post(new Runnable() {
@Override
public void run() {
updateButtons(numberOfChannels);
}
});
mChannelCfgs.clear();
if (mAppConfig != null && mAppConfig.channels > 0) {
for (int channel = 1; channel <= mAppConfig.channels; channel++) {
ChannelBean channelBean = new ChannelBean();
channelBean.setChannel(channel);
channelBean.setChannelname("通道" + channel);
String remoteFilePath = Constants.REMOTE_PATH_DATA_CHANNELS + Integer.toString(channel) + ".json";
String join = FileUtils.join(tmp, Integer.toString(channel) + ".json");
File channelfile = FileUtils.getFile(join);
@ -170,11 +197,15 @@ public class DeviceActivity extends AppCompatActivity implements View.OnClickLis
JSONObject channelJson = JSONUtils.loadJson(channelfile.getAbsolutePath());
if (channelJson != null) {
mChannelCfgs.put(new Integer(channel), channelJson);
channelBean.setJsonObject(channelJson);
}
channelfile.delete();
}
channelList.add(channelBean);
}
mHandler.sendMessage(mHandler.obtainMessage(3));
}
AdbShellResponse adbShellResponse = null;
try {
adbShellResponse = adb.shell("settings list global");
@ -210,7 +241,7 @@ public class DeviceActivity extends AppCompatActivity implements View.OnClickLis
}
}
if (mProps.containsKey(Constants.KEY_RO_SERIALNO)) {
mSerialNo = (String)mProps.get(Constants.KEY_RO_SERIALNO);
mSerialNo = (String) mProps.get(Constants.KEY_RO_SERIALNO);
}
// adb shell pm dump com.xypower.mpremote | grep "versionName"
adbShellResponse = null;
@ -230,6 +261,23 @@ public class DeviceActivity extends AppCompatActivity implements View.OnClickLis
}
}
}
adbShellResponse = null;
try {
adbShellResponse = adb.shell("pm dump " + Constants.PACKAGE_NAME_MPMASTER + " | grep \"versionName\"");
} catch (Exception ex) {
ex.printStackTrace();
}
if (adbShellResponse.getExitCode() == 0) {
String[] lines = FilesUtils.splitLines(adbShellResponse.getAllOutput());
for (String line : lines) {
int pos = line.indexOf("versionName=");
if (pos != -1) {
String val = line.substring(pos + 12);
mProps.put(Constants.KEY_APP_MPMASTER_VERSION, val);
break;
}
}
}
String cmd = "content query --uri content://com.xypower.mpapp.provider/queryBatVol";
adbShellResponse = null;
try {
@ -252,6 +300,12 @@ public class DeviceActivity extends AppCompatActivity implements View.OnClickLis
}
}
}
private void updateRecycleView(ArrayList<ChannelBean> mChannelCfgs) {
photoitemAdapter.setItemList(mChannelCfgs);
videoitemAdapter.setItemList(mChannelCfgs);
}
protected boolean pullFile(Dadb adb, String remoteFilePath, File localFilePath) {
if (localFilePath.exists()) {
localFilePath.delete();
@ -266,58 +320,41 @@ public class DeviceActivity extends AppCompatActivity implements View.OnClickLis
return res && localFilePath.exists();
}
protected void takePhotoImpl(final String cmd, final int channel, final int preset, final String localFileName, final String remoteFilePath, final boolean photoOrVideo, long sleepTime) {
protected void takePhotoImpl(final String cmd, final String localFileName, final String remoteFilePath, final boolean photoOrVideo, long sleepTime) {
Thread th = new Thread(new Runnable() {
@Override
public void run() {
Dadb adb = null;
try {
Log.i(TAG, "Start connecting " + mDeviceIp);
adb = AdbManager.getAdb(mDeviceIp, AdbUtils.DEFAULT_ADB_PORT);
Log.i(TAG, "Finish connecting " + mDeviceIp);
if (adb == null) {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
Toast.makeText(DeviceActivity.this, R.string.err_dev_failed_to_connect, Toast.LENGTH_LONG).show();
}
}, 100);
mHandler.sendMessage(mHandler.obtainMessage(2));
return;
}
AdbShellResponse adbShellResponse = null;
try {
adbShellResponse = adb.shell(cmd);
} catch (Exception ex) {
ex.printStackTrace();
}
if (adbShellResponse != null) {
if (adbShellResponse.getExitCode() == 0) {
if (sleepTime > 0) {
try {
Thread.sleep(sleepTime);
} catch (Exception ex) {
}
}
File localDevicePath = new File(getFilesDir(), "Photos" + File.separator + mSerialNo);
if (!localDevicePath.exists()) {
localDevicePath.mkdirs();
}
final File localFilePath = new File(localDevicePath, localFileName);
for (int idx = 0; idx < 10; idx++) {
boolean res = pullFile(adb, remoteFilePath, localFilePath);
if (res) {
mHandler.post(new Runnable() {
@Override
public void run() {
@ -330,29 +367,24 @@ public class DeviceActivity extends AppCompatActivity implements View.OnClickLis
});
break;
}
try {
Thread.sleep(1000);
} catch (Exception ex) {
ex.printStackTrace();
}
}
try {
// mAdb.shell("rm " + remoteFilePath);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
});
th.start();
}
@ -390,7 +422,7 @@ public class DeviceActivity extends AppCompatActivity implements View.OnClickLis
+ Integer.toString(channel) + " --bind preset:i:" + Integer.toString(preset) + " --bind leftTopOsd:s:" + Base64.encodeToString(leftTopOsdBytes, Base64.DEFAULT | Base64.NO_WRAP) + "";
// adbShellResponse = null;
takePhotoImpl(cmd, channel, preset, fileName, remoteFilePath, photoOrVideo, 0);
takePhotoImpl(cmd, fileName, remoteFilePath, photoOrVideo, 0);
return 0;
}
@ -557,42 +589,44 @@ public class DeviceActivity extends AppCompatActivity implements View.OnClickLis
private void showAppInfo() {
// 视频浏览,拍照,设备信息及状态查询(编号版本双SIM卡状态电池及太阳能电压等),可以参考东视
Resources resources = getResources();
// String buildTime = BuildConfig.BUILD_
// Date date = new Date(BuildConfig.BUILD_TIMESTAMP);
// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
String title = resources.getString(R.string.app_name);
if (mAppConfig != null && !TextUtils.isEmpty(mAppConfig.cmdid)) {
title = mAppConfig.cmdid;
}
StringBuilder stringBuilder = new StringBuilder();
ConnectivityManager mConnectivityManager;
if (mProps.containsKey(Constants.KEY_RO_SERIALNO)) {
String val = (String)mProps.get(Constants.KEY_RO_SERIALNO);
String val = (String) mProps.get(Constants.KEY_RO_SERIALNO);
appendKeyValue(stringBuilder, "序列号", val, true);
}
if (mProps.containsKey(Constants.KEY_RO_CUSTOM_OTA_VERSION)) {
String val = (String)mProps.get(Constants.KEY_RO_CUSTOM_OTA_VERSION);
String val = (String) mProps.get(Constants.KEY_RO_CUSTOM_OTA_VERSION);
appendKeyValue(stringBuilder, "系统版本", val, true);
}
appendKeyValue(stringBuilder, "CMDID", mAppConfig.cmdid, true);
appendKeyValue(stringBuilder, "主站", (TextUtils.isEmpty(mAppConfig.server) ? "" : mAppConfig.server) + ":" + Integer.toString(mAppConfig.port));
appendKeyValue(stringBuilder, "通道数", Integer.toString(mAppConfig.channels));
if (mProps.containsKey(Constants.KEY_APP_MP_VERSION)) {
String val = (String) mProps.get(Constants.KEY_APP_MP_VERSION);
appendKeyValue(stringBuilder, "MpAPP版本", val);
}
if (mProps.containsKey(Constants.KEY_APP_MPMASTER_VERSION)) {
String val = (String) mProps.get(Constants.KEY_APP_MPMASTER_VERSION);
appendKeyValue(stringBuilder, "MpMaster版本", val);
}
String vendorName = "";
if (mProps.containsKey(Constants.KEY_GSM_VENDOR_NAME)) {
vendorName = mProps.get(Constants.KEY_GSM_VENDOR_NAME);
}
appendKeyValue(stringBuilder, "移动运营商", vendorName);
int numberOfSimcard = 0;
if (mProps.containsKey(Constants.KEY_RO_MODEMS_MAX_COUNT)) {
String val = (String)mProps.get(Constants.KEY_RO_MODEMS_MAX_COUNT);
String val = (String) mProps.get(Constants.KEY_RO_MODEMS_MAX_COUNT);
numberOfSimcard = Integer.parseInt(val);
}
String signalLevel = "";
List<String> iccids = new ArrayList<>();
for (int idx = 1; idx <= numberOfSimcard; idx++) {
String key = Constants.KEY_RO_SIGNAL_STRNGTH_PREFIX + Integer.toString(idx);
if (mProps.containsKey(key)) {
String val = (String)mProps.get(key);
String val = (String) mProps.get(key);
int pos = val.indexOf(",");
if (pos != -1) {
String ss = val.substring(0, pos);
@ -601,49 +635,30 @@ public class DeviceActivity extends AppCompatActivity implements View.OnClickLis
if (!TextUtils.isEmpty(signalLevel)) {
signalLevel += "/";
}
signalLevel += ss + "," + Integer.toString(sl);
}
}
key = Constants.KEY_RO_ICCID_PREFIX + Integer.toString(idx - 1);
if (mProps.containsKey(key)) {
String val = (String)mProps.get(key);
String val = (String) mProps.get(key);
byte[] bytes = Base64.decode(val, Base64.DEFAULT);
String str = new String(bytes, Charset.defaultCharset());
iccids.add(str);
}
}
appendKeyValue(stringBuilder, "CMDID", mAppConfig.cmdid, true);
appendKeyValue(stringBuilder, "主站", (TextUtils.isEmpty(mAppConfig.server) ? "" : mAppConfig.server) + ":" + Integer.toString(mAppConfig.port));
appendKeyValue(stringBuilder, "通道数", Integer.toString(mAppConfig.channels));
if (mProps.containsKey(Constants.KEY_APP_MP_VERSION)) {
String val = (String)mProps.get(Constants.KEY_APP_MP_VERSION);
appendKeyValue(stringBuilder, "APP版本", val);
}
String vendorName = "";
if (mProps.containsKey(Constants.KEY_GSM_VENDOR_NAME)) {
vendorName = mProps.get(Constants.KEY_GSM_VENDOR_NAME);
}
appendKeyValue(stringBuilder, "移动运营商", vendorName);
appendKeyValue(stringBuilder, "移动信号", signalLevel);
for (String iccid : iccids) {
appendKeyValue(stringBuilder, "ICCID", iccid);
}
if (mProps.containsKey(Constants.KEY_IMEI)) {
String val = (String)mProps.get(Constants.KEY_IMEI);
String val = (String) mProps.get(Constants.KEY_IMEI);
appendKeyValue(stringBuilder, "IMEI1", val);
}
if (mProps.containsKey(Constants.KEY_IMEI2)) {
String val = (String)mProps.get(Constants.KEY_IMEI2);
String val = (String) mProps.get(Constants.KEY_IMEI2);
appendKeyValue(stringBuilder, "IMEI2", val);
}
@ -674,32 +689,15 @@ public class DeviceActivity extends AppCompatActivity implements View.OnClickLis
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.takePhoto1:
takePhoto(1, 255, true);
break;
case R.id.takePhoto2:
takePhoto(2, 255, true);
break;
case R.id.takePhoto3:
takePhoto(3, 255, true);
break;
case R.id.takePhoto4:
takePhoto(4, 255, true);
break;
case R.id.takeVideo1:
takeVideo(1, 255, false);
break;
case R.id.takeVideo2:
takeVideo(2, 255, false);
break;
case R.id.takeVideo3:
takeVideo(3, 255, false);
break;
case R.id.takeVideo4:
takeVideo(4, 255, false);
break;
}
}
@Override
public void onItemClick(View v, ChannelBean bean, int adapterType) {
if (adapterType == photoAdapter) {
takePhoto(bean.getChannel(), 255, true);
} else if (adapterType == videoAdapter) {
takeVideo(bean.getChannel(), 255, false);
}
}
}

@ -90,54 +90,42 @@ public class ImageActivity extends AppCompatActivity {
}
};
private ActivityImageBinding binding;
private String path;//图片地址
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
binding = ActivityImageBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
initIntent();
binding.imageView.setImageDrawable(null);
binding.imageView.setClickable(true);
binding.imageView.setOnTouchListener(mDelayHideTouchListener);
binding.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ImageActivity.this.finish();
}
});
Intent intent = getIntent();
String path = intent.getStringExtra("path");
if (path != null) {
loadImage(path);
}
}
private void initIntent() {
Intent intent = getIntent();
path = intent.getStringExtra("path");
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
binding.imageView.requestLayout();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return false;
default:
return super.onOptionsItemSelected(item);
}
}
private boolean loadImage(String path) {
@ -176,8 +164,6 @@ public class ImageActivity extends AppCompatActivity {
if (!localDevicePath.exists()) {
localDevicePath.mkdirs();
}
// binding.imagesView.
}
private List<Map<String, Object>> getData() {
@ -209,12 +195,12 @@ public class ImageActivity extends AppCompatActivity {
return mItems;
}
private void refreshListView() {
mAdapter = new ImagesAdaper(this, getData(), R.layout.list_item, new String[] { "img", "text" },
new int[] { R.id.id_img, R.id.id_text });
binding.imagesView.setAdapter(mAdapter);
}
// private void refreshListView() {
// mAdapter = new ImagesAdaper(this, getData(), R.layout.list_item, new String[] { "img", "text" },
// new int[] { R.id.id_img, R.id.id_text });
//
// binding.imagesView.setAdapter(mAdapter);
// }
public class ImagesAdaper extends SimpleAdapter {
public ImagesAdaper(Context context, List<Map<String, Object>> items, int resource, String[] from, int[] to) {

@ -4,50 +4,32 @@ import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.net.ConnectivityManager;
import android.net.DhcpInfo;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
import android.net.NetworkRequest;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiNetworkSpecifier;
import android.net.wifi.WifiNetworkSuggestion;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Parcelable;
import android.provider.Settings;
import android.text.TextUtils;
import android.text.format.Formatter;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import com.xypower.mpremote.bean.WifiInfoBean;
import com.xypower.mpremote.databinding.ActivityMainBinding;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

@ -49,11 +49,6 @@ public class StreamActivity extends AppCompatActivity {
mHandler = new Handler();
ActionBar actionBar = getSupportActionBar();
// 显示返回按钮
actionBar.setDisplayHomeAsUpEnabled(true);
// 去掉logo图标
actionBar.setDisplayShowHomeEnabled(false);
Intent intent = getIntent();
mDeviceIp = intent.getStringExtra("deviceIp");
@ -64,8 +59,6 @@ public class StreamActivity extends AppCompatActivity {
int netCamera = intent.getIntExtra("netCamera", 0);
int vendor = intent.getIntExtra("vendor", 0);
actionBar.setTitle(getResources().getString(R.string.channel) + Integer.toString(channel));
String url = "rtmp://" + mDeviceIp + "/live/0";
String cmd = "am start -n com.xypower.mplive/com.xypower.mplive.MainActivity"

@ -1,68 +1,52 @@
package com.xypower.mpremote.adapter;
import android.annotation.SuppressLint;
import android.graphics.Color;
import android.graphics.Typeface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.xypower.mpremote.R;
import com.xypower.mpremote.bean.WifiInfoBean;
import com.xypower.mpremote.bean.ChannelBean;
import com.xypower.mpremote.interfaces.OnItemClickListener;
import java.util.ArrayList;
import java.util.List;
public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.MyViewHolder> {
public int adapterType;
public OnItemClickListener listener;
private List<WifiInfoBean> itemList = new ArrayList<>();
private List<ChannelBean> itemList = new ArrayList<>();
public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public class MyViewHolder extends RecyclerView.ViewHolder {
private TextView title;
private OnItemClickListener listeners;
private ImageView img;
public MyViewHolder(View view, OnItemClickListener listener) {
super(view);
this.listeners = listener;
title = view.findViewById(R.id.id_text);
img = view.findViewById(R.id.id_img);
view.setOnClickListener(this);
title = view.findViewById(R.id.channel);
}
public TextView getTitle() {
return title;
}
public ImageView getImg() {
return img;
}
@Override
public void onClick(View v) {
if (listeners != null) {
listeners.onItemClick(v, getAdapterPosition());
}
}
}
public void setOnClickListener(OnItemClickListener listener) {
this.listener = listener;
}
public void setItemList(List<WifiInfoBean> list) {
public void setItemList(List<ChannelBean> list) {
this.itemList = list;
this.notifyDataSetChanged();
notifyDataSetChanged();
}
public void setAdapterType(int type) {
this.adapterType = type;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
@ -72,37 +56,13 @@ public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.MyViewHolder>
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, @SuppressLint("RecyclerView") int position) {
WifiInfoBean wifiInfoBean = itemList.get(position);
String text = wifiInfoBean.getText();
boolean connected = wifiInfoBean.isConnected();
int signalLevel = wifiInfoBean.getSignalLevel();
if (text.startsWith("XY") || text.startsWith("xy")) {
holder.getTitle().setTextColor(Color.RED);
holder.getTitle().setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
} else {
holder.getTitle().setTextColor(Color.BLACK);
holder.getTitle().setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
}
holder.getTitle().setText(text);
int drawableId = R.drawable.ic_wifi_signal_0;
switch (signalLevel) {
case 1:
drawableId = connected ? R.drawable.ic_wifi_signal_1_green : R.drawable.ic_wifi_signal_1;
break;
case 2:
drawableId = connected ? R.drawable.ic_wifi_signal_2_green : R.drawable.ic_wifi_signal_2;
break;
case 3:
drawableId = connected ? R.drawable.ic_wifi_signal_3_green : R.drawable.ic_wifi_signal_3;
break;
case 4:
drawableId = connected ? R.drawable.ic_wifi_signal_4_green : R.drawable.ic_wifi_signal_4;
break;
default:
drawableId = connected ? R.drawable.ic_wifi_signal_0_green : R.drawable.ic_wifi_signal_0;
break;
}
holder.getImg().setImageResource(drawableId);
ChannelBean channelBean = itemList.get(position);
holder.getTitle().setText(channelBean.getChannelname());
holder.itemView.setOnClickListener(v -> {
if (listener != null) {
listener.onItemClick(v, channelBean,adapterType);
}
});
}
@Override

@ -0,0 +1,48 @@
package com.xypower.mpremote.bean;
import org.json.JSONObject;
public class ChannelBean {
public ChannelBean() {
}
String text;
int channel;
String channelname;
JSONObject jsonObject;
public JSONObject getJsonObject() {
return jsonObject;
}
public void setJsonObject(JSONObject jsonObject) {
this.jsonObject = jsonObject;
}
public String getChannelname() {
return channelname;
}
public void setChannelname(String channelname) {
this.channelname = channelname;
}
public int getChannel() {
return channel;
}
public void setChannel(int channel) {
this.channel = channel;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}

@ -1,40 +0,0 @@
package com.xypower.mpremote.bean;
public class WifiInfoBean {
String text;
int signalLevel;
boolean connected;
public int getSignalLevel() {
return signalLevel;
}
public void setSignalLevel(int signalLevel) {
this.signalLevel = signalLevel;
}
public boolean isConnected() {
return connected;
}
public void setConnected(boolean connected) {
this.connected = connected;
}
public WifiInfoBean() {
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}

@ -2,7 +2,9 @@ package com.xypower.mpremote.interfaces;
import android.view.View;
import com.xypower.mpremote.bean.ChannelBean;
public interface OnItemClickListener {
void onItemClick(View v, int position);
void onItemClick(View v, ChannelBean position, int adapterType);
}

@ -6,21 +6,69 @@
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".DeviceActivity">
<include
android:id="@+id/toolbar"
layout="@layout/toolbar"/>
layout="@layout/toolbar" />
<TextView
android:id="@+id/deviceInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="16dp"
android:singleLine="false"
android:lineSpacingMultiplier="1.25"
android:singleLine="false"
android:textSize="16sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/toolbar" />
<Button
android:id="@+id/yt_control"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="云台控制"
android:visibility="gone"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/deviceInfo" />
<TextView
android:id="@+id/phototext"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:text="拍照"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/deviceInfo" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerViewPhoto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginTop="10dp"
android:layout_marginRight="20dp"
app:layout_constraintTop_toBottomOf="@+id/phototext" />
<TextView
android:id="@+id/videotext"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:text="视频预览"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/recyclerViewPhoto" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerViewVideo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginTop="10dp"
android:layout_marginRight="20dp"
app:layout_constraintTop_toBottomOf="@+id/videotext" />
<Button
android:id="@+id/takePhoto1"
android:layout_width="wrap_content"
@ -28,10 +76,10 @@
android:layout_marginStart="8dp"
android:layout_marginBottom="8dp"
android:minWidth="72dp"
android:visibility="gone"
android:text="通道1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toTopOf="@+id/takeVideo1" />
android:visibility="gone"
app:layout_constraintBottom_toTopOf="@+id/takeVideo1"
app:layout_constraintStart_toStartOf="parent" />
<Button
android:id="@+id/takePhoto2"
@ -39,8 +87,8 @@
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:minWidth="72dp"
android:visibility="gone"
android:text="通道2"
android:visibility="gone"
app:layout_constraintStart_toEndOf="@+id/takePhoto1"
app:layout_constraintTop_toTopOf="@+id/takePhoto1" />
@ -50,8 +98,8 @@
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:minWidth="72dp"
android:visibility="gone"
android:text="通道3"
android:visibility="gone"
app:layout_constraintStart_toEndOf="@+id/takePhoto2"
app:layout_constraintTop_toTopOf="@+id/takePhoto1" />
@ -61,8 +109,8 @@
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:minWidth="72dp"
android:visibility="gone"
android:text="通道4"
android:visibility="gone"
app:layout_constraintStart_toEndOf="@+id/takePhoto3"
app:layout_constraintTop_toTopOf="@+id/takePhoto1" />
@ -73,10 +121,10 @@
android:layout_marginStart="8dp"
android:layout_marginBottom="24dp"
android:minWidth="72dp"
android:visibility="gone"
android:text="视频1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<Button
android:id="@+id/takeVideo2"
@ -84,10 +132,10 @@
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:minWidth="72dp"
android:visibility="gone"
android:text="视频2"
app:layout_constraintStart_toEndOf="@id/takeVideo1"
app:layout_constraintBottom_toBottomOf="@id/takeVideo1" />
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/takeVideo1"
app:layout_constraintStart_toEndOf="@id/takeVideo1" />
<Button
android:id="@+id/takeVideo3"
@ -95,10 +143,10 @@
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:minWidth="72dp"
android:visibility="gone"
android:text="视频3"
app:layout_constraintStart_toEndOf="@id/takeVideo2"
app:layout_constraintBottom_toBottomOf="@id/takeVideo1" />
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/takeVideo1"
app:layout_constraintStart_toEndOf="@id/takeVideo2" />
<Button
android:id="@+id/takeVideo4"
@ -106,9 +154,9 @@
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:minWidth="72dp"
android:visibility="gone"
android:text="视频4"
app:layout_constraintStart_toEndOf="@id/takeVideo3"
app:layout_constraintBottom_toBottomOf="@id/takeVideo1" />
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/takeVideo1"
app:layout_constraintStart_toEndOf="@id/takeVideo3" />
</androidx.constraintlayout.widget.ConstraintLayout>

@ -10,9 +10,58 @@
android:id="@+id/playerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:resize_mode="fit"
app:show_buffering="always"
app:show_timeout="5000"
app:use_controller="false"
app:resize_mode="fit"/>
tools:ignore="MissingConstraints" />
<ImageButton
android:id="@+id/center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@mipmap/center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.9" />
<ImageButton
android:layout_marginBottom="10dp"
android:id="@+id/top"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@mipmap/up"
app:layout_constraintBottom_toTopOf="@+id/center"
app:layout_constraintLeft_toLeftOf="@+id/center" />
<ImageButton
android:layout_marginRight="10dp"
android:id="@+id/left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@mipmap/left"
app:layout_constraintRight_toLeftOf="@+id/center"
app:layout_constraintTop_toTopOf="@+id/center" />
<ImageButton
android:layout_marginLeft="10dp"
android:id="@+id/right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@mipmap/right"
app:layout_constraintLeft_toRightOf="@+id/center"
app:layout_constraintTop_toTopOf="@+id/center" />
<ImageView
android:layout_marginTop="10dp"
android:id="@+id/bottom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@mipmap/down"
app:layout_constraintLeft_toLeftOf="@+id/center"
app:layout_constraintTop_toBottomOf="@+id/center" />
</androidx.constraintlayout.widget.ConstraintLayout>

@ -1,31 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:cardCornerRadius="5dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_marginTop="10dp"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_height="50dp">
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingLeft="8dp"
android:paddingTop="20dp"
android:paddingRight="8dp"
android:paddingBottom="20dp">
<ImageView
android:id="@+id/id_img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_wifi" />
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:layout_marginTop="5dp"
android:layout_marginRight="10dp"
android:layout_marginBottom="5dp"
app:cardCornerRadius="10dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/id_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginTop="2dp"
android:text="" />
</LinearLayout>
</androidx.cardview.widget.CardView>
android:id="@+id/channel"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:gravity="center"
android:text="dfdsasdafdsd"
android:textSize="15sp"
tools:ignore="MissingConstraints" />
</androidx.cardview.widget.CardView>
</androidx.constraintlayout.widget.ConstraintLayout>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Loading…
Cancel
Save