安卓11 SysteUI添加按钮以及下拉状态栏的色温调节按钮
最近客户想要做一个台灯产品,需要实现 串口调节台灯功能 ,其中包括
亮度调节
色温调节
开关
三个功能
话不多说,贴代码
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
old mode 100644
new mode 100755
index 17f92ee..71fefa0
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -790,5 +790,8 @@</intent-filter></receiver>+ <service android:name=".junjie.MySerialPortService"
+ android:exported="true"/>
+</application></manifest>
diff --git a/packages/SystemUI/res/drawable/ic_qs_td_button.xml b/packages/SystemUI/res/drawable/ic_qs_td_button.xml
new file mode 100755
index 0000000..8a81bc2
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_td_button.xml
@@ -0,0 +1,18 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"^M
+ android:width="108dp"^M
+ android:height="108dp"^M
+ android:viewportWidth="1024"^M
+ android:viewportHeight="1024">^M
+ <path^M
+ android:fillColor="#FFFFFFFF"^M
+ android:pathData="M4.3,603.5a1.7,1.7 0,0 0,0 -3.4,1.7 1.7,0 0,0 0,3.4zM904.9,560.7a19.9,19.9 0,0 1,-14.9 -6.7l-315.2,-356.5a19.9,19.9 0,1 1,29.9 -26.4l315.2,356.5a19.9,19.9 0,0 1,-14.9 33.1zM684.2,882.9a19.9,19.9 0,0 1,-14.3 -33.8l216.2,-222a19.9,19.9 0,0 1,28.5 27.8l-216.2,222a19.9,19.9 0,0 1,-14.3 6z"/>^M
+ <path^M
+ android:fillColor="#FFFFFFFF"^M
+ android:pathData="M545.9,235.2a19.9,19.9 0,0 1,-13.7 -34.4l60.3,-56.7a60.3,60.3 0,0 0,-82.5 -87.8l-60.3,56.7a19.9,19.9 0,0 1,-27.3 -29l60.3,-56.7a100.1,100.1 0,0 1,137.2 145.9l-60.3,56.7a19.9,19.9 0,0 1,-13.7 5.4z"/>^M
+ <path^M
+ android:fillColor="#FFFFFFFF"^M
+ android:pathData="M482.2,478.3h-0.6a19.9,19.9 0,0 1,-13.9 -6.3L174.9,160.4a19.9,19.9 0,0 1,0.9 -28.2,233.7 233.7,0 0,1 320.1,340.6 19.9,19.9 0,0 1,-13.6 5.4zM218.3,148.4l264.1,281.1a193.9,193.9 0,0 0,-264.1 -281.1zM1001.5,1024h-725.1a19.9,19.9 0,0 1,-19.9 -19.9c0,-88.8 72.3,-161.1 161.1,-161.1h442.9c88.8,0 161.1,72.3 161.1,161.1a19.9,19.9 0,0 1,-19.9 19.9zM297.8,984.2h682a121.8,121.8 0,0 0,-119.5 -101.3h-442.9a121.8,121.8 0,0 0,-119.5 101.3zM926.9,666.5a72.3,72.3 0,1 1,72.3 -72.3,72.4 72.4,0 0,1 -72.3,72.3zM926.9,561.8a32.5,32.5 0,1 0,32.5 32.5,32.5 32.5,0 0,0 -32.5,-32.5z"/>^M
+ <path^M
+ android:fillColor="#FFFFFFFF"^M
+ android:pathData="M321.7,428.5a101.1,101.1 0,0 1,-52.5 -187.6,19.9 19.9,0 1,1 20.7,34.1 61.3,61.3 0,1 0,82.6 86.6,19.9 19.9,0 1,1 33,22.3 101.1,101.1 0,0 1,-83.9 44.6z"/>^M
+</vector>^M
diff --git a/packages/SystemUI/res/layout/brightness_mirror.xml b/packages/SystemUI/res/layout/brightness_mirror.xml
old mode 100644
new mode 100755
index e3440b5..288947e
--- a/packages/SystemUI/res/layout/brightness_mirror.xml
+++ b/packages/SystemUI/res/layout/brightness_mirror.xml
@@ -18,7 +18,7 @@xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/brightness_mirror"android:layout_width="@dimen/qs_panel_width"
- android:layout_height="@dimen/brightness_mirror_height"
+ android:layout_height="@dimen/brightness_mirror_height1"android:layout_gravity="@integer/notification_panel_layout_gravity"android:visibility="invisible"><FrameLayout
diff --git a/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml b/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
old mode 100644
new mode 100755
index 12127f5..039f633
--- a/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
+++ b/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
@@ -17,17 +17,69 @@xmlns:systemui="http://schemas.android.com/apk/res-auto"android:layout_height="wrap_content"android:layout_width="match_parent"
- android:layout_gravity="center_vertical"
+ android:orientation="vertical"style="@style/BrightnessDialogContainer">+<com.android.systemui.settings.ToggleSliderViewandroid:id="@+id/brightness_slider"
- android:layout_width="0dp"
- android:layout_height="48dp"
- android:layout_gravity="center_vertical"
- android:layout_weight="1"
+ android:layout_width="match_parent"
+ android:layout_height="40dp"android:contentDescription="@string/accessibility_brightness"android:importantForAccessibility="no"
- systemui:text="@string/status_bar_settings_auto_brightness_label" />
+ systemui:text="@string/status_bar_settings_auto_brightness_label"
+ android:visibility="gone"/>
+ <!--liujunjie add -->
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="40dp"
+ android:orientation="horizontal">
+ <SeekBar
+ android:layout_width="0dp"
+ android:layout_weight="5"
+ android:layout_height="40dp"
+ android:id="@+id/seekbar3" />
+ <TextView
+ android:layout_weight="1"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:text="@string/str1"
+ android:gravity="center"/>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="40dp"
+ android:orientation="horizontal">
+ <SeekBar
+ android:layout_width="0dp"
+ android:layout_weight="5"
+ android:layout_height="40dp"
+ android:id="@+id/seekbar1" />
+ <TextView
+ android:layout_weight="1"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:text="@string/str2"
+ android:gravity="center"/>
+ </LinearLayout>
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="40dp"
+ android:orientation="horizontal">
+ <SeekBar
+ android:layout_width="0dp"
+ android:layout_weight="5"
+ android:layout_height="40dp"
+ android:id="@+id/seekbar2" />
+ <TextView
+ android:layout_weight="1"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:text="@string/str3"
+ android:gravity="center"/>
+ </LinearLayout>
+ <!--liujunjie add end -->
+</LinearLayout>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index a60b9d0..6a864e08 100755
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -20,6 +20,10 @@<resources xmlns:android="http://schemas.android.com/apk/res/android"xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"><string name="app_label" msgid="4811759950673118541">"系统界面"</string>
+ <string name="str1" msgid="4811759950673118544">"屏幕亮度"</string>
+ <string name="str2" msgid="4811759950673118545">"台灯亮度"</string>
+ <string name="str3" msgid="4811759950673118547">"台灯色温"</string>
+ <string name="quick_settings_dtbutton_unlocked_label" msgid="4811759950673118542">"台灯"</string><string name="status_bar_clear_all_button" msgid="2491321682873657397">"清除"</string><string name="status_bar_no_notifications_title" msgid="7812479124981107507">"无通知"</string><string name="status_bar_ongoing_events_title" msgid="3986169317496615446">"正在进行的"</string>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
old mode 100644
new mode 100755
index fcd47d4..6a32d03
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -106,7 +106,7 @@<!-- The default tiles to display in QuickSettings --><string name="quick_settings_tiles_default" translatable="false">
- wifi,bt,dnd,flashlight,rotation,battery,cell,airplane,cast,screenrecord
+ wifi,bt,tdbutton,airplane</string><!-- The minimum number of tiles to display in QuickSettings -->
@@ -114,7 +114,7 @@<!-- Tiles native to System UI. Order should match "quick_settings_tiles_default" --><string name="quick_settings_tiles_stock" translatable="false">
- wifi,cell,battery,dnd,flashlight,rotation,bt,airplane,location,hotspot,inversion,saver,dark,work,cast,night,screenrecord,reverse
+ wifi,cell,tdbutton,battery,dnd,flashlight,rotation,bt,airplane,location,hotspot,inversion,saver,dark,work,cast,night,screenrecord,reverse</string><!-- The tiles to display in QuickSettings -->
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
old mode 100644
new mode 100755
index f002a27..ae0fcca
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -426,6 +426,7 @@<dimen name="notification_panel_width">@dimen/match_parent</dimen><dimen name="brightness_mirror_height">48dp</dimen>
+ <dimen name="brightness_mirror_height1">80dp</dimen><!-- The width of the panel that holds the quick settings. --><dimen name="qs_panel_width">@dimen/notification_panel_width</dimen>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 7f2fbba..e65bdb2 100755
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -19,6 +19,11 @@<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"><!-- Name of the status bar as seen in the applications info settings page. [CHAR LIMIT=12] --><string name="app_label">System UI</string>
+ <string name="str1" >Screen brightness</string>
+ <string name="str2" >Lamp brightness</string>
+ <string name="str3" >Lamp color temperature</string>
+ <!--台灯-->
+ <string name="quick_settings_dtbutton_unlocked_label">DeskLamp</string><!-- The text for the button in the notification window-shade that clearsall of the currently visible notifications. [CHAR LIMIT=10]-->
diff --git a/packages/SystemUI/src/com/android/systemui/junjie/MySerialPortService.java b/packages/SystemUI/src/com/android/systemui/junjie/MySerialPortService.java
new file mode 100755
index 0000000..0df1efb
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/junjie/MySerialPortService.java
@@ -0,0 +1,204 @@
+package com.android.systemui.junjie;
+
+import android.app.Service;
+import android.content.Intent;
+import android.hardware.SerialPort;
+import android.os.Binder;
+import android.os.IBinder;
+import android.os.ParcelFileDescriptor;
+import android.util.Log;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+public class MySerialPortService extends Service {
+
+ public static final String port = "/dev/ttyS9";
+ private SerialPort serialPort;
+ private ParcelFileDescriptor parcelFileDescriptor;
+ private ByteBuffer dates = ByteBuffer.allocate(10);
+ public static final String TAG = "MySerialPortService";
+ private FileOutputStream mFileOutputStream;
+ private final IBinder mBinder = new MyBinder();
+
+ public void setStatusChange(StatusChange statusChange) {
+ this.statusChange = statusChange;
+ }
+
+ private StatusChange statusChange;
+
+ public MySerialPortService() {
+
+ }
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ Log.d(TAG, "启动service");
+ thread.start();
+
+ }
+
+ public byte[] getRealData(byte[] src){
+ byte[] res = new byte[src.length+1];
+ byte checkSum = 0x0 & 0xff;
+ for (int i = 0; i < src.length; i++) {
+ byte ui = src[i];
+ checkSum +=(ui&0xff);
+ res[i] = src[i];
+ }
+ checkSum = (byte) (checkSum%0x100);
+ res[src.length] = checkSum;
+ Log.d(TAG, "getRealData: checkSun" +checkSum);
+ return res;
+ }
+
+ /**
+ * 打开灯
+ * */
+ public void setPortOff() {
+ Log.d(TAG, "onReceive: 串口关闭");
+ byte[] setui = new byte[]{0x55,(byte) 0xaa,0x1,0x3,0x1,0x0} ;
+ Log.d(TAG, "setPortOff==" + mFileOutputStream);
+ setCommd(setui);
+
+ }
+ /**
+ * 关闭灯
+ * */
+ public void setPortON() {
+ byte[] setui = new byte[]{0x55,(byte) 0xaa,0x1,0x3,0x1,0x1};
+ Log.d(TAG, "setPortON==" + mFileOutputStream);
+ setCommd(setui);
+ }
+ /**
+ * 配置色温
+ */
+ public void setColorTemperature(int value){
+ //setPortON();
+ byte[] setui = new byte[]{0x55,(byte) 0xaa,0x1,0x5,0x1, (byte) (value&0xff)};
+ setCommd(setui);
+ Log.d(TAG, "setColorTemperature: "+value);
+
+
+ }
+
+ /**
+ * 配置亮度
+ */
+ public void setBrightness(int value){
+ //setPortON();
+ byte[] setui = new byte[]{0x55,(byte) 0xaa,0x1,0x4,0x1, (byte) (value&0xff)};
+ setCommd(setui);
+ Log.d(TAG, "setColorTemperature: "+value);
+ // queryState();
+ }
+
+ /**
+ * 查询状态
+ * */
+ public void queryState(){
+ byte[] setui = new byte[]{0x55,(byte) 0xaa,0x1,0x1,0x0} ;
+ setCommd(setui);
+
+
+ }
+
+ private void setCommd(byte[] su){
+ try {
+ if (mFileOutputStream != null) {
+ mFileOutputStream.write(getRealData(su));
+ }
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+
+ }
+
+
+
+
+ private final Thread thread = new Thread(new Runnable() {
+ @Override
+ public void run() {
+ serialPort = new SerialPort(port);
+ try {
+ parcelFileDescriptor = ParcelFileDescriptor.open(new File(port), ParcelFileDescriptor.MODE_READ_WRITE);
+ serialPort.open(parcelFileDescriptor, 9600);
+ mFileOutputStream = new FileOutputStream(parcelFileDescriptor.getFileDescriptor());
+ Log.d(TAG,"main Thread start "+mFileOutputStream);
+ writeThread.start();
+ while (true) {
+ Log.d(TAG, "run: 读取线程阻塞:");
+ int read = serialPort.read(dates);
+ readDate();
+ }
+
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+
+ }
+ });
+
+ private final Thread writeThread = new Thread(new Runnable() {
+ @Override
+ public void run() {
+ Log.d(TAG,"writeThread start "+mFileOutputStream);
+ if (mFileOutputStream != null){
+ //setColorTemperature(10);
+ //queryState();
+ }
+ }
+ });
+
+ private void readDate() {
+ byte[] by = dates.array();
+ /*for (byte b:
+ by) {
+ Log.d(TAG, "readDate: sts:"+b);
+ }*/
+ if (statusChange != null && by[3] == 0x2){
+ Log.d(TAG, "readDate: 读取数据 命令字段:"+by[3]+", 数据长度:"+by[4] +"开关状态:"+by[5]+" ,亮度值:"+by[6]+" ,色温值 :"+by[7]);
+ statusChange.dateSet(by[5]==1,by[6],by[7]);
+ }
+ }
+
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ // TODO: Return the communication channel to the service.
+ return mBinder;
+ }
+ public class MyBinder extends Binder {
+ public MySerialPortService getService() {
+ return MySerialPortService.this;
+ }
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ try {
+ mFileOutputStream.close();
+ serialPort.close();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+
+ }
+
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+
+ return super.onStartCommand(intent, START_STICKY, startId);
+ }
+
+ public interface StatusChange{
+ void dateSet(boolean status,int br,int color);
+ }
+
+
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
index a87a13c..3ce1e82 100755
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
@@ -46,6 +46,7 @@ import com.android.systemui.Dumpable;import com.android.systemui.R;import com.android.systemui.broadcast.BroadcastDispatcher;import com.android.systemui.dump.DumpManager;
+import com.android.systemui.junjie.MySerialPortService;import com.android.systemui.media.MediaHierarchyManager;import com.android.systemui.media.MediaHost;import com.android.systemui.plugins.qs.DetailAdapter;
@@ -63,6 +64,7 @@ import com.android.systemui.tuner.TunerService;import com.android.systemui.tuner.TunerService.Tunable;import com.android.systemui.util.animation.DisappearParameters;+import java.io.FileDescriptor;import java.io.PrintWriter;import java.util.ArrayList;
@@ -82,6 +84,14 @@ import android.content.IntentFilter;import android.content.BroadcastReceiver;import android.util.Log;+import android.widget.Button;
+import android.widget.SeekBar;
+import android.content.ServiceConnection;
+import android.os.IBinder;
+import android.database.ContentObserver;
+import android.provider.Settings;
+
+/** View that represents the quick settings tile panel (when expanded/pulled down). **/public class QSPanel extends LinearLayout implements Tunable, Callback, BrightnessMirrorListener,Dumpable {
@@ -160,6 +170,205 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightneprivate int mMediaTotalBottomMargin;private int mFooterMarginStartHorizontal;private Consumer<Boolean> mMediaVisibilityChangedListener;
+ // liujunjie add
+
+ private static MySerialPortService mySerialPortService;
+ private SeekBar seekBar1,seekBar2,seekBar3;
+ private static boolean isOn;
+ private int br;
+ private int color;
+ public static StatusChange statusChange2;
+
+ private final MySerialPortService.StatusChange statusChange = new MySerialPortService.StatusChange() {
+ @Override
+ public void dateSet(boolean status, int br1, int color1) {
+
+ br = br1;
+ color = color1;
+ seekBar1.setProgress(br1);
+ seekBar2.setProgress(color1);
+ if (isOn != status){
+ statusChange2.statusChange(status);
+ }
+ isOn = status;
+ //updateSeekStatus();
+
+
+ }
+ };
+ private void updateSeekStatus(){
+ if (isOn){
+ if (seekBar1.getVisibility() != View.VISIBLE){
+ seekBar1.setVisibility(View.VISIBLE);
+ seekBar2.setVisibility(View.VISIBLE);
+ }
+
+ }else {
+ if (seekBar1.getVisibility() != View.GONE){
+ seekBar1.setVisibility(View.GONE);
+ seekBar2.setVisibility(View.GONE);
+ }
+
+ }
+
+
+ }
+
+ public static void setStatusChange(QSPanel.StatusChange statusChange) {
+ statusChange2 = statusChange;
+ }
+
+ public interface StatusChange {
+ void statusChange(boolean status);
+ }
+
+ class BrightnessObserver extends ContentObserver {
+ private Context mContext;
+
+ public BrightnessObserver(Context context) {
+ super(null);
+ mContext = context;
+ }
+
+ @Override
+ public void onChange(boolean selfChange) {
+ super.onChange(selfChange);
+ if (!isMeTouch){
+
+ int brightness = Settings.System.getInt(
+ mContext.getContentResolver(),
+ Settings.System.SCREEN_BRIGHTNESS,
+ 0
+ );
+ handleBrightnessChange(brightness);
+
+ }
+
+
+
+ }
+ private void handleBrightnessChange(int brightness) {
+ int st = Math.round((float) brightness /255 * 100);
+ if (seekBar3 != null){
+ seekBar3.setProgress(st);
+ }
+ }
+ }
+ boolean isMeTouch = false;
+ private void junjieInit() {
+ Intent intent = new Intent(mContext, MySerialPortService.class);
+ mContext.bindService(intent,mConnection, Context.BIND_AUTO_CREATE);
+ seekBar1 = mBrightnessView.findViewById(R.id.seekbar1);
+ seekBar2 = mBrightnessView.findViewById(R.id.seekbar2);
+ seekBar3 = mBrightnessView.findViewById(R.id.seekbar3); // 屏幕亮度
+ seekBar1.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
+ @Override
+ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+ if (mySerialPortService != null && fromUser && progress != 0){
+ mySerialPortService.setBrightness(progress);
+ }
+
+ }
+
+ @Override
+ public void onStartTrackingTouch(SeekBar seekBar) {
+
+ }
+
+ @Override
+ public void onStopTrackingTouch(SeekBar seekBar) {
+
+ }
+ });
+ seekBar2.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
+ @Override
+ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+ if (mySerialPortService != null && fromUser){
+ mySerialPortService.setColorTemperature(progress);
+ }
+
+ }
+
+ @Override
+ public void onStartTrackingTouch(SeekBar seekBar) {
+
+ }
+
+ @Override
+ public void onStopTrackingTouch(SeekBar seekBar) {
+
+ }
+ });
+
+ seekBar3.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
+ @Override
+ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+ if (isMeTouch){
+ int st = Math.round((float) progress /100 * 255);
+ Settings.System.putInt(getContext().getContentResolver(),Settings.System.SCREEN_BRIGHTNESS,st);
+ }
+
+ }
+
+ @Override
+ public void onStartTrackingTouch(SeekBar seekBar) {
+ isMeTouch = true;
+
+ }
+
+ @Override
+ public void onStopTrackingTouch(SeekBar seekBar) {
+ isMeTouch = false;
+
+ }
+ });
+ initStatus();
+ int sy = Settings.System.getInt(getContext().getContentResolver(),Settings.System.SCREEN_BRIGHTNESS,0);
+ seekBar3.setProgress(sy);
+ }
+
+ private void initStatus() {
+ BrightnessObserver brightnessObserver = new BrightnessObserver(getContext());
+ getContext().getContentResolver().registerContentObserver(
+ Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS),
+ true,
+ brightnessObserver
+ );
+
+ }
+
+ public static void liujunjieClick() {
+ if (mySerialPortService != null){
+ if (isOn){
+ mySerialPortService.setPortOff();
+
+ }else {
+ mySerialPortService.setPortON();
+ }
+ isOn = !isOn;
+ }
+ }
+
+ public static boolean getDTStatus() {
+ return isOn;
+ }
+
+ private final ServiceConnection mConnection = new ServiceConnection() {
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ MySerialPortService.MyBinder binder = (MySerialPortService.MyBinder) service;
+ mySerialPortService = binder.getService();
+ mySerialPortService.setStatusChange(statusChange);
+ mySerialPortService.queryState();
+
+ }
+ @Override
+ public void onServiceDisconnected(ComponentName name) {
+ mySerialPortService = null;
+
+ }
+ };
+@@ -234,6 +443,8 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, BrightneaddView(mHorizontalLinearLayout, lp);initMediaHostState();
+ //junjieInit(); // liujunjie add
+ android.util.Log.d("liujunjie","========== 1111 junjieInit ========");}addSecurityFooter();if (mRegularTileLayout instanceof PagedTileLayout) {
@@ -261,6 +472,7 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, BrightneaddView(mBrightnessView);mBrightnessController = new BrightnessController(getContext(),findViewById(R.id.brightness_slider), mBroadcastDispatcher);
+ junjieInit();}protected QSTileLayout createRegularTileLayout() {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java
index f9bd43d..e235fb7 100755
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java
@@ -41,6 +41,7 @@ import com.android.systemui.qs.tiles.NfcTile;import com.android.systemui.qs.tiles.NightDisplayTile;import com.android.systemui.qs.tiles.RotationLockTile;import com.android.systemui.qs.tiles.ScreenRecordTile;
+import com.android.systemui.qs.tiles.TDButtonTile;import com.android.systemui.qs.tiles.UiModeNightTile;import com.android.systemui.qs.tiles.UserTile;import com.android.systemui.qs.tiles.WifiTile;
@@ -83,6 +84,8 @@ public class QSFactoryImpl implements QSFactory {private final Lazy<QSHost> mQsHostLazy;+ private final Provider<TDButtonTile> mTDButtonTileProvider;
+@Injectpublic QSFactoryImpl(Lazy<QSHost> qsHostLazy,Provider<WifiTile> wifiTileProvider,
@@ -105,7 +108,9 @@ public class QSFactoryImpl implements QSFactory {Provider<GarbageMonitor.MemoryTile> memoryTileProvider,Provider<UiModeNightTile> uiModeNightTileProvider,Provider<ScreenRecordTile> screenRecordTileProvider,
- Provider<EyeHealthTile> eyeHealthTileProvider) {
+ Provider<EyeHealthTile> eyeHealthTileProvider,
+ Provider<TDButtonTile> tDButtonTileProvider
+ ) {mQsHostLazy = qsHostLazy;mWifiTileProvider = wifiTileProvider;mBluetoothTileProvider = bluetoothTileProvider;
@@ -128,6 +133,7 @@ public class QSFactoryImpl implements QSFactory {mUiModeNightTileProvider = uiModeNightTileProvider;mScreenRecordTileProvider = screenRecordTileProvider;mEyeHealthTileProvider=eyeHealthTileProvider;
+ mTDButtonTileProvider = tDButtonTileProvider;}public QSTile createTile(String tileSpec) {
@@ -180,6 +186,8 @@ public class QSFactoryImpl implements QSFactory {return mUiModeNightTileProvider.get();case "screenrecord":return mScreenRecordTileProvider.get();
+ case "tdbutton":
+ return mTDButtonTileProvider.get();}diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/TDButtonTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/TDButtonTile.java
new file mode 100755
index 0000000..76581e3
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/TDButtonTile.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.qs.tiles;
+
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.provider.Settings;
+import android.service.quicksettings.Tile;
+import android.widget.Switch;
+
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.systemui.R;
+import com.android.systemui.plugins.qs.QSTile.BooleanState;
+import com.android.systemui.qs.QSHost;
+import com.android.systemui.qs.QSPanel;
+import com.android.systemui.qs.tileimpl.QSTileImpl;
+
+import javax.inject.Inject;
+
+/** Quick settings tile: Rotation **/
+public class TDButtonTile extends QSTileImpl<BooleanState> {
+
+ private final Icon mIcon = ResourceIcon.get(R.drawable.ic_qs_td_button);
+
+ @Inject
+ public TDButtonTile(QSHost host) {
+ super(host);
+ QSPanel.setStatusChange(new QSPanel.StatusChange(){
+ @Override
+ public void statusChange(boolean status){
+
+ refreshState();
+
+ }
+
+ });
+ }
+
+ @Override
+ public BooleanState newTileState() {
+ return new BooleanState();
+ }
+
+
+ @Override
+ protected void handleClick() {
+ final boolean newState = !mState.value;
+ QSPanel.liujunjieClick();
+ refreshState(newState);
+ }
+
+
+ @Override
+ public CharSequence getTileLabel() {
+ return getState().label;
+ }
+
+ @Override
+ protected void handleUpdateState(BooleanState state, Object arg) {
+
+ state.value = QSPanel.getDTStatus();
+ state.label = mContext.getString(R.string.quick_settings_dtbutton_unlocked_label);
+ state.icon = mIcon;
+ //tate.contentDescription = getAccessibilityString(rotationLocked);
+ //state.expandedAccessibilityClassName = Switch.class.getName();
+ state.state = state.value ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE;
+ }
+
+ @Override
+ public int getMetricsCategory() {
+ return 0;
+ }
+
+
+ @Override
+ protected void handleSetListening(boolean listening) {
+
+
+ }
+
+ @Override
+ public Intent getLongClickIntent() {
+ Intent homeIntent = new Intent(Intent.ACTION_MAIN);
+ homeIntent.addCategory(Intent.CATEGORY_HOME);xieuy
+ homeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ return homeIntent;
+ }
+
+}
协议链接
链接:https://pan.baidu.com/s/1kOmVpb5fEKO9FAkN4JsnhA?pwd=s56b
提取码:s56b
相关文章:
安卓11 SysteUI添加按钮以及下拉状态栏的色温调节按钮
最近客户想要做一个台灯产品,需要实现 串口调节台灯功能 ,其中包括 亮度调节 色温调节 开关 三个功能 话不多说,贴代码 diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml old mode 100644 new …...
SpringMVC启动与请求处理流程解析
目录 SpringMVC的基本结构 1.MVC简介 2.基本结构 什么是Handler? 什么是HandlerMapping? 什么是HandlerAdapter? RequestMapping方法参数解析 DispatcherServlet的init()方法 DispatcherServlet的doService()方法 SpringBoot整合SpringMVC …...
RabbitMQ案例
1. 导入依赖 <!--AMQP依赖,包含RabbitMQ--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency> 发送消息 注入RabbitTemplate Autowired RabbitT…...
前路漫漫,曙光在望 !
起始 从20年大一开始写作至今,转眼五年时光已经过去了,最开始在CSDN这个平台写博客也只是因为一次机缘巧合情况下得知写博客可以获取奖赏,所以那个时期开始疯狂在CSDN发文记录自己编程学习过程,但是至今也未从写作中获利一分哈…...
音视频-----RTSP协议 音视频编解码
流媒体协议详解:RTSP、RTP、RTCP、SIP、SDP、RTMP、WebRTC、WebSocket-CSDN博客 上文讲解比较清楚 多媒体编解码基础知识 一文详解WebRTC、RTSP、RTMP、SRT-腾讯云开发者社区-腾讯云 RTP :(Real-time Transport Protocol)是用于Internet上针对多媒体数据流的一种传…...
SpringMVC的消息转换器
SpringMVC的消息转换器(Message Converter)是Spring框架中用于处理HTTP请求和响应体与Java对象之间转换的组件。它们使得开发人员可以轻松地将HTTP请求的数据映射到方法参数,并将返回的对象转换为HTTP响应。 工作原理 当一个HTTP请求到达Spr…...
计算机网络练习题
学习这么多啦,那就简单写几个选择题巩固一下吧! 1. 在IPv4分组各字段中,以下最适合携带隐藏信息的是(D) A、源IP地址 B、版本 C、TTL D、标识 2. OSI 参考模型中,数据链路层的主要功能是(…...
本地测试文件解析
PostMapping("/test") public void test() throws IOException {Path csvFile Paths.get("D:\\test/27.csv");//虚拟机退出时删除临时文件csvFile.toFile().deleteOnExit();List<String> list Files.readAllLines(csvFile, Charset.forName("…...
websocket-sharp:.NET平台上的WebSocket客户端与服务器开源库
推荐一个C#开发的,实现WebSocket功能的开源项目。 01 项目简介 websocket-sharp提供 WebSocket 客户端和服务器库,基于 C# 开发的,并遵循 WebSocket 协议规范,使得开发人员能够轻松地在 .NET 应用程序中实现 WebSocket 通信。 …...
SwiftUI 撸码常见错误 2 例漫谈
概述 在 SwiftUI 日常撸码过程中,头发尚且还算茂盛的小码农们经常会犯这样那样的错误。虽然犯这些错的原因都很简单,但有时想要快速准确的定位它们却并不容易。 况且这些错误还可能在模拟器和 Xcode 预览(Preview)表现的行为不甚…...
回归预测 | MATLAB实现CNN-GRU卷积门控循环单元多输入单输出回归预测
回归预测 | MATLAB实现CNN-GRU卷积门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现CNN-GRU卷积门控循环单元多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现CNN-GRU卷积门控循环单元多输入单输出回归预测 数据准备&#x…...
Nginx常用配置之详解(Detailed Explanation of Common Nginx Configurations)
Nginx常用配置详解(图文全面总结) Nginx Nginx 是一款轻量级的高性能 HTTP、 和反向代理服务器。 Nginx,被广泛用于负载均衡、静态文件服务、和代理.........等。 Nginx,以高并发、低内存占用、和高可用性著称,大部分的大厂以及公司都在使…...
【PyTorch入门】 PyTorch不同优化器的比较
本次分享pytorch中几种常用的优化器,并进行互相比较。 PyTorch 优化器原理及优缺点分析 在 PyTorch 中,torch.optim 提供了多种优化器用于神经网络训练。每种优化器背后有不同的更新规则和机制,旨在适应不同的训练需求。以下是五种常见优化器…...
jest使用__mocks__设置模拟函数不生效 解决方案
模拟文件 // __mocks__/axios.js const axios jest.fn(); axios.get jest.fn(); axios.get.mockResolvedValue({data: {undoList: [get data],}, }); export default axios; 测试文件 jest.mock(axios); import Axios from axios;test(mytest, () > {console.log("…...
聆听音乐 1.5.9 | 畅听全网音乐,支持无损音质下载
聆听音乐手机版是面向广大音乐爱好者的移动应用程序,用户可以随时随地通过手机享受丰富的音乐资源。它提供了多种魅力功能,让用户在手机上畅享更舒适的音乐体验,每位用户都能享受精彩纷呈的收听体验。此外,软件还支持无损音质音乐…...
VMware去虚拟化
介绍两款用于去除VMware虚拟机虚拟化特征的工具,这些工具可以帮助用户在虚拟机中运行游戏时避免被游戏检测到虚拟机环境,从而防止游戏因检测到虚拟机而闪退。这些工具通过修改虚拟机的硬件信息(如硬盘、声卡、网卡、主板芯片组、显卡、主板信…...
汉王扫描王 2.9.16 |免费无广告的智能扫描软件,支持多种格式导出
汉王扫描王是一款功能全面的智能扫描软件,集成了文字识别、表格提取和文档转换等功能。它支持将文档转换为PDF、Word、Excel等多种格式,非常适合学生、教师、业务人员和财务工作者使用。该软件具备手机扫描仪功能,能够自动抠边、矫正文档&…...
毕设中所学
1、交叉引用 在毕业设计论文Word中交叉引用参考文献_交叉引用如何标注[1~6]-CSDN博客 另:将标号或其他文字改为上标的快捷键是CtrlShift。 图的交叉引用一样,修改引用类型即可。 2、ENVI安装 ENVI5.6 安装教程,新手入门(超详细…...
[微服务]分布式搜索Java客户端
快速入门 使用RestClient客户端进行数据搜索可以分为两步 构建并发起请求 代码解读: 第一步,创建SearchRequest对象,指定索引库名第二步,利用request.source()构建DSL,DSL中可以包含查询、分页、排序、高亮等 query…...
STM32 拓展 低功耗案例3:待机模式 (hal)
配置PA0的两种方式: 第一种 第二种 复制寄存器代码然后对其进行修改 mian.c /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program body…...
在Linux下安装部署Tomcat教程
摘要 Tomcat是由Apache开发的要给Servlet容器,实现了对Servlet 和JSP的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台,安全管理和Tomcat阀等。简单来说,Tomcat是一个由WEB应用程序的托管平台,可以让用户编写的WEB应用程序,别Tomcat所托管,并提供网…...
第5章 串行接口
8251A的基本特性 可用于同步和异步传送。 同步传送:5~8bit/字符,内同步或外同步,自动插入同步字符; 异步传送:5~8bit/字符,接收/发送时钟频率为通信波特率的1,16或64倍; 可产生中止字符、1,1.5,2位停止位。…...
Vue 百度地图 搜索框+点击地图获取坐标
本文通过vueele百度地图,实现点击地图获取坐标,或者搜索框智能联想下拉框,点击获取坐标及地图位置标点。 百度地图通过public文件夹下index.html,script方式 引入全局 代码如下: <template><div><div id"l-…...
Python学习路线
以下是一个Python详细学习路线: 一、入门阶段(第1 - 2个月) 环境搭建与基础语法 安装与配置: 从Python官方网站(Download Python | Python.org)下载适合自己操作系统的Python版本并进行安装。 配置环境变…...
Web Services 简介
Web Services 简介 1. 引言 Web Services 是一种基于网络的软件服务,它允许不同的应用程序在互联网上相互通信和交互。这种技术是基于开放的互联网标准,如HTTP、XML、SOAP和WSDL,使得不同平台和编程语言的应用程序能够轻松地实现互操作性。Web Services 的出现,极大地推动…...
option api compose api
option api & compose api <script setup> import { ref, computed } from vue; // 原始数据 const data ref([ { position: { x: 1, y: 2 } }, { position: { x: 3, y: 4 } }, { position: { x: 5, y: 6 } } ]); // 数据转换函数 const convertData …...
tcpdump的常见方法
详解tcpdump的使用方法:网络数据包捕获与分析 tcpdump是一个功能强大的命令行工具,用于捕获和分析通过网络接口传输的数据包。它广泛应用于网络故障诊断、网络安全监控和协议分析等领域。本文将详细介绍tcpdump的使用方法,包括安装、基本命令…...
【C语言】可移植性陷阱与缺陷(四):字符是有符号整数还是无符号整数
在 C 语言中,字符类型(char)是一个字节大小的整数类型,但它可以被编译器解释为有符号整数或无符号整数,这是一个容易导致可移植性问题的重要因素。这种解释的不确定性可能会在程序的逻辑、比较运算和数据处理等多个方面引发错误。 一、字符类型的默认行为 根据C语言标准…...
[Linux]进程间通信-管道
目录 1. 进程间通信 2.父子进程之间的通信 3.匿名管道 匿名管道的创建 管道读写的情况 管道的5种特性 4.命名管道 指令级 命名管道原理 代码级 读取端 1. 进程间通信 当我们有两个进程操作数据库的时候,一个进程负责写入操作,一个进…...
设置开机自启动的应用
设置开机自启动的应用 step1:按住ShiftctrlEsc step2:找到启动应用 step3:鼠标到启动那里,右键就可以禁用了...
QQ长截屏
QQ长截屏 第一步:CtrlAltA 第二步:点击剪刀之后,再滑动滚轮就可以了。 展示...
38 Opencv HOG特征检测
文章目录 HOGDescriptor 构造函数setSVMDetector 设置支持向量机(SVM)检测器,用于目标检测。compute 用于计算图像区域的HOG描述符。detectMultiScale 多尺度检测目标。示例 HOGDescriptor 构造函数 HOGDescriptor(); HOGDescriptor(const S…...
Segment Anything论文详细翻译【Part2:引言Introduction】
目录 写在前面 Introduction 第1段 第2段 第3段 第4段 第5段 第6段 第7段 第8段 第9段 第10段 第11段 第12段 Figure2 关键特点 图中具体内容 图例说明 写在前面 为啥要写这篇文章?因为找不到一篇写的特别好的【翻译并仔细解释】文章。网上大多千…...
Mac中配置Node.js前端vscode环境(第二期)
核心组件:vscode、谷歌浏览器、Node.js(重点)、git 一、Node.js安装(nvm安装) 点击macos中的终端,保持bash,而不是zsh 若为zsh,则可在终端中使用下面命令变成bash chsh -s /bin/…...
基于COT(Chain-of-Thought Prompt)的教学应用:如何通过思维链提示提升模型推理能力
引言 随着人工智能技术的快速发展,大型语言模型(LLMs)在自然语言处理领域展现出了强大的能力。然而,面对复杂的推理任务时,模型的表现往往不尽如人意,尤其是在需要多步逻辑推导的场景中。为了应对这一挑战…...
Python Notes 1 - introduction with the OpenAI API Development
Official document:https://platform.openai.com/docs/api-reference/chat/create 1. Use APIfox to call APIs 2.Use PyCharm to call APIs 2.1-1 WIN OS.Configure the Enviorment variable #HK代理环境,不需要科学上网(价格便宜、有安全风险&#…...
MySQL图形化界面工具--DataGrip
之前介绍了在命令行进行操作,但是不够直观,本次介绍图形化界面工具–DataGrip。 安装DataGrip 官网链接:官网下载链接 常规的软件安装流程。 参考链接:DataGrip安装 使用DataGrip 添加数据源: 第一次使用最下面会…...
WPF+Prism View与ViewModel绑定
1、开发环境,Win10VS2022.NET8Prism.DryIoc(9.0.537)或Prism.Unity。 2、通过NuGet安装Prism.DryIoc(9.0.537)或Prism.Unity。 2.1、创建ViewModels文件夹用于存放ViewModel文件、创建Views文件夹存放View文件。 将…...
关于Zotero
1、文献数据库: Zotero的安装 Zotero安装使用_zotero只能安装在c盘吗-CSDN博客 2、如何使用zotero插件 我刚下载的时候就结合使用的是下面的这两个博主的分享,感觉暂时是足够的。 Zotero入🚪基础 - 小红书 Green Frog申请easyscholar密钥…...
Luma AI 简单几步生成视频
简单几步生成视频 登录我们的 AceDataPlatform 网站,按照下图所示即可生成高质量的视频,同时,我们也提供了简单易用的 API 方便集成调用,可以查看 Luma API了解详情 技术介绍 我们使用了 Luma 的技术,实现了上面的图…...
从索尼爱立信手机打印短信的简单方法
昨天,我买了一部新手机来代替我的旧索尼爱立信Xperia,但手机上有很多珍贵的短信,是我男朋友发来的,我不想失去它们。然后我尝试打印它们,但我无法从我的索尼爱立信手机中取出它们。您有什么从索尼爱立信手机打印短信的…...
深入浅出梯度下降算法:快速抵达函数最小值的方法
引言 梯度是机器学习和优化领域中不可或缺的概念,它为我们提供了理解和调整多维空间中函数行为的工具。本文将详细介绍梯度的定义、性质,并通过具体的一元和多元函数案例展示如何使用梯度下降算法找到最佳参数。 一、梯度的基础知识 1.1 定义与计算 梯…...
OPC DA激活报错
报错提示: 解决办法: 查看Missing license keys,根据提示破解...
PyTorch到C++再到 CUDA 的调用链(C++ ATen 层) :以torch._amp_update_scale_调用为例
今天在看pytorch源码,遇到的问题,记录一下 。 source:/lib/python3.10/site-packages/torch/amp/grad_scaler.py torch._amp_update_scale_(_scale,_growth_tracker,found_inf_combined,self._growth_factor,self._backoff_factor,self._growth_interva…...
yolov5核查数据标注漏报和误报
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、误报二、漏报三、源码总结 前言 本文主要用于记录数据标注和模型预测之间的漏报和误报思想及其源码 提示:以下是本篇文章正文内容,…...
C# 设计模式概况
什么是设计模式 大家熟知的GOF23种设计模式,源自《Design Patterns: Elements of Reusable Object-Oriented Software》一书,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著,四人组Gang of Four简称GOF。总结了在面向…...
STM32 NOR FLASH(SPI FLASH)驱动移植(2)
2)FLASH 读取函数 /* * brief 读取 SPI FLASH * note 在指定地址开始读取指定长度的数据 * param pbuf : 数据存储区 * param addr : 开始读取的地址(最大 32bit) * param datalen : 要读取的字节数(最大 65535) * retval 无 */ void norflash_read(uint8_t *pbuf…...
Redis高可用集群部署
根据集群分析和持久化优化方式,这里用docker部署redis分片集群模式并设置为aof-rdb共用方式存储 准备 2核4G及以上服务器;安装好docker环境;配置docker镜像仓库(https://www.ecnfo.com:1443),因为下面镜像是从这个镜像仓库下载的{"builder": {"gc"…...
【玩转23种Java设计模式】行为型模式篇:命令模式
软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 汇总目录链接&…...
代码随想录算法【Day10】
今日只做一题,剩下的题后面补 232.用栈实现队列 class MyQueue { public:stack<int> stIn;stack<int> stOut;/** Initialize your data structure here. */MyQueue() {}/** Push element x to the back of queue. */void push(int x) {stIn.push(x);}…...