From bbf6a6280445542d09ab7e15234b8a305e8f7b00 Mon Sep 17 00:00:00 2001 From: huangwei <983142558@qq.com> Date: Sat, 17 Aug 2024 12:10:13 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 1 + app/libs/colorful-release.aar | Bin 42670 -> 0 bytes app/src/main/java/com/project/survey/App.java | 4 +- .../survey/ui/base/BaseSurveyNewActivity.java | 4 +- .../survey/ui/home/InstrumentFragment.kt | 3 + .../BingCeCoordinateSystemActivity.java | 1 + .../base/AbstractRtkPointCorrectActivity.java | 2 + .../satellitosis/SatelliteStatusActivity.java | 2 +- .../pointlofting/PointStakingActivity.java | 2 +- .../measure/PointSurveyNewActivity.java | 9 +- .../util/SurveyToolBarClickListenerUtils.java | 4 +- .../survey/util/BaseSurveyActivityUtils.java | 2 +- .../survey/util/DeviceConnectUtil.java | 104 +++++ .../main/res/drawable/icon_menu_sideslip.xml | 5 + .../res/layout/activity_base_survey_new.xml | 370 +++++++++++++++ .../res/layout/activity_satellite_status.xml | 88 ++++ colorful/.gitignore | 1 + colorful/build.gradle | 44 ++ colorful/proguard-rules.pro | 17 + colorful/src/main/AndroidManifest.xml | 5 + colorful/src/main/java/color/Rcolor.java | 175 ++++++++ colorful/src/main/java/color/Rdrawable.java | 9 + colorful/src/main/java/color/Rid.java | 18 + colorful/src/main/java/color/Rlayout.java | 18 + colorful/src/main/java/color/Rstring.java | 9 + colorful/src/main/java/color/Rstyle.java | 13 + colorful/src/main/java/color/Rstyleable.java | 17 + .../org/polaric/colorful/CircularView.java | 54 +++ .../polaric/colorful/ColorPickerAdapter.java | 58 +++ .../polaric/colorful/ColorPickerDialog.java | 64 +++ .../colorful/ColorPickerPreference.java | 62 +++ .../java/org/polaric/colorful/Colorful.java | 196 ++++++++ .../polaric/colorful/ColorfulActivity.java | 75 ++++ .../org/polaric/colorful/ThemeDelegate.java | 58 +++ .../main/java/org/polaric/colorful/Util.java | 6 + .../res/drawable/ic_arrow_back_white_48px.xml | 4 + .../src/main/res/layout/adapter_coloritem.xml | 8 + .../main/res/layout/dialog_colorpicker.xml | 22 + .../res/layout/preference_colorpicker.xml | 40 ++ colorful/src/main/res/values/attrs.xml | 7 + colorful/src/main/res/values/colors.xml | 311 +++++++++++++ colorful/src/main/res/values/strings.xml | 3 + colorful/src/main/res/values/styles.xml | 420 ++++++++++++++++++ settings.gradle | 1 + 44 files changed, 2299 insertions(+), 17 deletions(-) delete mode 100644 app/libs/colorful-release.aar create mode 100644 app/src/main/java/com/project/survey/util/DeviceConnectUtil.java create mode 100644 app/src/main/res/drawable/icon_menu_sideslip.xml create mode 100644 app/src/main/res/layout/activity_base_survey_new.xml create mode 100644 app/src/main/res/layout/activity_satellite_status.xml create mode 100644 colorful/.gitignore create mode 100644 colorful/build.gradle create mode 100644 colorful/proguard-rules.pro create mode 100644 colorful/src/main/AndroidManifest.xml create mode 100644 colorful/src/main/java/color/Rcolor.java create mode 100644 colorful/src/main/java/color/Rdrawable.java create mode 100644 colorful/src/main/java/color/Rid.java create mode 100644 colorful/src/main/java/color/Rlayout.java create mode 100644 colorful/src/main/java/color/Rstring.java create mode 100644 colorful/src/main/java/color/Rstyle.java create mode 100644 colorful/src/main/java/color/Rstyleable.java create mode 100644 colorful/src/main/java/org/polaric/colorful/CircularView.java create mode 100644 colorful/src/main/java/org/polaric/colorful/ColorPickerAdapter.java create mode 100644 colorful/src/main/java/org/polaric/colorful/ColorPickerDialog.java create mode 100644 colorful/src/main/java/org/polaric/colorful/ColorPickerPreference.java create mode 100644 colorful/src/main/java/org/polaric/colorful/Colorful.java create mode 100644 colorful/src/main/java/org/polaric/colorful/ColorfulActivity.java create mode 100644 colorful/src/main/java/org/polaric/colorful/ThemeDelegate.java create mode 100644 colorful/src/main/java/org/polaric/colorful/Util.java create mode 100644 colorful/src/main/res/drawable/ic_arrow_back_white_48px.xml create mode 100644 colorful/src/main/res/layout/adapter_coloritem.xml create mode 100644 colorful/src/main/res/layout/dialog_colorpicker.xml create mode 100644 colorful/src/main/res/layout/preference_colorpicker.xml create mode 100644 colorful/src/main/res/values/attrs.xml create mode 100644 colorful/src/main/res/values/colors.xml create mode 100644 colorful/src/main/res/values/strings.xml create mode 100644 colorful/src/main/res/values/styles.xml diff --git a/app/build.gradle b/app/build.gradle index 1905399..cc4d3df 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -150,6 +150,7 @@ dependencies { implementation Libs.unCrop implementation Libs.webChatSdk implementation Libs.xxPermissions + implementation project(':colorful') annotationProcessor AndroidX.Room.compiler annotationProcessor Libs.Glide.compiler diff --git a/app/libs/colorful-release.aar b/app/libs/colorful-release.aar deleted file mode 100644 index f44c8eb065234e69caebb0ba27a21399c5fac5fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42670 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 { override fun initView() { mBinding.tvConnectTSActivity.setOnClickListener { + //全站仪联机 ConnectTSActivity.start(requireContext()) } mBinding.tvConnectRtkActivity.setOnClickListener { + //RTK联机 ConnectRtkActivity.start(this) } mBinding.tvSatelliteStatusActivity.setOnClickListener { + //卫星状态 startActivity(Intent(requireContext(), SatelliteStatusActivity::class.java)) } mBinding.tvTotalStationSetupStation.setOnClickListener { diff --git a/app/src/main/java/com/project/survey/ui/instrument/coordinatesystem/BingCeCoordinateSystemActivity.java b/app/src/main/java/com/project/survey/ui/instrument/coordinatesystem/BingCeCoordinateSystemActivity.java index dcb6369..3310b35 100644 --- a/app/src/main/java/com/project/survey/ui/instrument/coordinatesystem/BingCeCoordinateSystemActivity.java +++ b/app/src/main/java/com/project/survey/ui/instrument/coordinatesystem/BingCeCoordinateSystemActivity.java @@ -31,6 +31,7 @@ public class BingCeCoordinateSystemActivity extends AutoLandscapeBingCeActivity ActivityCoordinateSystemBinding binding = ActivityCoordinateSystemBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); Toolbar mToolbar = findViewById(R.id.toolbar); + mToolbar.setTitle(R.string.coordinate_system); setSupportActionBar(mToolbar); if (getSupportActionBar() != null) getSupportActionBar().setDisplayHomeAsUpEnabled(true); diff --git a/app/src/main/java/com/project/survey/ui/instrument/mobilestationmode/base/AbstractRtkPointCorrectActivity.java b/app/src/main/java/com/project/survey/ui/instrument/mobilestationmode/base/AbstractRtkPointCorrectActivity.java index 557a011..e5b0161 100644 --- a/app/src/main/java/com/project/survey/ui/instrument/mobilestationmode/base/AbstractRtkPointCorrectActivity.java +++ b/app/src/main/java/com/project/survey/ui/instrument/mobilestationmode/base/AbstractRtkPointCorrectActivity.java @@ -38,6 +38,7 @@ import com.bingce.device.ui.coordinatesystem.event.UpdateCoordinateSystemEvent; import com.bingce.utils.IOnSingleGetCallback; import com.bingce.utils.ThreadPoolUtil; import com.bingce.utils.Util; +import com.project.survey.R; import org.greenrobot.eventbus.EventBus; import org.polaric.colorful.ColorfulActivity; @@ -69,6 +70,7 @@ public abstract class AbstractRtkPointCorrectActivity extends ColorfulActivity { super.onCreate(savedInstanceState); setContentView(Rlayout.activity_point_correct()); bindView(); + mToolbar.setTitle(R.string.point_correction); setSupportActionBar(mToolbar); if (getSupportActionBar() != null) getSupportActionBar().setDisplayHomeAsUpEnabled(true); diff --git a/app/src/main/java/com/project/survey/ui/instrument/satellitosis/SatelliteStatusActivity.java b/app/src/main/java/com/project/survey/ui/instrument/satellitosis/SatelliteStatusActivity.java index c18f0ae..a5bd928 100644 --- a/app/src/main/java/com/project/survey/ui/instrument/satellitosis/SatelliteStatusActivity.java +++ b/app/src/main/java/com/project/survey/ui/instrument/satellitosis/SatelliteStatusActivity.java @@ -6,7 +6,6 @@ import android.view.MenuItem; import android.view.View; import com.bingce.device.Device; -import com.bingce.device.ui.databinding.ActivitySatelliteStatusBinding; import com.bingce.rtk.command.RTK; import com.bingce.rtk.command.geomax.GeoMaxRTK; import com.bingce.rtk.enums.SateSystemEnum; @@ -14,6 +13,7 @@ import com.bingce.rtk.model.GnssPosition; import com.bingce.rtk.parser.nmea0183.SatInfo; import com.bingce.rtk.parser.nmea0183.SatelliteData; import com.project.survey.R; +import com.project.survey.databinding.ActivitySatelliteStatusBinding; import com.project.survey.ui.base.BaseSurveyNewActivity; diff --git a/app/src/main/java/com/project/survey/ui/lofting/pointlofting/PointStakingActivity.java b/app/src/main/java/com/project/survey/ui/lofting/pointlofting/PointStakingActivity.java index df8f1b0..70ece01 100644 --- a/app/src/main/java/com/project/survey/ui/lofting/pointlofting/PointStakingActivity.java +++ b/app/src/main/java/com/project/survey/ui/lofting/pointlofting/PointStakingActivity.java @@ -46,7 +46,6 @@ import com.bingce.road.move.MoveK; import com.bingce.road.move.MoveLeftRight; import com.bingce.surveyor.agentweb.HelpWebActivity; import com.bingce.surveyor.util.ConstUtils; -import com.bingce.surveyor.util.DeviceConnectUtil; import com.bingce.surveyor.util.PreferencesUtil; import com.bingce.surveyor.util.SurveyLimitCheckUtils; import com.bingce.surveyor.util.SurveyRemarksUtils; @@ -73,6 +72,7 @@ import com.project.survey.ui.lofting.pointlofting.record.RecordsActivity; import com.project.survey.ui.lofting.pointlofting.record.util.RecordTypeConstants; import com.project.survey.ui.pointmeasure.measure.util.SurveyToolBarClickListenerUtils; import com.project.survey.util.CommonUtils; +import com.project.survey.util.DeviceConnectUtil; import com.project.survey.util.DrawableUtils; import com.project.survey.util.SurveyUIUtils; diff --git a/app/src/main/java/com/project/survey/ui/pointmeasure/measure/PointSurveyNewActivity.java b/app/src/main/java/com/project/survey/ui/pointmeasure/measure/PointSurveyNewActivity.java index f035722..db6b725 100644 --- a/app/src/main/java/com/project/survey/ui/pointmeasure/measure/PointSurveyNewActivity.java +++ b/app/src/main/java/com/project/survey/ui/pointmeasure/measure/PointSurveyNewActivity.java @@ -39,15 +39,9 @@ import com.bingce.coordlib.model.Blh; import com.bingce.coordlib.model.Coordinate; import com.bingce.coordlib.util.CoordUtil; import com.bingce.data.DeviceInfoData; -import com.bingce.data.cache.CachedCurrentJob; -import com.bingce.data.cache.CachedCurrentRoad; -import com.bingce.data.cache.CachedProject; import com.bingce.data.database.CodeDb; import com.bingce.data.database.DBQueryConstant; -import com.bingce.data.database.JobDb; import com.bingce.data.database.PointDb; -import com.bingce.data.surveyor.designdata.job.JobConstants; -import com.bingce.data.surveyor.designdata.job.JobRecord; import com.bingce.data.surveyor.surveydata.code.CodeConstants; import com.bingce.data.surveyor.surveydata.code.CodeRecord; import com.bingce.data.surveyor.surveydata.pointsurvey.PointConstants; @@ -55,12 +49,10 @@ import com.bingce.data.surveyor.surveydata.pointsurvey.PointRecord; import com.bingce.device.Device; import com.bingce.device.enums.DeviceTypeEnum; import com.bingce.device.util.DeviceUtils; -import com.bingce.error.BingCeErrorCode; import com.bingce.rtk.gnss.Gnss; import com.bingce.rtk.model.GnssPosition; import com.bingce.surveyor.agentweb.HelpWebActivity; import com.bingce.surveyor.util.ConstUtils; -import com.bingce.surveyor.util.DeviceConnectUtil; import com.bingce.surveyor.util.PreferencesUtil; import com.bingce.surveyor.util.SurveyRemarksUtils; import com.bingce.surveyor.util.dialog.CustomDialog; @@ -83,6 +75,7 @@ import com.project.survey.ui.instrument.setupstation.LauncherEvent; import com.project.survey.ui.pointmeasure.measure.util.SFUtils; import com.project.survey.ui.pointmeasure.measure.util.SurveyToolBarClickListenerUtils; import com.project.survey.util.CommonUtils; +import com.project.survey.util.DeviceConnectUtil; import com.project.survey.util.DrawableUtils; import com.project.survey.util.SurveyUIUtils; import com.project.survey.widget.bingce.dragdrop.DefaultItemCallback; diff --git a/app/src/main/java/com/project/survey/ui/pointmeasure/measure/util/SurveyToolBarClickListenerUtils.java b/app/src/main/java/com/project/survey/ui/pointmeasure/measure/util/SurveyToolBarClickListenerUtils.java index 7aa1809..dcf51bc 100644 --- a/app/src/main/java/com/project/survey/ui/pointmeasure/measure/util/SurveyToolBarClickListenerUtils.java +++ b/app/src/main/java/com/project/survey/ui/pointmeasure/measure/util/SurveyToolBarClickListenerUtils.java @@ -14,12 +14,12 @@ import com.bingce.device.Device; import com.bingce.device.enums.DeviceTypeEnum; import com.bingce.rtk.command.RTK; import com.bingce.rtk.gnss.Gnss; -import com.bingce.surveyor.util.DeviceConnectUtil; import com.bingce.surveyor.util.dialog.CustomDialog; import com.bingce.surveyorBase.R.string; -import com.bingce.surveyorBase.databinding.ActivityBaseSurveyNewBinding; import com.bingce.utils.Util; +import com.project.survey.databinding.ActivityBaseSurveyNewBinding; import com.project.survey.databinding.LayoutBaseSurveyStakingSettingBinding; +import com.project.survey.util.DeviceConnectUtil; import blankj.utilcode.util.ToastUtils; import lecho.hellocharts.view.LineChartView; diff --git a/app/src/main/java/com/project/survey/util/BaseSurveyActivityUtils.java b/app/src/main/java/com/project/survey/util/BaseSurveyActivityUtils.java index d0bc728..14484e9 100644 --- a/app/src/main/java/com/project/survey/util/BaseSurveyActivityUtils.java +++ b/app/src/main/java/com/project/survey/util/BaseSurveyActivityUtils.java @@ -13,13 +13,13 @@ import com.bingce.device.enums.DeviceTypeEnum; import com.bingce.rtk.enums.WorkModeEnum; import com.bingce.rtk.gnss.Gnss; import com.bingce.rtk.model.GnssPosition; -import com.bingce.surveyorBase.databinding.ActivityBaseSurveyNewBinding; import com.bingce.totalstation.TotalStation; import com.bingce.totalstation.TsConfig; import com.bingce.totalstation.enums.SetupStationModeEnum; import com.bingce.utils.Util; import com.gyf.immersionbar.ImmersionBar; import com.project.survey.R; +import com.project.survey.databinding.ActivityBaseSurveyNewBinding; import com.project.survey.ui.interfacee.IUIProvider; import java.util.Locale; diff --git a/app/src/main/java/com/project/survey/util/DeviceConnectUtil.java b/app/src/main/java/com/project/survey/util/DeviceConnectUtil.java new file mode 100644 index 0000000..56c836f --- /dev/null +++ b/app/src/main/java/com/project/survey/util/DeviceConnectUtil.java @@ -0,0 +1,104 @@ +package com.project.survey.util; + +import android.content.Context; +import android.content.Intent; +import android.view.View; + +import com.bingce.AppChannel; +import com.bingce.device.Device; +import com.bingce.device.enums.DeviceTypeEnum; +import com.bingce.device.ui.ConnectRtkActivity; +import com.bingce.device.ui.ConnectTSActivity; +import com.bingce.surveyor.util.ConstUtils; +import com.bingce.surveyor.util.PreferencesUtil; +import com.bingce.surveyor.util.dialog.CustomRecycleDialog; +import com.bingce.surveyorBase.R; +import com.bingce.totalstation.TsConfig; +import com.bingce.totalstation.enums.SetupStationModeEnum; +import com.bingce.utils.Util; +import com.project.survey.databinding.ActivityBaseSurveyNewBinding; + +import java.util.ArrayList; +import java.util.List; + +import blankj.utilcode.util.ActivityUtils; +import blankj.utilcode.util.Utils; + +public class DeviceConnectUtil { + + public static boolean isDeviceConnectSelectDialog(Context context, ActivityBaseSurveyNewBinding activityBaseSurveyBinding) { + + if (!Device.getInstance().isDeviceConnected()) { + List stringListDevice = new ArrayList<>(); + stringListDevice.add(context.getString(R.string.total_station)); + stringListDevice.add(context.getString(R.string.rtk)); + CustomRecycleDialog.showDialog(context, R.string.choose_instrument_type, stringListDevice, PreferencesUtil.getLastConnectDeviceType(), false, (index, itemString) -> { + PreferencesUtil.putPreference(ConstUtils.preferConst.lastConnectDeviceType, index); + switch (index) { + case 0: + Intent intent = new Intent(ActivityUtils.getTopActivity(), ConnectTSActivity.class); + intent.putExtra("customChannel", AppChannel.customChannel); + ActivityUtils.getTopActivity().startActivity(intent); + + if (TsConfig.getInstance().getSetupStationMethod().getMode() == SetupStationModeEnum.ON_TOTAL_STATION) { + activityBaseSurveyBinding.tvSolutionState.setVisibility(View.GONE); + activityBaseSurveyBinding.tvRtkStatusDiffAge.setVisibility(View.GONE); + activityBaseSurveyBinding.tvRtkStatusHrms.setVisibility(View.GONE); + activityBaseSurveyBinding.tvRtkStatusVrms.setVisibility(View.GONE); + activityBaseSurveyBinding.pivPowerIcon.setVisibility(View.GONE); + activityBaseSurveyBinding.tvPowerNum.setVisibility(View.GONE); + } else { + activityBaseSurveyBinding.tvSolutionState.setVisibility(View.VISIBLE); + activityBaseSurveyBinding.tvRtkStatusDiffAge.setVisibility(View.VISIBLE); + activityBaseSurveyBinding.tvRtkStatusHrms.setVisibility(View.VISIBLE); + activityBaseSurveyBinding.tvRtkStatusVrms.setVisibility(View.VISIBLE); + activityBaseSurveyBinding.pivPowerIcon.setVisibility(View.VISIBLE); + activityBaseSurveyBinding.tvPowerNum.setVisibility(View.VISIBLE); + activityBaseSurveyBinding.pivPowerIcon.setProgress(0); + activityBaseSurveyBinding.pivPowerIcon.setTextSize(0); + activityBaseSurveyBinding.tvSolutionState.setText(String.format("Ha %s", Util.radianToDmsString(0, 0, true))); + activityBaseSurveyBinding.tvRtkStatusDiffAge.setText(String.format("Va %s", Util.radianToDmsString(0, 0, true))); + activityBaseSurveyBinding.tvRtkStatusHrms.setText(String.format("Hd %s", Util.formatDouble2String(0, 3))); + activityBaseSurveyBinding.tvRtkStatusVrms.setText(String.format("Sd %s", Util.formatDouble2String(0, 3))); + } + activityBaseSurveyBinding.tvPoleHighHr.setText("0.000m"); + activityBaseSurveyBinding.ivPoleHighHr.setImageDrawable(Utils.getApp().getResources().getDrawable(R.drawable.icon_hr_high_white)); + activityBaseSurveyBinding.ivRtkStatusSatellite.setImageDrawable(Utils.getApp().getResources().getDrawable(R.mipmap.icon_edm_np)); + activityBaseSurveyBinding.tvRtkStatusSatellite.setText(R.string.laser); + break; + case 1: + Intent intent2 = new Intent(ActivityUtils.getTopActivity(), ConnectRtkActivity.class); + ActivityUtils.getTopActivity().startActivity(intent2); + + activityBaseSurveyBinding.tvRtkStatusHrms.setText(Utils.getApp().getString(R.string.no_data)); + activityBaseSurveyBinding.tvRtkStatusVrms.setText(Utils.getApp().getString(R.string.no_delay)); + activityBaseSurveyBinding.tvSolutionState.setText(""); + activityBaseSurveyBinding.tvRtkStatusDiffAge.setText(""); + activityBaseSurveyBinding.pivPowerIcon.setProgress(0); + activityBaseSurveyBinding.pivPowerIcon.setTextSize(0); + activityBaseSurveyBinding.tvPoleHighHr.setText("0.000m"); + activityBaseSurveyBinding.ivPoleHighHr.setImageDrawable(Utils.getApp().getResources().getDrawable(R.drawable.icon_pole_high_white)); + activityBaseSurveyBinding.ivRtkStatusSatellite.setImageDrawable(Utils.getApp().getResources().getDrawable(R.mipmap.icon_home_satellite)); + activityBaseSurveyBinding.tvRtkStatusSatellite.setText(String.format("%s %s/%s", Utils.getApp().getString(R.string.satellite), 0, 0)); + break; + } + }); + return false; + } else { + return true; + } + } + + public static void startDeviceConnected(Context context, ActivityBaseSurveyNewBinding activityBaseSurveyBinding) { + if (DeviceConnectUtil.isDeviceConnectSelectDialog(context, activityBaseSurveyBinding)) { + if (Device.getInstance().deviceType == DeviceTypeEnum.DEVICE_TYPE_TS) { + Intent intent = new Intent(ActivityUtils.getTopActivity(), ConnectTSActivity.class); + intent.putExtra("customChannel", AppChannel.customChannel); + ActivityUtils.getTopActivity().startActivity(intent); + } else { + Intent intent2 = new Intent(ActivityUtils.getTopActivity(), ConnectRtkActivity.class); + ActivityUtils.getTopActivity().startActivity(intent2); + } + } + } +} diff --git a/app/src/main/res/drawable/icon_menu_sideslip.xml b/app/src/main/res/drawable/icon_menu_sideslip.xml new file mode 100644 index 0000000..c1a12eb --- /dev/null +++ b/app/src/main/res/drawable/icon_menu_sideslip.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/activity_base_survey_new.xml b/app/src/main/res/layout/activity_base_survey_new.xml new file mode 100644 index 0000000..7053745 --- /dev/null +++ b/app/src/main/res/layout/activity_base_survey_new.xml @@ -0,0 +1,370 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_satellite_status.xml b/app/src/main/res/layout/activity_satellite_status.xml new file mode 100644 index 0000000..da2dc35 --- /dev/null +++ b/app/src/main/res/layout/activity_satellite_status.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/colorful/.gitignore b/colorful/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/colorful/.gitignore @@ -0,0 +1 @@ +/build diff --git a/colorful/build.gradle b/colorful/build.gradle new file mode 100644 index 0000000..f723784 --- /dev/null +++ b/colorful/build.gradle @@ -0,0 +1,44 @@ +import com.bingce.AndroidSdk +import com.bingce.AndroidX +import com.bingce.BcFolder + +apply plugin: 'com.android.library' + +android { + compileSdk AndroidSdk.compileSdkVersion + namespace 'org.polaric.colorful' + + defaultConfig { + minSdkVersion AndroidSdk.minSdkVersion + targetSdkVersion AndroidSdk.targetSdkVersion + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + + lintOptions { + abortOnError false + } + + sourceSets { + main { + java { + def bcFolder = new BcFolder(project) + srcDirs = [ + new File(bcFolder.rootProjectDir(), "base/buildSrc/color/main/java"),//用于存储模块相关的R、BuildConfig资源 + new File("src/main/java") + ] + } + } + } +} + +dependencies { + implementation AndroidX.appcompat + implementation AndroidX.recyclerview + implementation AndroidX.legacyPreference + implementation AndroidX.Lifecycle.extensions +} diff --git a/colorful/proguard-rules.pro b/colorful/proguard-rules.pro new file mode 100644 index 0000000..8ebe0cb --- /dev/null +++ b/colorful/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /home/polaric/Documents/Code/SDK/android-sdk-linux/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/colorful/src/main/AndroidManifest.xml b/colorful/src/main/AndroidManifest.xml new file mode 100644 index 0000000..7cec54a --- /dev/null +++ b/colorful/src/main/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/colorful/src/main/java/color/Rcolor.java b/colorful/src/main/java/color/Rcolor.java new file mode 100644 index 0000000..9201133 --- /dev/null +++ b/colorful/src/main/java/color/Rcolor.java @@ -0,0 +1,175 @@ +package color; + +import org.polaric.colorful.R; + +public class Rcolor { + + public static int shang_hai_project_color() { + return R.color.shang_hai_color; + } + + public static int md_red_500() { + return R.color.md_red_500; + } + + public static int md_red_700() { + return R.color.md_red_700; + } + + public static int md_pink_500() { + return R.color.md_pink_500; + } + + public static int md_pink_700() { + return R.color.md_pink_700; + } + + public static int md_purple_500() { + return R.color.md_purple_500; + } + + public static int md_purple_700() { + return R.color.md_purple_700; + } + + public static int md_deep_purple_500() { + return R.color.md_deep_purple_500; + } + + public static int md_deep_purple_700() { + return R.color.md_deep_purple_700; + } + + public static int md_indigo_500() { + return R.color.md_indigo_500; + } + + public static int md_indigo_700() { + return R.color.md_indigo_700; + } + + public static int md_blue_500() { + return R.color.md_blue_500; + } + + public static int md_blue_700() { + return R.color.md_blue_700; + } + + public static int md_light_blue_500() { + return R.color.md_light_blue_500; + } + + public static int md_light_blue_700() { + return R.color.md_light_blue_700; + } + + public static int ufo_blue() { + return R.color.ufo_blue; + } + + public static int alpha_black() { + return R.color.alpha_black; + } + + public static int alpha_green() { + return R.color.alpha_green; + } + + public static int md_teal_500() { + return R.color.md_teal_500; + } + + public static int md_teal_700() { + return R.color.md_teal_700; + } + + public static int md_green_500() { + return R.color.md_green_500; + } + + public static int md_green_700() { + return R.color.md_green_700; + } + + public static int md_light_green_500() { + return R.color.md_light_green_500; + } + + public static int md_light_green_700() { + return R.color.md_light_green_700; + } + + public static int md_lime_500() { + return R.color.md_lime_500; + } + + public static int md_lime_700() { + return R.color.md_lime_700; + } + + public static int md_yellow_500() { + return R.color.md_yellow_500; + } + + public static int md_yellow_700() { + return R.color.md_yellow_700; + } + + public static int md_amber_500() { + return R.color.md_amber_500; + } + + public static int md_amber_700() { + return R.color.md_amber_700; + } + + public static int md_orange_500() { + return R.color.md_orange_500; + } + + public static int md_orange_700() { + return R.color.md_orange_700; + } + + public static int md_deep_orange_500() { + return R.color.md_deep_orange_500; + } + + public static int md_deep_orange_700() { + return R.color.md_deep_orange_700; + } + + public static int md_brown_500() { + return R.color.md_brown_500; + } + + public static int md_brown_700() { + return R.color.md_brown_700; + } + + public static int md_grey_500() { + return R.color.md_grey_500; + } + + public static int md_grey_700() { + return R.color.md_grey_700; + } + + public static int md_blue_grey_500() { + return R.color.md_blue_grey_500; + } + + public static int md_blue_grey_700() { + return R.color.md_blue_grey_700; + } + + public static int md_white_1000() { + return R.color.md_white_1000; + } + + public static int md_black_1000() { + return R.color.md_black_1000; + } +} + diff --git a/colorful/src/main/java/color/Rdrawable.java b/colorful/src/main/java/color/Rdrawable.java new file mode 100644 index 0000000..a79d111 --- /dev/null +++ b/colorful/src/main/java/color/Rdrawable.java @@ -0,0 +1,9 @@ +package color; + +import org.polaric.colorful.R; + +public class Rdrawable { + public static int ic_arrow_back_white_48px() { + return R.drawable.ic_arrow_back_white_48px; + } +} diff --git a/colorful/src/main/java/color/Rid.java b/colorful/src/main/java/color/Rid.java new file mode 100644 index 0000000..2aa9cbe --- /dev/null +++ b/colorful/src/main/java/color/Rid.java @@ -0,0 +1,18 @@ +package color; + +import org.polaric.colorful.R; + +public class Rid { + + public static int color_indicator() { + return R.id.color_indicator; + } + + public static int colorful_color_picker_recycler() { + return R.id.colorful_color_picker_recycler; + } + + public static int colorful_color_picker_toolbar() { + return R.id.colorful_color_picker_toolbar; + } +} diff --git a/colorful/src/main/java/color/Rlayout.java b/colorful/src/main/java/color/Rlayout.java new file mode 100644 index 0000000..c1a499a --- /dev/null +++ b/colorful/src/main/java/color/Rlayout.java @@ -0,0 +1,18 @@ +package color; + +import org.polaric.colorful.R; + +public class Rlayout { + + public static int preference_colorpicker() { + return R.layout.preference_colorpicker; + } + + public static int dialog_colorpicker() { + return R.layout.dialog_colorpicker; + } + + public static int adapter_coloritem() { + return R.layout.adapter_coloritem; + } +} diff --git a/colorful/src/main/java/color/Rstring.java b/colorful/src/main/java/color/Rstring.java new file mode 100644 index 0000000..10ad1a6 --- /dev/null +++ b/colorful/src/main/java/color/Rstring.java @@ -0,0 +1,9 @@ +package color; + +import org.polaric.colorful.R; + +public class Rstring { + public static int select_color() { + return R.string.select_color; + } +} diff --git a/colorful/src/main/java/color/Rstyle.java b/colorful/src/main/java/color/Rstyle.java new file mode 100644 index 0000000..d737f4b --- /dev/null +++ b/colorful/src/main/java/color/Rstyle.java @@ -0,0 +1,13 @@ +package color; + +import org.polaric.colorful.R; + +public class Rstyle { + public static int Colorful_Light() { + return R.style.Colorful_Light; + } + + public static int Colorful_Dark() { + return R.style.Colorful_Dark; + } +} diff --git a/colorful/src/main/java/color/Rstyleable.java b/colorful/src/main/java/color/Rstyleable.java new file mode 100644 index 0000000..eb5413e --- /dev/null +++ b/colorful/src/main/java/color/Rstyleable.java @@ -0,0 +1,17 @@ +package color; + +import org.polaric.colorful.R; + +public class Rstyleable { + public static int[] colorpicker() { + return R.styleable.colorpicker; + } + + public static int colorpicker_primary_color() { + return R.styleable.colorpicker_primary_color; + } + + public static int colorpicker_accent_color() { + return R.styleable.colorpicker_accent_color; + } +} diff --git a/colorful/src/main/java/org/polaric/colorful/CircularView.java b/colorful/src/main/java/org/polaric/colorful/CircularView.java new file mode 100644 index 0000000..8c379d3 --- /dev/null +++ b/colorful/src/main/java/org/polaric/colorful/CircularView.java @@ -0,0 +1,54 @@ +package org.polaric.colorful; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.util.AttributeSet; +import android.view.View; + +import androidx.annotation.ColorInt; +import androidx.annotation.RequiresApi; + +public class CircularView extends View { + + Paint paint = new Paint(); + Paint paint2 = new Paint();//灰色描边 + + public CircularView(Context context) { + super(context); + } + + public CircularView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public CircularView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @RequiresApi(21) + public CircularView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + public void setColor(@ColorInt int color) { + paint.setColor(color); + paint2.setStyle(Paint.Style.STROKE); + paint2.setStrokeWidth(4); + paint2.setColor(Color.LTGRAY); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + canvas.drawCircle(canvas.getWidth() / 2, canvas.getHeight() / 2, canvas.getWidth() / 2 - 9, paint); + canvas.drawCircle(canvas.getWidth() / 2, canvas.getHeight() / 2, canvas.getWidth() / 2 - 5, paint2); + } + + public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + int size = Math.min(getMeasuredWidth(), getMeasuredHeight()); + setMeasuredDimension(size, size); + } +} diff --git a/colorful/src/main/java/org/polaric/colorful/ColorPickerAdapter.java b/colorful/src/main/java/org/polaric/colorful/ColorPickerAdapter.java new file mode 100644 index 0000000..255f27e --- /dev/null +++ b/colorful/src/main/java/org/polaric/colorful/ColorPickerAdapter.java @@ -0,0 +1,58 @@ +package org.polaric.colorful; + +import android.content.Context; +import androidx.recyclerview.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import color.Rlayout; + +class ColorPickerAdapter extends RecyclerView.Adapter { + private Context context; + private OnItemClickListener listener; + + ColorPickerAdapter(Context context) { + this.context=context; + } + + @Override + public int getItemCount() { + return Colorful.ThemeColor.values().length; + } + + @Override + public void onBindViewHolder(ItemViewHolder ViewHolder, int i) { + ViewHolder.circle.setColor(context.getResources().getColor(Colorful.ThemeColor.values()[i].getColorRes())); + } + + @Override + public ItemViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { + final ItemViewHolder holder = new ItemViewHolder(LayoutInflater.from(context).inflate(Rlayout.adapter_coloritem(), viewGroup, false)); + holder.circle.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (listener!=null) { + listener.onItemClick(Colorful.ThemeColor.values()[holder.getAdapterPosition()]); + } + } + }); + return holder; + } + + void setOnItemClickListener(OnItemClickListener l) { + listener=l; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + CircularView circle; + ItemViewHolder(View v) { + super(v); + circle = ((CircularView) v); + } + } + + interface OnItemClickListener { + void onItemClick(Colorful.ThemeColor color); + } +} diff --git a/colorful/src/main/java/org/polaric/colorful/ColorPickerDialog.java b/colorful/src/main/java/org/polaric/colorful/ColorPickerDialog.java new file mode 100644 index 0000000..418cfd3 --- /dev/null +++ b/colorful/src/main/java/org/polaric/colorful/ColorPickerDialog.java @@ -0,0 +1,64 @@ +package org.polaric.colorful; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.appcompat.widget.Toolbar; +import android.view.View; + +import color.Rdrawable; +import color.Rid; +import color.Rlayout; +import color.Rstring; + +public class ColorPickerDialog extends Dialog implements View.OnClickListener, ColorPickerAdapter.OnItemClickListener { + private RecyclerView recycler; + private Toolbar toolbar; + private OnColorSelectedListener listener; + + public ColorPickerDialog(Context context) { + super(context); + } + + @Override + public void onClick(View view) { + dismiss(); + } + + @Override + public void onItemClick(Colorful.ThemeColor color) { + dismiss(); + if (listener!=null) { + listener.onColorSelected(color); + } + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(Rlayout.dialog_colorpicker()); + + recycler = ((RecyclerView) findViewById(Rid.colorful_color_picker_recycler())); + toolbar = ((Toolbar) findViewById(Rid.colorful_color_picker_toolbar())); + + toolbar.setNavigationOnClickListener(this); + toolbar.setBackgroundColor(getContext().getResources().getColor(Colorful.getThemeDelegate().getPrimaryColor().getColorRes())); + toolbar.setTitle(Rstring.select_color()); + + toolbar.setNavigationIcon(Rdrawable.ic_arrow_back_white_48px()); + recycler.setLayoutManager(new GridLayoutManager(getContext(), 4)); + ColorPickerAdapter adapter = new ColorPickerAdapter(getContext()); + adapter.setOnItemClickListener(this); + recycler.setAdapter(adapter); + } + + public interface OnColorSelectedListener { + void onColorSelected(Colorful.ThemeColor color); + } + + public void setOnColorSelectedListener(OnColorSelectedListener listener) { + this.listener=listener; + } +} diff --git a/colorful/src/main/java/org/polaric/colorful/ColorPickerPreference.java b/colorful/src/main/java/org/polaric/colorful/ColorPickerPreference.java new file mode 100644 index 0000000..098d901 --- /dev/null +++ b/colorful/src/main/java/org/polaric/colorful/ColorPickerPreference.java @@ -0,0 +1,62 @@ +package org.polaric.colorful; +import android.content.Context; +import android.content.res.TypedArray; +import androidx.preference.Preference; +import androidx.preference.PreferenceViewHolder; +import android.util.AttributeSet; + +import color.Rid; +import color.Rlayout; +import color.Rstyleable; + +public class ColorPickerPreference extends Preference implements ColorPickerDialog.OnColorSelectedListener { + private boolean primary; + private boolean accent; + + public ColorPickerPreference(Context context, AttributeSet attrs) { + super(context, attrs); + setWidgetLayoutResource(Rlayout.preference_colorpicker()); + + TypedArray ta = context.obtainStyledAttributes(attrs, Rstyleable.colorpicker()); + try { + primary = ta.getBoolean(Rstyleable.colorpicker_primary_color(),false); + accent = ta.getBoolean(Rstyleable.colorpicker_accent_color(), false); + } finally { + ta.recycle(); + } + } + + @Override + public void onColorSelected(Colorful.ThemeColor color) { + if (primary) { + Colorful.config(getContext()) + .primaryColor(color) + .apply(); + } else if (accent) { + Colorful.config(getContext()) + .accentColor(color) + .apply(); + } + if (getOnPreferenceChangeListener()!=null) { + getOnPreferenceChangeListener().onPreferenceChange(this, color); + } + } + + @Override + public void onBindViewHolder(PreferenceViewHolder holder) { + super.onBindViewHolder(holder); + if (primary) { + ((CircularView) holder.findViewById(Rid.color_indicator())).setColor(getContext().getResources().getColor(Colorful.getThemeDelegate().getPrimaryColor().getColorRes())); + } else if (accent) { + ((CircularView) holder.findViewById(Rid.color_indicator())).setColor(getContext().getResources().getColor(Colorful.getThemeDelegate().getAccentColor().getColorRes())); + } + } + + @Override + protected void onClick() { + super.onClick(); + ColorPickerDialog dialog = new ColorPickerDialog(getContext()); + dialog.setOnColorSelectedListener(this); + dialog.show(); + } +} diff --git a/colorful/src/main/java/org/polaric/colorful/Colorful.java b/colorful/src/main/java/org/polaric/colorful/Colorful.java new file mode 100644 index 0000000..fc1ec28 --- /dev/null +++ b/colorful/src/main/java/org/polaric/colorful/Colorful.java @@ -0,0 +1,196 @@ +package org.polaric.colorful; + +import android.app.Activity; +import android.content.Context; +import android.util.Log; + +import androidx.annotation.ColorRes; +import androidx.annotation.NonNull; +import androidx.preference.PreferenceManager; + +import color.Rcolor; + +public class Colorful { + private static ThemeDelegate delegate; + private static ThemeColor primaryColor = Defaults.primaryColor; + private static ThemeColor accentColor = Defaults.accentColor; + private static boolean isTranslucent = Defaults.trans; + private static boolean isDark = Defaults.darkTheme; + private static String themeString; + + private Colorful() { + // prevent initialization + } + + public static void init(Context context) { + Log.d(Util.LOG_TAG, "Attatching to " + context.getPackageName()); + themeString = PreferenceManager.getDefaultSharedPreferences(context).getString(Util.PREFERENCE_KEY, null); + if (themeString == null) { + primaryColor = Defaults.primaryColor; + accentColor = Defaults.accentColor; + isTranslucent = Defaults.trans; + isDark = Defaults.darkTheme; + themeString = generateThemeString(); + } else { + initValues(); + } + delegate = new ThemeDelegate(context, primaryColor, accentColor, isTranslucent, isDark); + } + + public static void applyTheme(@NonNull Activity activity) { + applyTheme(activity, true); + } + + public static void applyTheme(@NonNull Activity activity, boolean overrideBase) { + if (overrideBase) { + activity.setTheme(getThemeDelegate().getStyleResBase()); + } + activity.getTheme().applyStyle(getThemeDelegate().getStyleResPrimary(), true); + activity.getTheme().applyStyle(getThemeDelegate().getStyleResAccent(), true); + } + + private static void writeValues(Context context) { + PreferenceManager.getDefaultSharedPreferences(context).edit().putString(Util.PREFERENCE_KEY, generateThemeString()).apply(); + } + + private static void initValues() { + String[] colors = themeString.split(":"); + isDark = Boolean.parseBoolean(colors[0]); + isTranslucent = Boolean.parseBoolean(colors[1]); + primaryColor = Colorful.ThemeColor.values()[Integer.parseInt(colors[2])]; + accentColor = Colorful.ThemeColor.values()[Integer.parseInt(colors[3])]; + } + + private static String generateThemeString() { + return isDark + ":" + isTranslucent + ":" + primaryColor.ordinal() + ":" + accentColor.ordinal(); + } + + public static ThemeDelegate getThemeDelegate() { + if (delegate == null) { + Log.e(Util.LOG_TAG, "getThemeDelegate() called before init(Context). Call Colorful.init(Context) in your application class"); + } + return delegate; + } + + public static String getThemeString() { + return themeString; + } + + public enum ThemeColor { + SHANG_HAI_PROJECT(Rcolor.shang_hai_project_color(), Rcolor.shang_hai_project_color()); +// RED(Rcolor.md_red_500(), Rcolor.md_red_700()), +// PINK(Rcolor.md_pink_500(), Rcolor.md_pink_700()), +// PURPLE(Rcolor.md_purple_500(), Rcolor.md_purple_700()), +// DEEP_PURPLE(Rcolor.md_deep_purple_500(), Rcolor.md_deep_purple_700()), +// INDIGO(Rcolor.md_indigo_500(), Rcolor.md_indigo_700()), +// BLUE(Rcolor.md_blue_500(), Rcolor.md_blue_700()), +// LIGHT_BLUE(Rcolor.md_light_blue_500(), Rcolor.md_light_blue_700()), +// // CYAN(Rcolor.md_cyan_500, Rcolor.md_cyan_700), +// UFO_BLUE(Rcolor.ufo_blue(), Rcolor.ufo_blue()), +// TEAL(Rcolor.md_teal_500(), Rcolor.md_teal_700()), +// GREEN(Rcolor.md_green_500(), Rcolor.md_green_700()), +// LIGHT_GREEN(Rcolor.md_light_green_500(), Rcolor.md_light_green_700()), +// LIME(Rcolor.md_lime_500(), Rcolor.md_lime_700()), +// YELLOW(Rcolor.md_yellow_500(), Rcolor.md_yellow_700()), +// AMBER(Rcolor.md_amber_500(), Rcolor.md_amber_700()), +// ORANGE(Rcolor.md_orange_500(), Rcolor.md_orange_700()), +// DEEP_ORANGE(Rcolor.md_deep_orange_500(), Rcolor.md_deep_orange_700()), +// BROWN(Rcolor.md_brown_500(), Rcolor.md_brown_700()), +// GREY(Rcolor.md_grey_500(), Rcolor.md_grey_700()), +// BLUE_GREY(Rcolor.md_blue_grey_500(), Rcolor.md_blue_grey_700()), +// WHITE(Rcolor.md_white_1000(), Rcolor.md_white_1000()), +// BLACK(Rcolor.md_black_1000(), Rcolor.md_black_1000()), +// ALPHA_BLACK(Rcolor.alpha_black(), Rcolor.alpha_black()), +// ALPHA_GREEN(Rcolor.alpha_green(), Rcolor.alpha_green()); + + @ColorRes + private int colorRes; + @ColorRes + private int darkColorRes; + + ThemeColor(@ColorRes int colorRes, @ColorRes int darkColorRes) { + this.colorRes = colorRes; + this.darkColorRes = darkColorRes; + } + + public @ColorRes + int getColorRes() { + return colorRes; + } + + public @ColorRes + int getDarkColorRes() { + return darkColorRes; + } + } + + public static Config config(Context context) { + return new Config(context); + } + + public static Defaults defaults() { + return new Defaults(); + } + + public static class Defaults { + private static ThemeColor primaryColor = ThemeColor.SHANG_HAI_PROJECT; + private static ThemeColor accentColor = ThemeColor.SHANG_HAI_PROJECT; + private static boolean trans = false; + private static boolean darkTheme = false; + + public Defaults primaryColor(ThemeColor primary) { + primaryColor = primary; + return this; + } + + public Defaults accentColor(ThemeColor accent) { + accentColor = accent; + return this; + } + + public Defaults translucent(boolean translucent) { + trans = translucent; + return this; + } + + public Defaults dark(boolean dark) { + darkTheme = dark; + return this; + } + } + + public static class Config { + private Context context; + + private Config(Context context) { + this.context = context; + } + + public Config primaryColor(ThemeColor primary) { + primaryColor = primary; + return this; + } + + public Config accentColor(ThemeColor accent) { + accentColor = accent; + return this; + } + + public Config translucent(boolean translucent) { + isTranslucent = translucent; + return this; + } + + public Config dark(boolean dark) { + isDark = dark; + return this; + } + + public void apply() { + writeValues(context); + themeString = generateThemeString(); + delegate = new ThemeDelegate(context, primaryColor, accentColor, isTranslucent, isDark); + } + } + +} diff --git a/colorful/src/main/java/org/polaric/colorful/ColorfulActivity.java b/colorful/src/main/java/org/polaric/colorful/ColorfulActivity.java new file mode 100644 index 0000000..bf47fd3 --- /dev/null +++ b/colorful/src/main/java/org/polaric/colorful/ColorfulActivity.java @@ -0,0 +1,75 @@ +package org.polaric.colorful; + +import android.app.ActivityManager; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.view.WindowManager; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + +public abstract class ColorfulActivity extends AppCompatActivity { + private String themeString; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + themeString = Colorful.getThemeString(); + setTheme(Colorful.getThemeDelegate().getStyleResBase()); +// getTheme().applyStyle(Colorful.getThemeDelegate().getStyleResPrimary(), true); +// getTheme().applyStyle(Colorful.getThemeDelegate().getStyleResAccent(), true); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + if (Colorful.getThemeDelegate().isTranslucent()) { + getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + } + + ActivityManager.TaskDescription tDesc = new ActivityManager.TaskDescription(null, null, getResources().getColor(Colorful.getThemeDelegate().getPrimaryColor().getColorRes())); + setTaskDescription(tDesc); + } + } + + @Override + public void setContentView(View view) { + //判断view的背景色 + autoSwitchRootViewBgColor(view); + super.setContentView(view); + } + + @Override + protected void onResume() { + super.onResume(); + if (!Colorful.getThemeString().equals(themeString)) { + Log.d(Util.LOG_TAG, "Theme change detected, restarting activity"); + recreate(); + } + } + + public static void autoSwitchRootViewBgColor(View contentView) { + if (contentView == null) { + return; + } + //判断contentView是否设置了颜色,如果是,就跳过 + Drawable bg = contentView.getBackground(); + if (bg != null) { + if (bg instanceof ColorDrawable) { + ColorDrawable colorDrawable = (ColorDrawable) bg; + Log.d("___bg____", "color:" + colorDrawable.getColor()); + } else { + Log.d("___bg____", bg.toString()); + } + return; + } + int bgColor = useDarkTheme ? R.color.app_background_color_night : R.color.app_background_color_day; + contentView.setBackgroundColor(contentView.getContext().getResources().getColor(bgColor)); + } + + public static void onThemeChanged(boolean useDarkColor) { + useDarkTheme = useDarkColor; + } + + private static boolean useDarkTheme = false; +} diff --git a/colorful/src/main/java/org/polaric/colorful/ThemeDelegate.java b/colorful/src/main/java/org/polaric/colorful/ThemeDelegate.java new file mode 100644 index 0000000..294bc46 --- /dev/null +++ b/colorful/src/main/java/org/polaric/colorful/ThemeDelegate.java @@ -0,0 +1,58 @@ +package org.polaric.colorful; + +import android.content.Context; +import android.util.Log; + +import androidx.annotation.StyleRes; + +import color.Rstyle; + +public class ThemeDelegate { + private Colorful.ThemeColor primaryColor; + private Colorful.ThemeColor accentColor; + private boolean translucent; + private boolean dark; + @StyleRes private int styleResPrimary; + @StyleRes private int styleResAccent; + @StyleRes private int styleResBase; + + ThemeDelegate(Context context, Colorful.ThemeColor primary, Colorful.ThemeColor accent, boolean translucent, boolean dark) { + this.primaryColor=primary; + this.accentColor=accent; + this.translucent=translucent; + this.dark=dark; + long curTime = System.currentTimeMillis(); +// styleResPrimary = context.getResources().getIdentifier("primary" + primary.ordinal(), "style", context.getPackageName()); +// styleResAccent = context.getResources().getIdentifier("accent" + accent.ordinal(), "style", context.getPackageName()); + styleResBase = dark ? Rstyle.Colorful_Dark() : Rstyle.Colorful_Light(); + Log.d(Util.LOG_TAG, "ThemeDelegate fetched theme in " + (System.currentTimeMillis()-curTime) + " milliseconds"); + } + + @StyleRes public int getStyleResPrimary() { + return styleResPrimary; + } + + @StyleRes public int getStyleResAccent() { + return styleResAccent; + } + + @StyleRes public int getStyleResBase() { + return styleResBase; + } + + public Colorful.ThemeColor getPrimaryColor() { + return primaryColor; + } + + public Colorful.ThemeColor getAccentColor() { + return accentColor; + } + + public boolean isTranslucent() { + return translucent; + } + + public boolean isDark() { + return dark; + } +} diff --git a/colorful/src/main/java/org/polaric/colorful/Util.java b/colorful/src/main/java/org/polaric/colorful/Util.java new file mode 100644 index 0000000..8bb3b4d --- /dev/null +++ b/colorful/src/main/java/org/polaric/colorful/Util.java @@ -0,0 +1,6 @@ +package org.polaric.colorful; + +class Util { + static final String LOG_TAG="Colorful"; + static final String PREFERENCE_KEY="COLORFUL_PREF_KEY"; +} diff --git a/colorful/src/main/res/drawable/ic_arrow_back_white_48px.xml b/colorful/src/main/res/drawable/ic_arrow_back_white_48px.xml new file mode 100644 index 0000000..41eb073 --- /dev/null +++ b/colorful/src/main/res/drawable/ic_arrow_back_white_48px.xml @@ -0,0 +1,4 @@ + + + diff --git a/colorful/src/main/res/layout/adapter_coloritem.xml b/colorful/src/main/res/layout/adapter_coloritem.xml new file mode 100644 index 0000000..a6041ae --- /dev/null +++ b/colorful/src/main/res/layout/adapter_coloritem.xml @@ -0,0 +1,8 @@ + + diff --git a/colorful/src/main/res/layout/dialog_colorpicker.xml b/colorful/src/main/res/layout/dialog_colorpicker.xml new file mode 100644 index 0000000..9595659 --- /dev/null +++ b/colorful/src/main/res/layout/dialog_colorpicker.xml @@ -0,0 +1,22 @@ + + + + + + + + \ No newline at end of file diff --git a/colorful/src/main/res/layout/preference_colorpicker.xml b/colorful/src/main/res/layout/preference_colorpicker.xml new file mode 100644 index 0000000..84ae29a --- /dev/null +++ b/colorful/src/main/res/layout/preference_colorpicker.xml @@ -0,0 +1,40 @@ + + + + + + + + + + \ No newline at end of file diff --git a/colorful/src/main/res/values/attrs.xml b/colorful/src/main/res/values/attrs.xml new file mode 100644 index 0000000..d61fd85 --- /dev/null +++ b/colorful/src/main/res/values/attrs.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/colorful/src/main/res/values/colors.xml b/colorful/src/main/res/values/colors.xml new file mode 100644 index 0000000..e1cea37 --- /dev/null +++ b/colorful/src/main/res/values/colors.xml @@ -0,0 +1,311 @@ + + + + + + #2964DA + #2964DA + #EBEBEB + + + #FFEBEE + #FFCDD2 + #EF9A9A + #E57373 + #EF5350 + #F44336 + #E53935 + #D32F2F + #C62828 + #B71C1C + #FF8A80 + #FF5252 + #FF1744 + #D50000 + + + #FCE4EC + #F8BBD0 + #F48FB1 + #F06292 + #EC407A + #E91E63 + #D81B60 + #C2185B + #AD1457 + #880E4F + #FF80AB + #FF4081 + #F50057 + #C51162 + + + #F3E5F5 + #E1BEE7 + #CE93D8 + #BA68C8 + #AB47BC + #9C27B0 + #8E24AA + #7B1FA2 + #6A1B9A + #4A148C + #EA80FC + #E040FB + #D500F9 + #AA00FF + + + #EDE7F6 + #D1C4E9 + #B39DDB + #9575CD + #7E57C2 + #673AB7 + #5E35B1 + #512DA8 + #4527A0 + #311B92 + #B388FF + #7C4DFF + #651FFF + #6200EA + + + #E8EAF6 + #C5CAE9 + #9FA8DA + #7986CB + #5C6BC0 + #3F51B5 + #3949AB + #303F9F + #283593 + #1A237E + #8C9EFF + #536DFE + #3D5AFE + #304FFE + + + #E3F2FD + #BBDEFB + #90CAF9 + #64B5F6 + #42A5F5 + #2196F3 + #1E88E5 + #1976D2 + #1565C0 + #0D47A1 + #82B1FF + #448AFF + #2979FF + #2962FF + + + #E1F5FE + #B3E5FC + #81D4fA + #4fC3F7 + #29B6FC + #03A9F4 + #039BE5 + #0288D1 + #0277BD + #01579B + #80D8FF + #40C4FF + #00B0FF + #0091EA + + + #E0F7FA + #B2EBF2 + #80DEEA + #4DD0E1 + #26C6DA + #00BCD4 + #00ACC1 + #0097A7 + #00838F + #006064 + #84FFFF + #18FFFF + #00E5FF + #00B8D4 + + + #E0F2F1 + #B2DFDB + #80CBC4 + #4DB6AC + #26A69A + #009688 + #00897B + #00796B + #00695C + #004D40 + #A7FFEB + #64FFDA + #1DE9B6 + #00BFA5 + + + #E8F5E9 + #C8E6C9 + #A5D6A7 + #81C784 + #66BB6A + #4CAF50 + #43A047 + #388E3C + #2E7D32 + #1B5E20 + #B9F6CA + #69F0AE + #00E676 + #00C853 + + + #F1F8E9 + #DCEDC8 + #C5E1A5 + #AED581 + #9CCC65 + #8BC34A + #7CB342 + #689F38 + #558B2F + #33691E + #CCFF90 + #B2FF59 + #76FF03 + #64DD17 + + + #F9FBE7 + #F0F4C3 + #E6EE9C + #DCE775 + #D4E157 + #CDDC39 + #C0CA33 + #A4B42B + #9E9D24 + #827717 + #F4FF81 + #EEFF41 + #C6FF00 + #AEEA00 + + + #FFFDE7 + #FFF9C4 + #FFF590 + #FFF176 + #FFEE58 + #FFEB3B + #FDD835 + #FBC02D + #F9A825 + #F57F17 + #FFFF82 + #FFFF00 + #FFEA00 + #FFD600 + + + #FFF8E1 + #FFECB3 + #FFE082 + #FFD54F + #FFCA28 + #FFC107 + #FFB300 + #FFA000 + #FF8F00 + #FF6F00 + #FFE57F + #FFD740 + #FFC400 + #FFAB00 + + + #FFF3E0 + #FFE0B2 + #FFCC80 + #FFB74D + #FFA726 + #FF9800 + #FB8C00 + #F57C00 + #EF6C00 + #E65100 + #FFD180 + #FFAB40 + #FF9100 + #FF6D00 + + + #FBE9A7 + #FFCCBC + #FFAB91 + #FF8A65 + #FF7043 + #FF5722 + #F4511E + #E64A19 + #D84315 + #BF360C + #FF9E80 + #FF6E40 + #FF3D00 + #DD2600 + + + #EFEBE9 + #D7CCC8 + #BCAAA4 + #A1887F + #8D6E63 + #795548 + #6D4C41 + #5D4037 + #4E342E + #3E2723 + + + #FAFAFA + #F5F5F5 + #EEEEEE + #E0E0E0 + #BDBDBD + #9E9E9E + #757575 + #616161 + #424242 + #212121 + #000000 + #ffffff + + + #ECEFF1 + #CFD8DC + #B0BBC5 + #90A4AE + #78909C + #607D8B + #546E7A + #455A64 + #37474F + #263238 + + #008B9C + #333333 + #8cd25a + + #fafafa + #303030 + \ No newline at end of file diff --git a/colorful/src/main/res/values/strings.xml b/colorful/src/main/res/values/strings.xml new file mode 100644 index 0000000..d39ef57 --- /dev/null +++ b/colorful/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + Select Color + diff --git a/colorful/src/main/res/values/styles.xml b/colorful/src/main/res/values/styles.xml new file mode 100644 index 0000000..b6db0b0 --- /dev/null +++ b/colorful/src/main/res/values/styles.xml @@ -0,0 +1,420 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/settings.gradle b/settings.gradle index e7b4def..d08b5bf 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,2 @@ include ':app' +include ':colorful'