From db4f4c7955adc0d9fcb9f3f27e785a0140b165cf Mon Sep 17 00:00:00 2001 From: Zhanghu Date: Thu, 11 Sep 2025 18:27:44 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9F=BA=E6=9C=ACOK?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app_dashboard/build.gradle | 1 + app_dashboard/src/main/AndroidManifest.xml | 11 +- .../dashboard/BuildingDashboardActivity.java | 177 ++++++------------ .../java/cn/ykbox/dashboard/DataBean.java | 34 ---- .../ykbox/dashboard/FullscreenActivity.java | 160 ++++++++++++++++ .../cn/ykbox/dashboard/GalleryActivity.java | 5 +- .../cn/ykbox/dashboard/SettingsActivity.java | 33 ++++ .../cn/ykbox/dashboard/StartActivity.java | 2 + .../cn/ykbox/dashboard/data/BannerBean.java | 36 ++++ .../layout/activity_building_dashboard.xml | 18 +- .../src/main/res/layout/settings_activity.xml | 9 + app_dashboard/src/main/res/values/arrays.xml | 12 ++ app_dashboard/src/main/res/values/strings.xml | 16 ++ .../src/main/res/xml/root_preferences.xml | 9 + 14 files changed, 350 insertions(+), 173 deletions(-) delete mode 100644 app_dashboard/src/main/java/cn/ykbox/dashboard/DataBean.java create mode 100644 app_dashboard/src/main/java/cn/ykbox/dashboard/FullscreenActivity.java create mode 100644 app_dashboard/src/main/java/cn/ykbox/dashboard/SettingsActivity.java create mode 100644 app_dashboard/src/main/java/cn/ykbox/dashboard/data/BannerBean.java create mode 100644 app_dashboard/src/main/res/layout/settings_activity.xml create mode 100644 app_dashboard/src/main/res/values/arrays.xml create mode 100644 app_dashboard/src/main/res/xml/root_preferences.xml diff --git a/app_dashboard/build.gradle b/app_dashboard/build.gradle index e3b38de..723710b 100644 --- a/app_dashboard/build.gradle +++ b/app_dashboard/build.gradle @@ -41,6 +41,7 @@ dependencies { implementation libs.material implementation libs.activity implementation libs.constraintlayout + implementation libs.preference testImplementation libs.junit androidTestImplementation libs.ext.junit androidTestImplementation libs.espresso.core diff --git a/app_dashboard/src/main/AndroidManifest.xml b/app_dashboard/src/main/AndroidManifest.xml index a1f4cb0..fcaa8b9 100644 --- a/app_dashboard/src/main/AndroidManifest.xml +++ b/app_dashboard/src/main/AndroidManifest.xml @@ -1,13 +1,20 @@ + + + android:theme="@style/Theme.Dashboard" + android:usesCleartextTraffic="true"> + + android:exported="true" /> = 30) { - mContentView.getWindowInsetsController().hide( - WindowInsets.Type.statusBars() | WindowInsets.Type.navigationBars()); - } else { - // Note that some of these constants are new as of API 16 (Jelly Bean) - // and API 19 (KitKat). It is safe to use them, as they are inlined - // at compile-time and do nothing on earlier devices. - mContentView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE - | View.SYSTEM_UI_FLAG_FULLSCREEN - | View.SYSTEM_UI_FLAG_LAYOUT_STABLE - | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY - | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION - | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION); - } - } - }; - private View mControlsView; - private final Runnable mShowPart2Runnable = new Runnable() { - @Override - public void run() { - // Delayed display of UI elements - ActionBar actionBar = getSupportActionBar(); - if (actionBar != null) { - actionBar.show(); - } - mControlsView.setVisibility(View.VISIBLE); - } - }; - private boolean mVisible; - private final Runnable mHideRunnable = new Runnable() { - @Override - public void run() { - hide(); - } - }; /** * Touch listener to use for in-layout UI controls to delay hiding the * system UI. This is to prevent the jarring behavior of controls going away @@ -103,86 +55,65 @@ public class BuildingDashboardActivity extends AppCompatActivity { } }; private ActivityBuildingDashboardBinding binding; + /// ActivityResultLauncher 用于处理设置页面的返回结果 + private ActivityResultLauncher settingsLauncher; @Override protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - binding = ActivityBuildingDashboardBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); - mVisible = true; - mControlsView = binding.fullscreenContentControls; - mContentView = binding.fullscreenContent; + super.setViews(binding.webview, binding.fullscreenContentControls); + super.onCreate(savedInstanceState); - // Set up the user interaction to manually show or hide the system UI. - mContentView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - toggle(); - } - }); + // 初始化 ActivityResultLauncher + initSettingsLauncher(); + setupWebView(); // Upon interacting with UI controls, delay any scheduled hide() // operations to prevent the jarring behavior of controls going away // while interacting with the UI. - binding.dummyButton.setOnTouchListener(mDelayHideTouchListener); + binding.settingsButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + // 打开设置界面 + openSettingsActivity(); + } + }); } @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); + protected void onResume() { + super.onResume(); - // Trigger the initial hide() shortly after the activity has been - // created, to briefly hint to the user that UI controls - // are available. - delayedHide(100); - } - - private void toggle() { - if (mVisible) { - hide(); - } else { - show(); - } - } - - private void hide() { - // Hide UI first - ActionBar actionBar = getSupportActionBar(); - if (actionBar != null) { - actionBar.hide(); - } - mControlsView.setVisibility(View.GONE); - mVisible = false; - - // Schedule a runnable to remove the status and navigation bar after a delay - mHideHandler.removeCallbacks(mShowPart2Runnable); - mHideHandler.postDelayed(mHidePart2Runnable, UI_ANIMATION_DELAY); - } - - private void show() { - // Show the system bar - if (Build.VERSION.SDK_INT >= 30) { - mContentView.getWindowInsetsController().show( - WindowInsets.Type.statusBars() | WindowInsets.Type.navigationBars()); - } else { - mContentView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN - | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); - } - mVisible = true; - - // Schedule a runnable to display UI elements after a delay - mHideHandler.removeCallbacks(mHidePart2Runnable); - mHideHandler.postDelayed(mShowPart2Runnable, UI_ANIMATION_DELAY); + SharedPreferences pre = PreferenceManager.getDefaultSharedPreferences(this); + String url = pre.getString("k_url", "http://10.1.58.176:8002"); + binding.webview.loadUrl(url); // 加载网页 } /** - * Schedules a call to hide() in delay milliseconds, canceling any - * previously scheduled calls. + * 初始化设置页面的 ActivityResultLauncher */ - private void delayedHide(int delayMillis) { - mHideHandler.removeCallbacks(mHideRunnable); - mHideHandler.postDelayed(mHideRunnable, delayMillis); + private void initSettingsLauncher() { + settingsLauncher = registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), + result -> { + + } + ); + } + + /** + * 打开设置页面 + */ + private void openSettingsActivity() { + Intent intent = new Intent(this, SettingsActivity.class); + settingsLauncher.launch(intent); + } + + private void setupWebView() { + binding.webview.getSettings().setJavaScriptEnabled(true); // 启用 JavaScript + binding.webview.setWebViewClient(new WebViewClient()); // 防止跳转到外部浏览器 + } } \ No newline at end of file diff --git a/app_dashboard/src/main/java/cn/ykbox/dashboard/DataBean.java b/app_dashboard/src/main/java/cn/ykbox/dashboard/DataBean.java deleted file mode 100644 index 8971756..0000000 --- a/app_dashboard/src/main/java/cn/ykbox/dashboard/DataBean.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.ykbox.dashboard; - -import java.util.ArrayList; -import java.util.List; - -public class DataBean { - public Integer imageRes; - public String imageUrl; - public String title; - public int viewType; - - public DataBean(Integer imageRes, String title, int viewType) { - this.imageRes = imageRes; - this.title = title; - this.viewType = viewType; - } - - public DataBean(String imageUrl, String title, int viewType) { - this.imageUrl = imageUrl; - this.title = title; - this.viewType = viewType; - } - - public static List getTestData() { - List list = new ArrayList<>(); - list.add(new DataBean(R.drawable.image1, "第3代无线智能中控", 1)); - list.add(new DataBean(R.drawable.image2, "智慧班牌", 3)); - list.add(new DataBean(R.drawable.image3, "无线话筒", 3)); - list.add(new DataBean(R.drawable.image4, "可移动式智能讲桌", 1)); - list.add(new DataBean(R.drawable.image5, "TD2+智慧屏集成讲桌", 1)); - list.add(new DataBean(R.drawable.image6, "TD5+智慧屏集成讲台", 3)); - return list; - } -} diff --git a/app_dashboard/src/main/java/cn/ykbox/dashboard/FullscreenActivity.java b/app_dashboard/src/main/java/cn/ykbox/dashboard/FullscreenActivity.java new file mode 100644 index 0000000..44f3160 --- /dev/null +++ b/app_dashboard/src/main/java/cn/ykbox/dashboard/FullscreenActivity.java @@ -0,0 +1,160 @@ +package cn.ykbox.dashboard; + +import android.annotation.SuppressLint; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.util.Log; +import android.view.MotionEvent; +import android.view.View; +import android.view.WindowInsets; + +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; + +public class FullscreenActivity extends AppCompatActivity { + private final static String TAG = "FullscreenActivity"; + /** + * Some older devices needs a small delay between UI widget updates + * and a change of the status and navigation bar. + */ + private static final int UI_ANIMATION_DELAY = 300; + private final Handler mHideHandler = new Handler(Looper.myLooper()); + private View mContentView; + private final Runnable mHidePart2Runnable = new Runnable() { + @SuppressLint("InlinedApi") + @Override + public void run() { + // Delayed removal of status and navigation bar + if (Build.VERSION.SDK_INT >= 30) { + mContentView.getWindowInsetsController().hide( + WindowInsets.Type.statusBars() | WindowInsets.Type.navigationBars()); + } else { + // Note that some of these constants are new as of API 16 (Jelly Bean) + // and API 19 (KitKat). It is safe to use them, as they are inlined + // at compile-time and do nothing on earlier devices. + mContentView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE + | View.SYSTEM_UI_FLAG_FULLSCREEN + | View.SYSTEM_UI_FLAG_LAYOUT_STABLE + | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION); + } + } + }; + private View mControlsView; + private final Runnable mShowPart2Runnable = new Runnable() { + @Override + public void run() { + // Delayed display of UI elements + ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.show(); + } + mControlsView.setVisibility(View.VISIBLE); + } + }; + private boolean mVisible; + private final Runnable mHideRunnable = new Runnable() { + @Override + public void run() { + hide(); + } + }; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mVisible = true; + + // Set up the user interaction to manually show or hide the system UI. +// mContentView.setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View view) { +// toggle(); +// } +// }); + + mContentView.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View view, MotionEvent motionEvent) { + switch (motionEvent.getAction()) { + case MotionEvent.ACTION_DOWN: + toggle(); + break; + case MotionEvent.ACTION_UP: + view.performClick(); + break; + default: + break; + } + return false; + } + }); + } + + @Override + protected void onPostCreate(Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + + // Trigger the initial hide() shortly after the activity has been + // created, to briefly hint to the user that UI controls + // are available. + delayedHide(100); + } + + private void toggle() { + Log.d(TAG, "toggle, mVisible=" + mVisible); + if (mVisible) { + hide(); + } else { + show(); + delayedHide(30000); + } + } + + private void hide() { + // Hide UI first + ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.hide(); + } + mControlsView.setVisibility(View.GONE); + mVisible = false; + + // Schedule a runnable to remove the status and navigation bar after a delay + mHideHandler.removeCallbacks(mShowPart2Runnable); + mHideHandler.postDelayed(mHidePart2Runnable, UI_ANIMATION_DELAY); + } + + private void show() { + // Show the system bar + if (Build.VERSION.SDK_INT >= 30) { + mContentView.getWindowInsetsController().show( + WindowInsets.Type.statusBars() | WindowInsets.Type.navigationBars()); + } else { + mContentView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); + } + mVisible = true; + + // Schedule a runnable to display UI elements after a delay + mHideHandler.removeCallbacks(mHidePart2Runnable); + mHideHandler.postDelayed(mShowPart2Runnable, UI_ANIMATION_DELAY); + } + + /** + * Schedules a call to hide() in delay milliseconds, canceling any + * previously scheduled calls. + */ + protected void delayedHide(int delayMillis) { + mHideHandler.removeCallbacks(mHideRunnable); + mHideHandler.postDelayed(mHideRunnable, delayMillis); + } + + protected void setViews(View contentView, View controlsView) { + mContentView = contentView; + mControlsView = controlsView; + } +} \ No newline at end of file diff --git a/app_dashboard/src/main/java/cn/ykbox/dashboard/GalleryActivity.java b/app_dashboard/src/main/java/cn/ykbox/dashboard/GalleryActivity.java index 88a0ff1..7b3b65b 100644 --- a/app_dashboard/src/main/java/cn/ykbox/dashboard/GalleryActivity.java +++ b/app_dashboard/src/main/java/cn/ykbox/dashboard/GalleryActivity.java @@ -13,6 +13,7 @@ import com.youth.banner.adapter.BannerImageAdapter; import com.youth.banner.holder.BannerImageHolder; import com.youth.banner.indicator.CircleIndicator; +import cn.ykbox.dashboard.data.BannerBean; import cn.ykbox.dashboard.databinding.ActivityGalleryBinding; /** @@ -37,9 +38,9 @@ public class GalleryActivity extends BaseActivity { binding = ActivityGalleryBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); - binding.banner.setAdapter(new BannerImageAdapter(DataBean.getTestData()) { + binding.banner.setAdapter(new BannerImageAdapter(BannerBean.getTestData()) { @Override - public void onBindView(BannerImageHolder holder, DataBean data, int position, int size) { + public void onBindView(BannerImageHolder holder, BannerBean data, int position, int size) { Log.d("fullshow", "load" + data.imageRes); Glide.with(holder.itemView) .load(data.imageRes) diff --git a/app_dashboard/src/main/java/cn/ykbox/dashboard/SettingsActivity.java b/app_dashboard/src/main/java/cn/ykbox/dashboard/SettingsActivity.java new file mode 100644 index 0000000..4e17d66 --- /dev/null +++ b/app_dashboard/src/main/java/cn/ykbox/dashboard/SettingsActivity.java @@ -0,0 +1,33 @@ +package cn.ykbox.dashboard; + +import android.os.Bundle; + +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.preference.PreferenceFragmentCompat; + +public class SettingsActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.settings_activity); + if (savedInstanceState == null) { + getSupportFragmentManager() + .beginTransaction() + .replace(R.id.settings, new SettingsFragment()) + .commit(); + } + ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(true); + } + } + + public static class SettingsFragment extends PreferenceFragmentCompat { + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + setPreferencesFromResource(R.xml.root_preferences, rootKey); + } + } +} \ No newline at end of file diff --git a/app_dashboard/src/main/java/cn/ykbox/dashboard/StartActivity.java b/app_dashboard/src/main/java/cn/ykbox/dashboard/StartActivity.java index 5b418e2..8e2b0ba 100644 --- a/app_dashboard/src/main/java/cn/ykbox/dashboard/StartActivity.java +++ b/app_dashboard/src/main/java/cn/ykbox/dashboard/StartActivity.java @@ -32,6 +32,8 @@ public class StartActivity extends AppCompatActivity { Intent myIntent = new Intent(mContext, BuildingDashboardActivity.class); myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); mContext.startActivity(myIntent); + + finish(); } }, 3000); } diff --git a/app_dashboard/src/main/java/cn/ykbox/dashboard/data/BannerBean.java b/app_dashboard/src/main/java/cn/ykbox/dashboard/data/BannerBean.java new file mode 100644 index 0000000..39cdd3f --- /dev/null +++ b/app_dashboard/src/main/java/cn/ykbox/dashboard/data/BannerBean.java @@ -0,0 +1,36 @@ +package cn.ykbox.dashboard.data; + +import java.util.ArrayList; +import java.util.List; + +import cn.ykbox.dashboard.R; + +public class BannerBean { + public Integer imageRes; + public String imageUrl; + public String title; + public int viewType; + + public BannerBean(Integer imageRes, String title, int viewType) { + this.imageRes = imageRes; + this.title = title; + this.viewType = viewType; + } + + public BannerBean(String imageUrl, String title, int viewType) { + this.imageUrl = imageUrl; + this.title = title; + this.viewType = viewType; + } + + public static List getTestData() { + List list = new ArrayList<>(); + list.add(new BannerBean(R.drawable.image1, "第3代无线智能中控", 1)); + list.add(new BannerBean(R.drawable.image2, "智慧班牌", 3)); + list.add(new BannerBean(R.drawable.image3, "无线话筒", 3)); + list.add(new BannerBean(R.drawable.image4, "可移动式智能讲桌", 1)); + list.add(new BannerBean(R.drawable.image5, "TD2+智慧屏集成讲桌", 1)); + list.add(new BannerBean(R.drawable.image6, "TD5+智慧屏集成讲台", 3)); + return list; + } +} diff --git a/app_dashboard/src/main/res/layout/activity_building_dashboard.xml b/app_dashboard/src/main/res/layout/activity_building_dashboard.xml index 9ef558a..015b309 100644 --- a/app_dashboard/src/main/res/layout/activity_building_dashboard.xml +++ b/app_dashboard/src/main/res/layout/activity_building_dashboard.xml @@ -10,16 +10,12 @@ - + android:keepScreenOn="true"/> @@ -36,15 +32,13 @@ android:layout_gravity="bottom|center_horizontal" android:orientation="horizontal" tools:ignore="UselessParent"> -