From 2a84a59edb77c53a4cdfd056ae616edba970e973 Mon Sep 17 00:00:00 2001 From: "luozhenxue@yztiot.com" Date: Fri, 16 May 2025 09:38:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E7=89=88=E7=95=8C=E9=9D=A2=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=B8=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/vcs.xml | 6 + .../streetlamp/BootCompleteReceiver.java | 12 +- .../yztiot/streetlamp/ColorModeAdapter.java | 201 ------------- .../java/com/yztiot/streetlamp/LightMode.java | 53 ++++ .../yztiot/streetlamp/LightModeAdapter.java | 162 ++++++---- .../com/yztiot/streetlamp/MainActivity.java | 281 ++++++++++++------ .../com/yztiot/streetlamp/TimingReceiver.java | 9 +- .../main/res/drawable-en/light_mode_off.png | Bin 480 -> 0 bytes .../main/res/drawable-en/light_mode_on.png | Bin 474 -> 0 bytes app/src/main/res/drawable-en/lower_light.png | Bin 5841 -> 0 bytes app/src/main/res/drawable-en/upper_light.png | Bin 5781 -> 5555 bytes app/src/main/res/drawable/circle_shape.xml | 2 +- app/src/main/res/drawable/light_mode_on.png | Bin 474 -> 328 bytes app/src/main/res/drawable/lower_light.png | Bin 2486 -> 0 bytes app/src/main/res/drawable/upper_light.png | Bin 2496 -> 2062 bytes app/src/main/res/layout/activity_main.xml | 7 +- app/src/main/res/layout/color_mode.xml | 22 +- .../res/layout/custom_time_picker_dialog.xml | 22 ++ app/src/main/res/layout/light_mode.xml | 39 --- app/src/main/res/values-en/strings.xml | 66 ++-- app/src/main/res/values/colors.xml | 8 +- app/src/main/res/values/strings.xml | 45 +-- 22 files changed, 473 insertions(+), 462 deletions(-) create mode 100644 .idea/vcs.xml delete mode 100644 app/src/main/java/com/yztiot/streetlamp/ColorModeAdapter.java create mode 100644 app/src/main/java/com/yztiot/streetlamp/LightMode.java delete mode 100644 app/src/main/res/drawable-en/light_mode_off.png delete mode 100644 app/src/main/res/drawable-en/light_mode_on.png delete mode 100644 app/src/main/res/drawable-en/lower_light.png delete mode 100644 app/src/main/res/drawable/lower_light.png create mode 100644 app/src/main/res/layout/custom_time_picker_dialog.xml delete mode 100644 app/src/main/res/layout/light_mode.xml diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/yztiot/streetlamp/BootCompleteReceiver.java b/app/src/main/java/com/yztiot/streetlamp/BootCompleteReceiver.java index fcf8c71..0ee7ce4 100644 --- a/app/src/main/java/com/yztiot/streetlamp/BootCompleteReceiver.java +++ b/app/src/main/java/com/yztiot/streetlamp/BootCompleteReceiver.java @@ -7,6 +7,7 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.util.Log; +import android.widget.Toast; import java.util.Calendar; @@ -15,7 +16,13 @@ public class BootCompleteReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) { // 读取文件并设置AlarmManager - setAlarms(context); + SharedPreferences prefs = context.getSharedPreferences(MainActivity.PREFS_NAME, Context.MODE_PRIVATE); + int switchValue = prefs.getInt(MainActivity.SWITCH_KEY,-1); + Log.d("BootCompleteReceiver","BootCompleteReceiver: "+switchValue); + Toast.makeText(context, "switchValue: "+switchValue, Toast.LENGTH_SHORT).show(); + if (switchValue == 1){ + setAlarms(context); + } } } @@ -26,6 +33,9 @@ public class BootCompleteReceiver extends BroadcastReceiver { int endHour = prefs.getInt(MainActivity.END_HOUR_KEY, -1); int endMinute = prefs.getInt(MainActivity.END_MINUTE_KEY, -1); + + + if (startHour != -1 && startMinute != -1 && endHour != -1 && endMinute != -1) { AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); diff --git a/app/src/main/java/com/yztiot/streetlamp/ColorModeAdapter.java b/app/src/main/java/com/yztiot/streetlamp/ColorModeAdapter.java deleted file mode 100644 index 8719fbd..0000000 --- a/app/src/main/java/com/yztiot/streetlamp/ColorModeAdapter.java +++ /dev/null @@ -1,201 +0,0 @@ -package com.yztiot.streetlamp; - -import android.graphics.drawable.GradientDrawable; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.recyclerview.widget.RecyclerView; - -import java.util.List; - -public class ColorModeAdapter extends RecyclerView.Adapter { - private List titles; - private int selectedPosition = -1; - - public ColorModeAdapter(List titles) { - this.titles = titles; - } - - private OnSelectionChangedListener selectionChangedListener; - - public static class ViewHolder extends RecyclerView.ViewHolder { - View rootView; - TextView status; - ImageView lightModeBackground; - - public ViewHolder(View itemView) { - super(itemView); - rootView = itemView; - status = itemView.findViewById(R.id.color_mode_status); - lightModeBackground = itemView.findViewById(R.id.light_mode_background); - } - } - - @Override - public ColorModeAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.color_mode, parent, false); - return new ViewHolder(view); - } - - @Override - public void onBindViewHolder(ColorModeAdapter.ViewHolder holder, int position) { - String colorName = titles.get(position); - holder.status.setText(colorName); - - // 设置颜色圆圈背景 - View colorShow = holder.rootView.findViewById(R.id.color_show); - colorShow.setBackground(getColorDrawableByName(colorName)); - - // 设置选中样式 - if (position == selectedPosition) { - holder.lightModeBackground.setBackgroundResource(R.drawable.btn_yellow); - } else { - holder.lightModeBackground.setBackgroundResource(R.drawable.btn_transparent); - } - - holder.rootView.setOnClickListener(v -> { - int currentPos = holder.getAdapterPosition(); - if (currentPos == RecyclerView.NO_POSITION) return; - - int oldPos = selectedPosition; - selectedPosition = currentPos; - - notifyItemChanged(oldPos); - notifyItemChanged(selectedPosition); - Log.d("ColorMode", "选中:" + colorName); - if (selectionChangedListener != null) { - selectionChangedListener.onSelectionChanged(selectedPosition); - } - }); - } - - private GradientDrawable getColorDrawableByName(String colorName) { - // 创建一个 GradientDrawable 对象 - GradientDrawable drawable = new GradientDrawable(); - drawable.setShape(GradientDrawable.OVAL); // 明确设置形状为圆形 - - switch (colorName) { - case "红黄": - case "Red-Yellow": - drawable.setColors(new int[]{0xCCFF0000, 0xCCFFFF00}); - break; - case "红紫": - case "Red-Purple": - drawable.setColors(new int[]{0xCCFF0000, 0xCC800080}); - break; - case "红青": - case "Red-Cyan": - drawable.setColors(new int[]{0xCCFF0000, 0xCC00FFFF}); - break; - case "绿青": - case "Green-Cyan": - drawable.setColors(new int[]{0xCC00FF00, 0xCC00FFFF}); - break; - case "绿蓝": - case "Green-Blue": - drawable.setColors(new int[]{0xCC00FF00, 0xCC0000FF}); - break; - case "绿黄": - case "Green-Yellow": - drawable.setColors(new int[]{0xCC00FF00, 0xCCFFFF00}); - break; - case "绿紫": - case "Green-Purple": - drawable.setColors(new int[]{0xCC00FF00, 0xCC800080}); - break; - case "黄紫": - case "Yellow-Purple": - drawable.setColors(new int[]{0xCCFFFF00, 0xCC800080}); - break; - case "黄青": - case "Yellow-Cyan": - drawable.setColors(new int[]{0xCCFFFF00, 0xCC00FFFF}); - break; - case "紫青": - case "Purple-Cyan": - drawable.setColors(new int[]{0xCC800080, 0xCC00FFFF}); - break; - case "红绿蓝": - case "Red-Green-Blue": - drawable.setColors(new int[]{0xCCFF0000, 0xCC00FF00, 0xCC0000FF}); - break; - case "紫黄青": - case "Purple-Yellow-Cyan": - drawable.setColors(new int[]{0xCC800080, 0xCCFFFF00, 0xCC00FFFF}); - break; - case "红蓝": - case "Red-Blue": - drawable.setColors(new int[]{0xCCFF0000, 0xCC0000FF}); - break; - case "Red-Green": - case "红绿": - drawable.setColors(new int[]{0xCCFF0000, 0xCC00FF00}); - break; - case "Red": - case "红": - drawable.setColor(0xCCFF0000); - break; - case "Green": - case "绿": - drawable.setColor(0xCC00FF00); - break; - case "Blue": - case "蓝": - drawable.setColor(0xCC0000FF); - break; - case "White": - case "白": - drawable.setColor(0xCCFFFFFF); - break; - case "Black": - case "黑": - drawable.setColors(new int[]{ 0xCC575757,0xCC000000}); - break; - case "紫": - case "Purple": - drawable.setColor(0xCC800080); - break; - case "Yellow": - case "黄": - drawable.setColor(0xCCFFFF00); - break; - case "Cyan": - case "青": - drawable.setColor(0xCC00FFFF); - break; - case "关": - case "off": - default: - drawable.setColor(0x00444444); - break; - } - - return drawable; - } - - public interface OnSelectionChangedListener { - void onSelectionChanged(int selectedPosition); - } - - public void setOnSelectionChangedListener(OnSelectionChangedListener listener) { - this.selectionChangedListener = listener; - } - - @Override - public int getItemCount() { - return titles.size(); - } - - public int getSelectedPosition() { - return selectedPosition; - } - public void setSelectedPosition(int position) { - this.selectedPosition = position; - notifyDataSetChanged(); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/yztiot/streetlamp/LightMode.java b/app/src/main/java/com/yztiot/streetlamp/LightMode.java new file mode 100644 index 0000000..4333341 --- /dev/null +++ b/app/src/main/java/com/yztiot/streetlamp/LightMode.java @@ -0,0 +1,53 @@ +package com.yztiot.streetlamp; + +public class LightMode { + private String modeName; + private int colorResId; + private int color1ResId; + private int color2ResId; + private int color3ResId; + private int index; + + public LightMode(String modeName) { + this.modeName = modeName; + this.colorResId = 0; + } + + public LightMode(String modeName, int colorResId) { + this.modeName = modeName; + this.colorResId = colorResId; + } + + public LightMode(String modeName, int color1ResId, int color2ResId) { + this.modeName = modeName; + this.color1ResId = color1ResId; + this.color2ResId = color2ResId; + } + + public LightMode(String modeName, int color1ResId, int color2ResId, int color3ResId) { + this.modeName = modeName; + this.color1ResId = color1ResId; + this.color2ResId = color2ResId; + this.color3ResId = color3ResId; + } + + public String getModeName() { + return modeName; + } + + public int getColorResId() { + return colorResId; + } + + public int getColor1ResId() { + return color1ResId; + } + + public int getColor2ResId() { + return color2ResId; + } + + public int getColor3ResId() { + return color3ResId; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yztiot/streetlamp/LightModeAdapter.java b/app/src/main/java/com/yztiot/streetlamp/LightModeAdapter.java index 4d444fa..dda3b1f 100644 --- a/app/src/main/java/com/yztiot/streetlamp/LightModeAdapter.java +++ b/app/src/main/java/com/yztiot/streetlamp/LightModeAdapter.java @@ -1,92 +1,138 @@ package com.yztiot.streetlamp; +import android.graphics.Color; +import android.graphics.drawable.GradientDrawable; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ImageView; import android.widget.TextView; +import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.RecyclerView; import java.util.List; -public class LightModeAdapter extends RecyclerView.Adapter { - private List titles; +public class LightModeAdapter extends RecyclerView.Adapter { + private List lightModes; private int selectedPosition = -1; - private OnSelectionChangedListener selectionChangedListener; + private int containerId; - public LightModeAdapter(List titles) { - this.titles = titles; + private OnLightModeSelectedListener listener; + + public LightModeAdapter(List lightModes, int containerId, OnLightModeSelectedListener listener) { + this.lightModes = lightModes; + this.containerId = containerId; + this.listener = listener; + } + public interface OnLightModeSelectedListener { + void onLightModeSelected(LightMode lightMode, int containerId, int position, StringBuilder frameBuilder); + void onFrameBuilt(String frame); } - public static class ViewHolder extends RecyclerView.ViewHolder { - View rootView; - TextView title, color; - ImageView lightModeBackground; - - public ViewHolder(View itemView) { - super(itemView); - rootView = itemView; - title = itemView.findViewById(R.id.light_mode_title); - color = itemView.findViewById(R.id.light_mode_color); - lightModeBackground = itemView.findViewById(R.id.light_mode_background); - } + public void setSelectedPosition(int position) { + this.selectedPosition = position; + notifyDataSetChanged(); // 刷新视图 } @Override - public LightModeAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.light_mode, parent, false); - return new ViewHolder(view); + public LightModeViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.color_mode, parent, false); + return new LightModeViewHolder(view); } @Override - public void onBindViewHolder(LightModeAdapter.ViewHolder holder, int position) { - holder.title.setText(titles.get(position)); - holder.color.setText(R.string.off); + public void onBindViewHolder(LightModeViewHolder holder, int position) { + LightMode lightMode = lightModes.get(position); + holder.bind(lightMode, position == selectedPosition); - if (position == selectedPosition) { - holder.lightModeBackground.setBackgroundResource(R.drawable.light_mode_on); - } else { - holder.lightModeBackground.setBackgroundResource(R.drawable.light_mode_off); - } + holder.itemView.setOnClickListener(v -> { + // 记录当前选中的位置 + int oldPosition = selectedPosition; + selectedPosition = position; // 更新为当前选中的位置 - holder.rootView.setOnClickListener(v -> { - int currentPos = holder.getAdapterPosition(); - if (currentPos == RecyclerView.NO_POSITION) return; - - int oldPos = selectedPosition; - selectedPosition = currentPos; - - notifyItemChanged(oldPos); + // 更新显示 + notifyItemChanged(oldPosition); notifyItemChanged(selectedPosition); - Log.d("LightMode", "选中:" + titles.get(currentPos)); - if (selectionChangedListener != null) { - selectionChangedListener.onSelectionChanged(selectedPosition); + + if (listener != null) { + listener.onLightModeSelected(lightMode, containerId, position, new StringBuilder()); // 传递选中的模式 } + + Log.d("LightModeAdapter", "Clicked containerId: " + containerId + ", position: " + position); }); } - public interface OnSelectionChangedListener { - void onSelectionChanged(int selectedPosition); - } - - - public void setOnSelectionChangedListener(OnSelectionChangedListener listener) { - this.selectionChangedListener = listener; - } - @Override public int getItemCount() { - return titles.size(); + return lightModes.size(); } - public int getSelectedPosition() { - return selectedPosition; + public static class LightModeViewHolder extends RecyclerView.ViewHolder { + private TextView modeStatus; + private View colorShow, colorMode; + + public LightModeViewHolder(View itemView) { + super(itemView); + modeStatus = itemView.findViewById(R.id.color_mode_status); + colorShow = itemView.findViewById(R.id.color_show); + colorMode = itemView.findViewById(R.id.color_mode); + } + + public void bind(LightMode lightMode, boolean isSelected) { + itemView.setTag(lightMode); + modeStatus.setText(lightMode.getModeName()); + + // 设置选中状态样式 + if (isSelected) { + colorMode.setBackgroundResource(R.drawable.light_mode_on); + modeStatus.setTextColor(Color.BLACK); + } else { + colorMode.setBackgroundResource(R.drawable.light_mode_off); // 你需要创建这个背景 + modeStatus.setTextColor(Color.GRAY); + } + + // 渐变色设置(与之前一样) + if (lightMode.getColorResId() != 0) { + int color = ContextCompat.getColor(itemView.getContext(), lightMode.getColorResId()); + GradientDrawable circleDrawable = new GradientDrawable(); + circleDrawable.setColor(color); + circleDrawable.setShape(GradientDrawable.OVAL); + colorShow.setBackground(circleDrawable); + } else if (lightMode.getColor1ResId() != 0 && lightMode.getColor2ResId() != 0) { + int color1 = ContextCompat.getColor(itemView.getContext(), lightMode.getColor1ResId()); + int color2 = ContextCompat.getColor(itemView.getContext(), lightMode.getColor2ResId()); + GradientDrawable gradientDrawable = new GradientDrawable( + GradientDrawable.Orientation.LEFT_RIGHT, + new int[]{color1, color2}); + gradientDrawable.setShape(GradientDrawable.OVAL); + colorShow.setBackground(gradientDrawable); + } else if (lightMode.getColor1ResId() != 0 && lightMode.getColor2ResId() != 0 && lightMode.getColor3ResId() != 0) { + int color1 = ContextCompat.getColor(itemView.getContext(), lightMode.getColor1ResId()); + int color2 = ContextCompat.getColor(itemView.getContext(), lightMode.getColor2ResId()); + int color3 = ContextCompat.getColor(itemView.getContext(), lightMode.getColor3ResId()); + GradientDrawable gradientDrawable = new GradientDrawable( + GradientDrawable.Orientation.LEFT_RIGHT, + new int[]{color1, color2, color3}); + gradientDrawable.setShape(GradientDrawable.OVAL); + colorShow.setBackground(gradientDrawable); + } else { + int[] rainbowColors = { + Color.parseColor("#FF6B6B"), + Color.parseColor("#FFA94D"), + Color.parseColor("#FFD43B"), + Color.parseColor("#69DB7C"), + Color.parseColor("#38D9A9"), + Color.parseColor("#4DABF7"), + Color.parseColor("#9775FA") + }; + GradientDrawable rainbowDrawable = new GradientDrawable( + GradientDrawable.Orientation.LEFT_RIGHT, + rainbowColors); + rainbowDrawable.setShape(GradientDrawable.OVAL); + colorShow.setBackground(rainbowDrawable); + } + } + } - public void setSelectedPosition(int position) { - this.selectedPosition = position; - notifyDataSetChanged(); - } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/yztiot/streetlamp/MainActivity.java b/app/src/main/java/com/yztiot/streetlamp/MainActivity.java index aa0f7ff..008297f 100644 --- a/app/src/main/java/com/yztiot/streetlamp/MainActivity.java +++ b/app/src/main/java/com/yztiot/streetlamp/MainActivity.java @@ -2,7 +2,6 @@ package com.yztiot.streetlamp; import android.app.AlarmManager; import android.app.AlertDialog; -import android.app.Dialog; import android.app.PendingIntent; import android.app.TimePickerDialog; import android.content.Context; @@ -12,7 +11,6 @@ import android.os.Bundle; import android.os.Handler; import android.text.InputType; import android.util.Log; -import android.util.TypedValue; import android.view.View; import android.widget.ArrayAdapter; import android.widget.Button; @@ -23,7 +21,6 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.SeekBar; import android.widget.Spinner; -import android.widget.TextView; import android.widget.Toast; import androidx.activity.EdgeToEdge; @@ -33,35 +30,40 @@ import androidx.recyclerview.widget.RecyclerView; import com.yztiot.demo.yztiotManager; -import java.util.Arrays; +import java.util.ArrayList; import java.util.Calendar; +import java.util.List; public class MainActivity extends AppCompatActivity { private Handler handler = new Handler(); - private RecyclerView lightModeView,colorModeView; private ImageView lightModeImage,lowerLamplight,upperLamplight; private ImageButton btnSettings,btnSpeed,btnTiming; - private Button btnUpLight, btnBlowLight, btnSend,loginPhoto,btnLogin; - private Spinner spinner; + private Button btnSend,loginPhoto,btnLogin; private LightModeAdapter lightModeAdapter; - private ColorModeAdapter colorModeAdapter; + private Spinner spinner; private boolean isSerialOpen = false; - private int upperLight = -1, upperColor = -1; - private int lowerLight = -1, lowerColor = -1; - public boolean isSelectingUpper = true; + private int upperLight = 01, upperColor = -1; + private int lowerLight = 02, lowerColor = -1; public static final String PREFS_NAME = "password_prefs"; private static final String SUPER_ADMIN_PASSWORD_KEY = "super_admin_password"; private static final String USER_PASSWORD_KEY = "user_password"; private String superAdminPassword = "654321"; + private int saveSwitch; + private String frame; private String userPassword = "000000"; public static final String START_HOUR_KEY = "start_hour"; public static final String START_MINUTE_KEY = "start_minute"; public static final String END_HOUR_KEY = "end_hour"; + public static final String SWITCH_KEY = "switch"; + public static final String FRAME_KEY = "frame"; public static final String END_MINUTE_KEY = "end_minute"; private View loginInputLayout; private EditText loginInput; private FrameLayout screenLayout; private boolean isLoginInputVisible = false; + private RecyclerView lightModeContainer,colorModeContainer; + private int selectedLightModeUpper; + private int selectedLightModeLower; public static com.yztiot.demo.yztiotManager yztiotManager = new yztiotManager(); @Override protected void onCreate(Bundle savedInstanceState) { @@ -76,57 +78,34 @@ public class MainActivity extends AppCompatActivity { openSerial(); initializePasswords(); loadPasswords(); - setAlarmManager(); + if (saveSwitch == 0){ + cancelAlarmManager(); + } else if (saveSwitch == 1){ + setAlarmManager(); + } + initializeSelection(); + } + private void initializeSelection() { + int lightModePosition = Integer.parseInt(frame.substring(6, 8), 16); // 子节目1 + int colorModePosition = Integer.parseInt(frame.substring(10, 12), 16); // 子节目2 + + // 设置 lightModeContainer 的选中位置 + if (colorModeContainer.getAdapter() != null) { + LightModeAdapter lightModeAdapter = (LightModeAdapter) lightModeContainer.getAdapter(); + lightModeAdapter.setSelectedPosition(lightModePosition ); + lightModeAdapter.notifyDataSetChanged(); + } + + // 设置 colorModeContainer 的选中位置 + if (colorModeContainer.getAdapter() != null) { + LightModeAdapter colorModeAdapter = (LightModeAdapter) colorModeContainer.getAdapter(); + colorModeAdapter.setSelectedPosition(colorModePosition); // 索引从0开始 + colorModeAdapter.notifyDataSetChanged(); + } + + Log.d("lightModeAdapter", "lightModeAdapter: " + lightModeAdapter + " colorModeContainer :" + colorModeContainer); } private void onClickListener(){ - btnUpLight.setOnClickListener(v -> { - lightModeImage.setBackgroundResource(R.drawable.upper_light); - upperLamplight.setVisibility(View.VISIBLE); - lowerLamplight.setVisibility(View.GONE); - isSelectingUpper = true; - - upperLight = lightModeAdapter.getSelectedPosition(); - upperColor = colorModeAdapter.getSelectedPosition(); - - lightModeAdapter.setSelectedPosition(upperLight); - colorModeAdapter.setSelectedPosition(upperColor); - - if (upperLight >= 0 && upperColor >= 0) { - Log.d("UpperProgram", String.format("light: %02X, color: %02X, upperProgram: %02X %02X", upperLight, upperColor, upperLight, upperColor)); - } - }); - - btnBlowLight.setOnClickListener(v -> { - lightModeImage.setBackgroundResource(R.drawable.lower_light); - upperLamplight.setVisibility(View.GONE); - lowerLamplight.setVisibility(View.VISIBLE); - isSelectingUpper = false; - lowerLight = lightModeAdapter.getSelectedPosition(); - lowerColor = colorModeAdapter.getSelectedPosition(); - - lightModeAdapter.setSelectedPosition(lowerLight); - colorModeAdapter.setSelectedPosition(lowerColor); - - if (lowerLight >= 0 && lowerColor >= 0) { - Log.d("LowerProgram", String.format("light: %02X, color: %02X, lowerProgram: %02X %02X", lowerLight, lowerColor, lowerLight, lowerColor)); - } - }); - - lightModeAdapter.setOnSelectionChangedListener(position -> { - if (isSelectingUpper) { - upperLight = position; - } else { - lowerLight = position; - } - }); - - colorModeAdapter.setOnSelectionChangedListener(position -> { - if (isSelectingUpper) { - upperColor = position; - } else { - lowerColor = position; - } - }); btnSend.setOnClickListener(v -> { SerialManage.getInstance().init(new SerialInter() { @@ -150,6 +129,25 @@ public class MainActivity extends AppCompatActivity { Toast.makeText(this, R.string.send_successfully, Toast.LENGTH_SHORT).show(); }); + btnTiming.setOnLongClickListener(v -> { + new AlertDialog.Builder(MainActivity.this, R.style.BlueAlertDialog) + .setTitle(R.string.timer_switch) + .setMessage(R.string.confirm_open_timer) // 提示信息 + + .setNegativeButton(R.string.cancel, (dialog, which) -> { + setAlarmManager(); + Toast.makeText(MainActivity.this, R.string.timer_cancelled, Toast.LENGTH_SHORT).show(); + }) + .setPositiveButton(R.string.confirm, (dialog, which) -> { + // 用户确认打开定时开关 + Toast.makeText(MainActivity.this, R.string.timer_opened, Toast.LENGTH_SHORT).show(); + // 例如,设置定时器 + cancelAlarmManager(); + }) + .show(); + + return true; // 返回 true 表示事件已处理 + }); btnTiming.setOnClickListener(v -> { final Calendar calendar = Calendar.getInstance(); int hour = calendar.get(Calendar.HOUR_OF_DAY); @@ -271,8 +269,29 @@ public class MainActivity extends AppCompatActivity { } loginInput.setText(""); }); - } + } + private void cancelAlarmManager() { + AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); + + Intent startIntent = new Intent(this, TimingReceiver.class); + startIntent.setAction("com.yztiot.streetlamp.START_ALARM"); + PendingIntent startPendingIntent = PendingIntent.getBroadcast(this, 0, startIntent, PendingIntent.FLAG_UPDATE_CURRENT); + + Intent endIntent = new Intent(this, TimingReceiver.class); + endIntent.setAction("com.yztiot.streetlamp.END_ALARM"); + PendingIntent endPendingIntent = PendingIntent.getBroadcast(this, 1, endIntent, PendingIntent.FLAG_UPDATE_CURRENT); + + if (alarmManager != null) { + alarmManager.cancel(startPendingIntent); + alarmManager.cancel(endPendingIntent); + Log.d("MainActivity", "Alarms canceled"); + } + + // 更换按钮背景图 + btnTiming.setBackgroundResource(R.drawable.btn_timing_off); + saveSwitch(SWITCH_KEY,0); + } private void setAlarmManager() { // 获取保存的时间 SharedPreferences prefs = getSharedPreferences(MainActivity.PREFS_NAME, MODE_PRIVATE); @@ -317,10 +336,19 @@ public class MainActivity extends AppCompatActivity { alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, endCalendar.getTimeInMillis(), endPendingIntent); Log.d("MainActivity", "End alarm set for: " + endCalendar.getTime()); + btnTiming.setBackgroundResource(R.drawable.btn_timing_on); + saveSwitch(SWITCH_KEY,1); } else { Log.d("MainActivity", "No valid time settings found"); } } + private void saveSwitch(String key, int value) { + SharedPreferences prefs = getSharedPreferences(PREFS_NAME, MODE_PRIVATE); + SharedPreferences.Editor editor = prefs.edit(); + editor.putInt(key, value); + editor.apply(); + Log.d("SwitchSave", key + ": " + value); + } private void saveTime(String key, int value) { SharedPreferences prefs = getSharedPreferences(PREFS_NAME, MODE_PRIVATE); SharedPreferences.Editor editor = prefs.edit(); @@ -328,6 +356,13 @@ public class MainActivity extends AppCompatActivity { editor.apply(); Log.d("TimeSave", key + ": " + value); } + private void saveFrame(String key, String value) { + SharedPreferences prefs = getSharedPreferences(PREFS_NAME, MODE_PRIVATE); + SharedPreferences.Editor editor = prefs.edit(); + editor.putString(key, value); + editor.apply(); + Log.d("saveFrame", key + ": " + value); + } private void savePasswords() { SharedPreferences prefs = getSharedPreferences(PREFS_NAME, MODE_PRIVATE); SharedPreferences.Editor editor = prefs.edit(); @@ -340,29 +375,24 @@ public class MainActivity extends AppCompatActivity { byte FH = 0x55; byte channel = (byte) (spinner.getSelectedItemPosition() + 1); - byte upperHigh = (byte) ((upperLight + 1) & 0xFF); + byte upperHigh = (byte) ((upperLight ) & 0xFF); byte upperLow = (byte) (upperColor & 0xFF); - byte lowerHigh = (byte) ((lowerLight + 1) & 0xFF); + byte lowerHigh = (byte) ((lowerLight) & 0xFF); byte lowerLow = (byte) (lowerColor & 0xFF); - byte speed = 0x32; - byte extra = 0x01; // 新增字节 - - byte[] frame = new byte[9]; + byte[] frame = new byte[7]; frame[0] = FH; frame[1] = channel; frame[2] = upperHigh; frame[3] = upperLow; frame[4] = lowerHigh; frame[5] = lowerLow; - frame[6] = speed; - frame[7] = extra; int sum = 0; - for (int i = 0; i < 8; i++) { + for (int i = 0; i < 6; i++) { sum += (frame[i] & 0xFF); } - frame[8] = (byte) (sum & 0xFF); + frame[6] = (byte) (sum & 0xFF); StringBuilder sb = new StringBuilder(); for (byte b : frame) { @@ -377,6 +407,7 @@ public class MainActivity extends AppCompatActivity { byte[] bytesToSend = hexStringToByteArray(hexToSend); String hexString = bytesToHex(bytesToSend); SerialManage.getInstance().send(hexString); + saveFrame(FRAME_KEY,hexString); } else { Toast.makeText(this, R.string.port_manager_not_initialized, Toast.LENGTH_SHORT).show(); } @@ -454,15 +485,17 @@ public class MainActivity extends AppCompatActivity { SharedPreferences prefs = getSharedPreferences(PREFS_NAME, MODE_PRIVATE); superAdminPassword = prefs.getString(SUPER_ADMIN_PASSWORD_KEY, "654321"); userPassword = prefs.getString(USER_PASSWORD_KEY, "000000"); + saveSwitch = prefs.getInt(SWITCH_KEY, 0); + frame = prefs.getString(FRAME_KEY,""); Log.d("PasswordLoad", "Super Admin Password: " + superAdminPassword); Log.d("PasswordLoad", "User Password: " + userPassword); + Log.d("PasswordLoad", "saveSwitch: " + saveSwitch); + Log.d("PasswordLoad", "saveSwitch: " + frame); } private void findId(){ spinner = findViewById(R.id.ttys_spinner); - btnUpLight = findViewById(R.id.btn_up_light); btnSend = findViewById(R.id.btn_send); - btnBlowLight = findViewById(R.id.btn_blow_light); lightModeImage = findViewById(R.id.light_mode_image); lowerLamplight = findViewById(R.id.lower_lamplight); upperLamplight = findViewById(R.id.upper_lamplight); @@ -474,20 +507,10 @@ public class MainActivity extends AppCompatActivity { loginPhoto = findViewById(R.id.login_photo); screenLayout = findViewById(R.id.screen_layout); btnLogin = findViewById(R.id.btn_login); + colorModeContainer = findViewById(R.id.color_mode_container); + lightModeContainer = findViewById(R.id.light_mode_container); } private void layout(){ - lightModeView = findViewById(R.id.light_mode_container); - lightModeView.setLayoutManager(new LinearLayoutManager(this)); - - lightModeAdapter = new LightModeAdapter(Arrays.asList(getResources().getStringArray(R.array.light_modes))); - lightModeView.setAdapter(lightModeAdapter); - - colorModeView = findViewById(R.id.color_mode_container); - colorModeView.setLayoutManager(new LinearLayoutManager(this)); - - colorModeAdapter = new ColorModeAdapter(Arrays.asList(getResources().getStringArray(R.array.color_modes))); - colorModeView.setAdapter(colorModeAdapter); - spinner = findViewById(R.id.ttys_spinner); ArrayAdapter adapter = ArrayAdapter.createFromResource( this, @@ -496,12 +519,98 @@ public class MainActivity extends AppCompatActivity { ); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); + + int red = R.color.red; + int green = R.color.green; + int blue = R.color.blue; + int white = R.color.white; + int black = R.color.black; + int purple = R.color.purple; + int yellow = R.color.yellow; + int cyan = R.color.cyan; + int transparent = R.color.transparent; + + List colorModes = new ArrayList<>(); + + // 单色常亮 (8个) + colorModes.add(new LightMode(getString(R.string.off), transparent)); + colorModes.add(new LightMode(getString(R.string.solid_color_constant), red)); + colorModes.add(new LightMode(getString(R.string.solid_color_constant), green)); + colorModes.add(new LightMode(getString(R.string.solid_color_constant), blue)); + colorModes.add(new LightMode(getString(R.string.solid_color_constant), white)); + colorModes.add(new LightMode(getString(R.string.solid_color_constant), black)); + colorModes.add(new LightMode(getString(R.string.solid_color_constant), purple)); + colorModes.add(new LightMode(getString(R.string.solid_color_constant), yellow)); + colorModes.add(new LightMode(getString(R.string.solid_color_constant), cyan)); + + // 单色呼吸渐变 (7个) + colorModes.add(new LightMode(getString(R.string.solid_color_breathing), red)); + colorModes.add(new LightMode(getString(R.string.solid_color_breathing), green)); + colorModes.add(new LightMode(getString(R.string.solid_color_breathing), blue)); + colorModes.add(new LightMode(getString(R.string.solid_color_breathing), white)); + colorModes.add(new LightMode(getString(R.string.solid_color_breathing), purple)); + colorModes.add(new LightMode(getString(R.string.solid_color_breathing), yellow)); + colorModes.add(new LightMode(getString(R.string.solid_color_breathing), cyan)); + + // 双色交替渐变 (9个) + colorModes.add(new LightMode(getString(R.string.dual_color_alternating), red, yellow)); + colorModes.add(new LightMode(getString(R.string.dual_color_alternating), red, purple)); + colorModes.add(new LightMode(getString(R.string.dual_color_alternating), red, cyan)); + colorModes.add(new LightMode(getString(R.string.dual_color_alternating), green, cyan)); + colorModes.add(new LightMode(getString(R.string.dual_color_alternating), green, yellow)); + colorModes.add(new LightMode(getString(R.string.dual_color_alternating), green, purple)); + colorModes.add(new LightMode(getString(R.string.dual_color_alternating), yellow, purple)); + colorModes.add(new LightMode(getString(R.string.dual_color_alternating), yellow, cyan)); + colorModes.add(new LightMode(getString(R.string.dual_color_alternating), purple, cyan)); + + // 三色渐变 (2个) + colorModes.add(new LightMode(getString(R.string.tricolor_gradient),red, green, blue)); + colorModes.add(new LightMode(getString(R.string.tricolor_gradient), purple, yellow, cyan)); + + // 其他模式 (各1个) + colorModes.add(new LightMode(getString(R.string.seven_color_gradient))); + colorModes.add(new LightMode(getString(R.string.seven_color_jump))); + colorModes.add(new LightMode(getString(R.string.colorful_trail_run))); + colorModes.add(new LightMode(getString(R.string.colorful_color_chase))); + + + while (colorModes.size() < 30) { + colorModes.addAll(colorModes); + } + colorModes = colorModes.subList(0, 30); + + lightModeContainer.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)); + colorModeContainer.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)); + + LightModeAdapter.OnLightModeSelectedListener listener = new LightModeAdapter.OnLightModeSelectedListener() { + @Override + public void onLightModeSelected(LightMode lightMode, int containerId, int position, StringBuilder frameBuilder) { + if (containerId == 1) { + upperColor = position; // 存储上部选中的模式 + Log.d("MainActivity", "Upper Light Mode Selected: " + lightMode.getModeName() + " at position " + position); + } else if (containerId == 2) { + lowerColor = position; // 存储下部选中的模式 + Log.d("MainActivity", "Lower Light Mode Selected: " + selectedLightModeLower + " at position " + position); + } + Log.d("MainActivity", "upperColor " + upperColor + " lowerColor " + lowerColor); + } + + @Override + public void onFrameBuilt(String frame) { + // 可以根据需要处理数据帧 + } + }; + + lightModeContainer.setAdapter(new LightModeAdapter(colorModes, 01, listener)); + colorModeContainer.setAdapter(new LightModeAdapter(colorModes, 02, listener)); } + + private Runnable hideNavBarRunnable = new Runnable() { @Override public void run() { hideNavigationBar(); - handler.postDelayed(this, 1000); // 每秒检查一次 + handler.postDelayed(this, 1000); } }; @Override diff --git a/app/src/main/java/com/yztiot/streetlamp/TimingReceiver.java b/app/src/main/java/com/yztiot/streetlamp/TimingReceiver.java index 0ed8222..b341b7c 100644 --- a/app/src/main/java/com/yztiot/streetlamp/TimingReceiver.java +++ b/app/src/main/java/com/yztiot/streetlamp/TimingReceiver.java @@ -24,16 +24,17 @@ public class TimingReceiver extends BroadcastReceiver { int startMinute = prefs.getInt(MainActivity.START_MINUTE_KEY, -1); int endHour = prefs.getInt(MainActivity.END_HOUR_KEY, -1); int endMinute = prefs.getInt(MainActivity.END_MINUTE_KEY, -1); + String frame = prefs.getString(MainActivity.FRAME_KEY,""); if ("com.yztiot.streetlamp.START_ALARM".equals(intent.getAction())) { if (startHour == currentHour && startMinute == currentMinute) { - Log.d("TimingCheck", "开始时间到达: " + currentHour + ":" + currentMinute); - send("55010101020232018F"); + Log.d("TimingCheck", "开始时间到达: " + currentHour + ":" + currentMinute+"frame: "+frame); + send(frame); } } else if ("com.yztiot.streetlamp.END_ALARM".equals(intent.getAction())) { if (endHour == currentHour && endMinute == currentMinute) { - Log.d("TimingCheck", "结束时间到达: " + currentHour + ":" + currentMinute); - send("550101010202320290"); + Log.d("TimingCheck", "结束时间到达: " + currentHour + ":" + currentMinute+"frame: "+frame); + send("55010100020059"); } } diff --git a/app/src/main/res/drawable-en/light_mode_off.png b/app/src/main/res/drawable-en/light_mode_off.png deleted file mode 100644 index 1b2fa9fca316d5c535ea694ac2f0f7c1e02b14d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 480 zcmeAS@N?(olHy`uVBq!ia0y~yV6*|UvpCp*q~g-I5kQKuILO_JVcj{Imp~3nv6E*A z2N2Y7q;vq~x;$MRLn`LHy?&bWu!9JTV|^SGlj0MXIrV8}V!PYdbtU-mezsZn{yn3> zhg-G`38Dv?jac|k2-qk%e`w$t<&Yi*$#&m&Rx=+EGX8vTFJl7dbTMdP_SiG*Wol_z Sb{!Zi3=E#GelF{r5}E+a6O@Ah diff --git a/app/src/main/res/drawable-en/light_mode_on.png b/app/src/main/res/drawable-en/light_mode_on.png deleted file mode 100644 index f449f16108d6aa702f62ac27fe97f2381f5e416c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 474 zcmeAS@N?(olHy`uVBq!ia0y~yV6*|UvpCp*q~g-I5kQKuILO_JVcj{Imp~3nv6E*A z2N2Y7q;vq~T0C7GLn`LHz3#|+K!Jh9@m2%ZpVv9D2a?l8?qpA{J|=OWfukaypTWZQ zLj%u2W+N8<69P60&Z8XC!(c}B``gkCeKWGxf~bPbMre5cU{vj8GCzL1r41NA44$rj JF6*2UngCv+k>vmY diff --git a/app/src/main/res/drawable-en/lower_light.png b/app/src/main/res/drawable-en/lower_light.png deleted file mode 100644 index da07fd9e8d1707c15e20acee0e3f85a7b5b03c3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5841 zcmd6L`9D|lOvKC{_zGWR=WepSA zx3R<+jKP?hY~yph|B3JS{4nRteeTCO&-*^t^ZC54>%Fm|&c*Wr=RqLQMToAp2?)f* z3|!l?oCSV=4f(AACkB5Lod=+bp(_O753~ORh#3oTgt0ik1A%x$A=+AIL0QB(hZnZ^ zjGi3_lXFt=x9+06VP;xh+XHCX*e9OQ?8FLQy|)tI3|DV-BNO;+8!Ub#b(}pC9vO*& zdgn#z{*Yre`{A(^;p||Y6uMZo7C-nv%c-iN>@Q0o+I;xV^g{Q1j3p^U5vf#Dzz@M6 zzUo{a9#$h|-R>i2kz28c{g^OcQWOv!h**}l-CnEmLUS52!;KPT1(2H2NHjb&^d!=1WhuB zZ%_Lpj^aTi!t=G+{mVH|8yAq=2?(mvVs40j|Ze#p}C5h%hhh&mY8%Gz1R zlg-wZShISupBpYUr2n#$Od8VNh~ws3!@aW+i6Y$|p-fW0w+M`tNnluPYq3ds~_|-~mmhyC+$Ev~pW8bRc%M!1Ri=je7 zu!5Wl(L*m&`~0dX@{A|{nD_H>e<;FIw8 z+A%{}ZYYtiXP1P)^fFlPO^_owm?le}g!1xAYcQnrP%I6PlOh#@308ksduGoMe?o#$#+k>FZW`*8hIyQu0 zwivAEGLOMz=D2>hC-fN7$-l#U)j#yzoqzv*UoZWwctIj70clEj`$t9Ads6f+hI3A`4qPu?+KrKy=LzWX*H#bp1ng6Kke{via-c!;Z>Cu$o%#$k^ z>5Fit8ur2+Mv=Cyw`urBQs(?|QZSY~dN53sdx1``$nf~7;fwj?mj&z5=^{3|(yt(Zsfz zR)L>&JLsb0XWFD`i2e-y&tbYOj1}d?h-cOBx_gr6A51-w`4Sgr@eoL-=(0OXO8L%y zj}Qp>hrkKK+6&b3sPo6M@xc3DUgs<|ET~tGozxMkMepA`58r<9SqcUdLWxjlnajYn zD3`3ehgx29vvq8&D21HsU^7SvaT|WoHXq(%m2^k-K=yPu#gR(Tdl z+}SA@$^};x77m0~0gL}K98zB|WCo{|M>4!HHT~fctExn)m$MD(*)U1gu#n*$4kb|} zGqNP_-R&vqQ_BUmZ)|L=w49iCa7Zeyl!qsJ-?K&E)X{fTQ*~#Yn4cf|$PTV-HQ6qo zu#-s1iQgFFyHJSDax>S_@#ywg^hG_Z-fN-=3LEhrX^Pa!Yuy-5Qna_3(E`HD)(Dlo zDe0SKU74Abo84l*sR)|1^-Pe@h){GOhQV~#HC-e72v&sY!CBSgyX@%KgMH2irESkQ z{uo^`^zl?uPZWGNvn*ozdkano38|O>_aZ6CMyJ(4LdaslcWd2@j-XmGCKDGcEZTHG zzA0#WR`PPrEqueIUE+EIB%%f*+$RD`tIQ-P*%`iZym>uBgqtP&fPewY?a0zn(%G|H zeK7n#>?AYwb}ZYYmgYEjclW{I`65Ex8sIghIg;O{}yi9}7Ddqb_tJhU3DlsRJ(iqhqk+g8iea=`mQ{ zTDP@wNiY2FQ^$pzp+Fu?f>bA{? zl9qY6KNS|fJAG2ip~Vo*EgAg#e0~36)5g%o`WRLuL+!TmrMgOnN$VrZ!9L@*XG4H) zza7(pgU+oa7;I|(QWg5)#Y@S?VZq>9=EBJXhR}M4q-h6vO`{WhP`XSOXMp#v^L?pu zF{H*!M9sC!`>oalR!8#MRy&GY-5RJ(tz{z(e~Qv;T`PH7-Enh>pEld>OeUBoGD~BX zG#akY=2H?>Hn_75qb?!bQ!>`un{SYLL3dTXAh~9-wP$jq7^PV`hC}LDR)(jN5zSkz zZ{Lns9@XmAfINk%>$T3)mK6o6&K0GuCl!=#zXgr`dy2Y3L+5vAkj?7do~!q|#yS4> z9PYNe!L2qQLmgXqB5~a-WhZPU1LS2q>5el-*ij>qvqMo~w`vXRCEH$*RnIW>0hLl< zqQ}org4`(;5mNE%2&G4Z|B*W*AZ!$3Idn5om?zr^PQ&mV2csX}Adua_rVVE9eKt>8 zNAM`WpJ7KwB(2cLj)%MFrphkH)y^bCGtd%rfq)jd4tiK)C7ezKuU<_9O0=!l-OtbB zi8aCFthjlOz|Klsok#P1h#0@bXg|*rHt1Vpg_Gu2Ph?E$ypf{xh&ux1v}UfUYT{wJ z8L!jCKciz~yy`At>Q;U_`OqEY&@-YY(dFqzlUq9Svr+`{xvXU`o7datY1jXH(7ad^ zk=dPs(fSLT>Q8wY^a#=mJ3Q0jIqJ6G%3T@;#~%dL2dcR&`cLSr+7eYXHmDiNfhfvDdk`O!IDXYu8qa{n0{Htq;Tf_5N|ya_VyV^dFsZ@Z zYY%Twf`1lVDe6`uMQzoEU( z2+PsN#m$3PVIIs!{>M*?w=4Q)hWo}>grbBq$tNxrW!SkE{Rz=6cE|h#PERd)|A+84 zwRKOkjQ7ijFUp{|6r=k^VIe~4()03n@63&fIk&qU_ zm({%4CNBKH=!~7N{;ySrDsEO$h*Lc?Evya7^A1bNq|$cGo8n)qt~02)^v$J`y>Je? z!JlakuUHD_WV0?y0}Imk$@*9@(yGrIUXD`WPOKNZOvf$={{&;JtDXB^kz72kA1GAV z?&|}!?tHXC=IEV(ae{wiLT%sQDsf5vF{jW+j`9xwi9=AuWOy>MA zBFw%CiSut|1K)0|ww89N1)d|*$YBGy1*oHzVA z4wP}AZGCkko{d-_gz2p}xp772WEM7n9q!MQnMf{ZEuY-^8*Zdv6*b2cO~XI zHBSBqu1!4SC}hxoJHF9G=L_nujh%~+pE6L@f!egb?yh%`HPe-$SbiE^vwySSieeW) zphvzs?{0hvl?Ac9U4%e#zlP1e|4z8ytm@22tccf7nD85tvG(%5)uZ1c_V`<%BI2kG z$19BU_J$G3djOJNh5G07!<}ykZSuCP<7OpbR~0de8q!KR%Kl!H9!cp@DRosZxYBYm zqu_t$B+~Tm(ZGQgjr7h`YuN&Qf-$~&mLfQ|xGTm+uR-hO7LaT&7!}a+JE#vHR7HLK zsJ^GXr|S2|aag*mVL)2}er~*(Wel8?BKV^+P-X_w3&Z<$3kV_ph+c3Vs`FkyW*RrO z$#iR+oM|XAo-?HF8{)D={Kjb4>aM{1B{d>t=OqfD z0;Wa8=uIv%Q13f%c5ghy^9b*uQQeWqzLVBonA^-SP$+2lxwsyhWa5h*#s?GG(vqEPfRqdh%LN#Xo2Lu` zrJAks`xCHcxQa=MXxj#o^g-OOh1DS52k?(kl__Ut)~2@>fB!G^r+p{3Qu zIRTx$&vJ~9@3)6IKo@m@wwIzGo;|#7F6Gl=jLfjIoOpctEI@8XJuvsnn*NfBWq1O< zc!|5XGI}oV&e7x5if?0|2V#Ffg^EU1+B``|)PGkK+g_8PqS92__|I4l3(dlGcs!c+ zv=>iBm`c@!rb&*KvS-#v{G7MT$Wap2Yj7HkZOK?pJwWVbDaNBF$!k8+Ez?NxNmZak zq_?-L`2l1y2UAXTd?Xp4yD>!AobnKj*HBJ9rA~ZuSL9XgCACU6h9r4og3wxJ*)sse znwx7J9Ud%lfNuRcoC!cQsPe&Z2uvFDB>32A#YxY8JfB${W!*3F+3F{W?_d^~ z)5ct!?)wc2h$PCv#vzQlS^rU*Vw5|Cs)N`_k|F5S0P3a^;4G}pUi$oo1vEb7tu2PK zNW+c=d;Y@}DGO+Q>5CT;D`Pp)-_5OUZId>J%1gffh!cz*4`qYoYG#L)oIwYE1%w*# zk_t7sItNQJKTFHX5G8hH4&9GZ z#Tf1zPt9eamk#A*3JL__`WsLBQrL$H=QiHI0X(%$)r9Kmk))idso=3OlsG@&{9I_! z`LVK581MpXbbMiUQmU9v8ir1tWo9w$yR2wGczS6CH#Pw(*|P# z#Hen;{7mN*48J!Yijdhl6X8{G{n=HS%a588IhkjzXWR}@)4N=#YywV zNC=cWOr+KTmKYE|vn`w^3xngV)2b(n-MxS>=!&&ZULFM|S&EpD4yUq``YH)jCJ<;` z2#BL^(xL_s%u*UWAP^_0(&B&48b~Vo|A7VQsY7KuH97IvT=QpgfKeK>v((aB2}V*& za}dd7%o$LJ^3EKtJ&i`mI@v`Y5+mD>1D}2uX9o1;YOa|F9RfoaF@Pi#<<2nN?>MGR zl?nXieh>JyUC1LN^KKkmcf@FkWag{@iWpq1MCE`$d7e}m@K+(6#)*v{T8s%)+-hmR mKM%NY3?Sp{C$#?mPMB~kzb1M|i#Se=QOH9>?TQDEk^cv*l4yDW diff --git a/app/src/main/res/drawable-en/upper_light.png b/app/src/main/res/drawable-en/upper_light.png index ec56bc8556a5a3a490e2b4ba24d23dfc340523e4..d6360b371ff98705a465a333d779bfb2ba2dd437 100644 GIT binary patch literal 5555 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 Og+}`3$O_#XG5-NEC4z(i literal 5781 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 diff --git a/app/src/main/res/drawable/circle_shape.xml b/app/src/main/res/drawable/circle_shape.xml index 8a46878..801f008 100644 --- a/app/src/main/res/drawable/circle_shape.xml +++ b/app/src/main/res/drawable/circle_shape.xml @@ -1,4 +1,4 @@ - + diff --git a/app/src/main/res/drawable/light_mode_on.png b/app/src/main/res/drawable/light_mode_on.png index f449f16108d6aa702f62ac27fe97f2381f5e416c..49069b8b819a44476cce55da1419477cbd40e36f 100644 GIT binary patch literal 328 zcmeAS@N?(olHy`uVBq!ia0vp^i-6dcgAGXP9op0jq!^2X+?^QKos)S9vmY diff --git a/app/src/main/res/drawable/lower_light.png b/app/src/main/res/drawable/lower_light.png deleted file mode 100644 index 343e342a6071535bb4d719901c70b1b971001ecd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2486 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 K0#$0`6Z>DlL3Z%~ diff --git a/app/src/main/res/drawable/upper_light.png b/app/src/main/res/drawable/upper_light.png index a73ca6a61effae1c04b2b7df883a99bd7a8c3bf5..227dae6cd4ecdb7b559ea823e05276981f7af56e 100644 GIT binary patch literal 2062 zcmc&#c|6ox8$UBfWS`InH%8nPiC3EtGcj38b}7qrEw3d@c4frqUQ3N7Z?~(9X)a2s zYq^#fV^r3%%&1HlLr9j1u{D^<%-o;%-~0djo3pxG8!@f0C@*{ ztQ!Cl2xuNGy$k9Sj4v8N11!$X&KgwH_bosRM4YvQhcwhuq=T{nkZN|op7FR|vNVpi ze-xr6wL%_!TT0wBsCREnPs;nzNc)$l1G&iRSi={mvb$IduVcIRrmLi@(T{NLb<-uL z*ilWjmusV6IP5Q;j^4fc#xu)W!J59?uy;=uFQ^=6Vo_gSZC*q|3sS6@TlCiD)68qz zR%v5af}j{<00=XSi`~@Uv$NAuX-YnfhbO6)0AM6q`N8<@4Ivtf#p>w#F8DQ)eh z`wx-;9JlTH(qvHcDKx+Wx~ncU>Pid}qT~0+ znX$(38t)GQjcZApd}KOCDAoKX@0qwl4hAso2si-t4=@lYyOpH@(DsMJ0Qk{S8&dtt zZV1J@|4N6>_UI`=kNV#T_Z_FgqPa7Tek1zZ5u^nU^DnH8NGY zdDBZ{!~k$E2&K|NS^fH!pKjeKcYb*}*V^Aw%TnO=v$rIMRw;JTQM%h2Tf=ZAvU)q- z*4O72KbOG>q5S}P*c=N|S%jw6)_&_py%5FY9r z0#0v?UA}OnjX%qjq;2OgnJ5L?@Nm)rfuI^|^)jeH4I{h2G0;>wc`VKXLOJj%XQJ|J zgFx{B9I_IY8I#YM(pOY3luhM1{7R#}%(M0%k2b*&-_8}{N@Cf{5JNkJ^0(jLrouek z#idy7N#E~}@h)D*YCf0sc}kwfNBbZ$_#Wp0CnPdbx1z#|=*vxZbdgO?l^f)&@q1#{XRmA~DCOoW_H1vHbqlGf zGdDTt)}UVqGn$LA-e9V3d*y$?+}XdHRqN{&1O5H=gM*`XER04tJ38fQ;-5Z%{$wjX zNr-rHP)A25!|R%j6eiq2<>YjCE+ZgWaOMkHuy(x6`>FWRIc;tFJv$J~x zBNmPC^I(nDrtXj%>)W_IuCFhz`?^DBMti2F9-x=5g}!!pf-I~QKkAo;d8qGeZCPGk zU7dRHKrPBG9Be(l)5ZEI0jYM>CKwD?-&d%-jKk$FEJz`z>|olG9JIc&^khcF3u@g; z1oU*s=HYdxo}R4y@iqm*`g!5O1URhKg)7Nov!9h*^_}Q8(g}!-{qyKc6#~%)I^C;k zv$(7&;5@&!x#VSODb(I!x3t#PY+w(8cm{Gb!d{b8*BfU^+Jf)+!!?YfIn=tfPnZ10 zuZ*CD@rF9*@XjcVZ zhc8}C&9+G5(zq4y6^%;qirbhS*^n#z{7$%&XtCIarcEp!?|iRVGS?kPb@@7Vg1PCr zsT3I%MG~kF%2BC|&risrxcL?VC6Ik&P+yv`wpd_9*3Bak42?o}a#)V|*GBaH+;#y0{XLlr{On zT`bnbR$bcwRG2jO-@9F-JDr3)vFjF%c1370J?E1UsS3cLHr~0nMx@wLFLGs2x|()u NIh=LER$Kpc>u*qWm`wlx literal 2496 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 diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 44ffdb9..8ece609 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -48,7 +48,7 @@ android:layout_marginTop="@dimen/y3" android:layout_marginLeft="@dimen/y11"> @@ -94,6 +94,7 @@ android:background="@drawable/btn_send"/> - + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_gravity="center"> diff --git a/app/src/main/res/layout/custom_time_picker_dialog.xml b/app/src/main/res/layout/custom_time_picker_dialog.xml new file mode 100644 index 0000000..0afed4b --- /dev/null +++ b/app/src/main/res/layout/custom_time_picker_dialog.xml @@ -0,0 +1,22 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/light_mode.xml b/app/src/main/res/layout/light_mode.xml deleted file mode 100644 index 1cdace1..0000000 --- a/app/src/main/res/layout/light_mode.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 8faaeb1..605c8c0 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -1,7 +1,17 @@ LED Remote Control System - + + @string/solid_color_constant + @string/solid_color_breathing + @string/dual_color_alternating + @string/tricolor_gradient + @string/seven_color_gradient + @string/seven_color_jump + @string/colorful_trail_run + @string/colorful_color_chase + + @string/solid_color_constant @string/solid_color_breathing @string/dual_color_alternating @@ -12,31 +22,31 @@ @string/colorful_color_chase - - @string/off - @string/red - @string/green - @string/blue - @string/white - @string/black - @string/purple - @string/red_blue - @string/yellow - @string/red_green - @string/cyan - @string/green_blue - @string/red_yellow - @string/red_purple - @string/red_cyan - @string/green_cyan - @string/green_yellow - @string/green_purple - @string/yellow_purple - @string/yellow_cyan - @string/purple_cyan - @string/red_green_blue - @string/purple_yellow_cyan - + + + + + + + + + + + + + + + + + + + + + + + + + Solid Color Constant Light Solid Color Breathing Gradient @@ -90,4 +100,8 @@ Modify the user password The password has been modified successfully. The new password is: The password cannot be empty! + Timing switch + Whether to turn on the timer switch? + The timing switch has been turned on + The timer switch has been cancelled \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index d29b31c..1cbd85f 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -2,7 +2,13 @@ #FF000000 #FFFFFFFF - #FF1807 + #FF0000 + #00FF00 + #0000FF + #800080 + #FFFF00 + #00FFFF + #0000FFFF #2196F3 #1976D2 #2196F3 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f1dd036..0642d83 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2,7 +2,7 @@ LED远程控制系统 - + @string/solid_color_constant @string/solid_color_breathing @string/dual_color_alternating @@ -12,32 +12,15 @@ @string/colorful_trail_run @string/colorful_color_chase - - - - @string/off - @string/red - @string/green - @string/blue - @string/white - @string/black - @string/purple - @string/red_blue - @string/yellow - @string/red_green - @string/cyan - @string/green_blue - @string/red_yellow - @string/red_purple - @string/red_cyan - @string/green_cyan - @string/green_yellow - @string/green_purple - @string/yellow_purple - @string/yellow_cyan - @string/purple_cyan - @string/red_green_blue - @string/purple_yellow_cyan + + @string/solid_color_constant + @string/solid_color_breathing + @string/dual_color_alternating + @string/tricolor_gradient + @string/seven_color_gradient + @string/seven_color_jump + @string/colorful_trail_run + @string/colorful_color_chase 单色常亮 @@ -86,10 +69,14 @@ 请输入超级管理员密码 身份验证 请输入新用户密码 - 确认 - 取消 速度 修改用户密码 密码修改成功,新密码为: 密码不能为空! + 定时开关 + 是否关闭定时开关? + 定时开关已打开 + 定时开关已取消 + 确认 + 取消 \ No newline at end of file