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 1b2fa9f..0000000 Binary files a/app/src/main/res/drawable-en/light_mode_off.png and /dev/null differ 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 f449f16..0000000 Binary files a/app/src/main/res/drawable-en/light_mode_on.png and /dev/null differ 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 da07fd9..0000000 Binary files a/app/src/main/res/drawable-en/lower_light.png and /dev/null differ diff --git a/app/src/main/res/drawable-en/upper_light.png b/app/src/main/res/drawable-en/upper_light.png index ec56bc8..d6360b3 100644 Binary files a/app/src/main/res/drawable-en/upper_light.png and b/app/src/main/res/drawable-en/upper_light.png differ 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 f449f16..49069b8 100644 Binary files a/app/src/main/res/drawable/light_mode_on.png and b/app/src/main/res/drawable/light_mode_on.png differ 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 343e342..0000000 Binary files a/app/src/main/res/drawable/lower_light.png and /dev/null differ diff --git a/app/src/main/res/drawable/upper_light.png b/app/src/main/res/drawable/upper_light.png index a73ca6a..227dae6 100644 Binary files a/app/src/main/res/drawable/upper_light.png and b/app/src/main/res/drawable/upper_light.png differ 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