瀏覽代碼

033代码上传,StringUtils 数据库兼容,厨师机建议展示,033食谱描述展示

zhangshenjie 9 月之前
父節點
當前提交
adf413613e
共有 21 個文件被更改,包括 529 次插入125 次删除
  1. 34 2
      BusinessCommon/src/main/java/com/develop/common/data_repo/FoodDataProvider.kt
  2. 5 1
      BusinessCommon/src/main/java/com/develop/common/data_repo/db/DataFactory.kt
  3. 32 2
      BusinessCommon/src/main/java/com/develop/common/data_repo/db/FoodDatabase.kt
  4. 15 0
      BusinessCommon/src/main/java/com/develop/common/data_repo/db/entity/DevRecipe.kt
  5. 4 0
      BusinessCommon/src/main/java/com/develop/common/ui/CommonBindingActivity.kt
  6. 113 4
      BusinessCommon/src/main/java/com/develop/common/utils/StringUtils.java
  7. 15 6
      BusinessCommon/src/main/java/com/develop/common/widget/TimePickerView.kt
  8. 二進制
      BusinessCommon/src/main/res/drawable-xxxhdpi/ic_detail_tab5.webp
  9. 2 4
      BusinessCommon/src/main/res/values-fr/strings.xml
  10. 1 0
      BusinessCommon/src/main/res/values-tr/strings.xml
  11. 2 1
      BusinessCommon/src/main/res/values/strings.xml
  12. 90 60
      BusinessStep/src/main/java/com/develop/step/ui/ModesDetailActivity.kt
  13. 44 4
      BusinessStep/src/main/java/com/develop/step/ui/recipes_detail/CookDetailActivity.kt
  14. 42 0
      BusinessStep/src/main/java/com/develop/step/ui/recipes_detail/CookDetailChefTipsFragment.kt
  15. 57 32
      BusinessStep/src/main/java/com/develop/step/ui/recipes_detail/CookDetailSourceFragment.kt
  16. 17 4
      BusinessStep/src/main/res/layout/activity_cook_detail.xml
  17. 24 0
      BusinessStep/src/main/res/layout/fragment_detail_cook_chef_tips.xml
  18. 25 0
      BusinessStep/src/main/res/layout/fragment_detail_cook_source.xml
  19. 4 2
      app/src/main/AndroidManifest.xml
  20. 3 3
      libBase/src/main/java/com/develop/base/ext/GlobaExt.kt
  21. 二進制
      libThirdPart/libs/cofar-cooking-device-sdk-0.0.1-SNAPSHOT.jar

+ 34 - 2
BusinessCommon/src/main/java/com/develop/common/data_repo/FoodDataProvider.kt

@@ -6,6 +6,9 @@ import android.util.Log
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.MutableLiveData
 import androidx.room.Room
+import androidx.room.RoomDatabase
+import androidx.room.RoomDatabase.Callback
+import androidx.sqlite.db.SupportSQLiteDatabase
 import com.blankj.utilcode.util.FileUtils
 import com.blankj.utilcode.util.ToastUtils
 import com.blankj.utilcode.util.ZipUtils
@@ -17,6 +20,7 @@ import com.develop.base.util.GlobalToast
 import com.develop.base.util.ThreadUtils
 import com.develop.base.util.TopResumedAtyHolder
 import com.develop.common.data_repo.db.FOOD_MIGRATION_1_2
+import com.develop.common.data_repo.db.FOOD_MIGRATION_2_3
 import com.develop.common.data_repo.db.FoodDatabase
 import com.develop.common.data_repo.db.MIGRATION_1_2
 import com.develop.common.data_repo.db.UserDatabase
@@ -289,10 +293,38 @@ object FoodDataProvider {
     }
 
     fun initFoodDataBase() {
+        //处理数据库
+        StringUtils.modifyDatabase()
+
+
+
         val dbFile = File(RES_DST_PATH, "sqlite.db")
-        foodDatabase = Room.databaseBuilder(
+        // 构建数据库
+         foodDatabase = Room.databaseBuilder(
             BaseApp.application, FoodDatabase::class.java, "sqlite.db"
-        ).allowMainThreadQueries().addMigrations(FOOD_MIGRATION_1_2).createFromFile(dbFile).build()
+        )
+            .allowMainThreadQueries()
+            .createFromFile(dbFile)
+            .addMigrations(FOOD_MIGRATION_1_2, FOOD_MIGRATION_2_3)
+            .addCallback(object : RoomDatabase.Callback() {
+                override fun onCreate(db: SupportSQLiteDatabase) {
+                    super.onCreate(db)
+                    Log.e("TAG room", "Database created with version: ${db.version}")
+                }
+
+                override fun onOpen(db: SupportSQLiteDatabase) {
+                    super.onOpen(db)
+                    Log.e("TAG room", "Database opened with version: ${db.version}")
+                }
+            })
+
+            .build()
+
+//        foodDatabase.query("");
+
+//        var versions = foodDatabase?.openHelper?.readableDatabase?.version
+
+        Log.e("TAG room", "versions:$11")
 
     }
 

+ 5 - 1
BusinessCommon/src/main/java/com/develop/common/data_repo/db/DataFactory.kt

@@ -205,7 +205,11 @@ object DataFactory {
 
         // 2024.3.20 涂鸦新需求,不管有没有涂鸦功能都显示出来
         settingTypeList.add(SettingType.TUYA)
-        nameList.add(resource.getString(R.string.tuya))
+        if (getSN().startsWith("049")){
+            nameList.add(resource.getString(R.string.tuya_049))
+        }else{
+            nameList.add(resource.getString(R.string.tuya))
+        }
         resIdList.add(R.drawable.ic_setting_tuya)
 
 

+ 32 - 2
BusinessCommon/src/main/java/com/develop/common/data_repo/db/FoodDatabase.kt

@@ -1,5 +1,6 @@
 package com.develop.common.data_repo.db
 
+import androidx.room.AutoMigration
 import androidx.room.Database
 import androidx.room.RoomDatabase
 import androidx.room.migration.Migration
@@ -7,14 +8,43 @@ import androidx.sqlite.db.SupportSQLiteDatabase
 import com.develop.common.data_repo.db.dao.FoodConfigDao
 import com.develop.common.data_repo.db.dao.FoodRecipeDao
 import com.develop.common.data_repo.db.entity.*
+import com.develop.common.utils.StringUtils
 
 val FOOD_MIGRATION_1_2: Migration = object : Migration(1, 2) {
     override fun migrate(database: SupportSQLiteDatabase) {
         // 这里是您的迁移代码,用于处理从版本1到版本2的架构变更。
-       database.execSQL("ALTER TABLE cc_dev_recipe ADD COLUMN editionCode TEXT ")
+//       database.execSQL("ALTER TABLE cc_dev_recipe ADD COLUMN editionCode TEXT ")
+
+
+    }
+}
+
+
+
+//val FOOD_MIGRATION_1_2: Migration = object : Migration(1, 2) {
+//    override fun migrate(database: SupportSQLiteDatabase) {
+//        database.execSQL("ALTER TABLE cc_dev_recipe ADD COLUMN editionCode TEXT")
+//    }
+//}
+
+
+//val FOOD_MIGRATION_2_3: Migration = object : Migration(2, 3) {
+//    override fun migrate(database: SupportSQLiteDatabase) {
+//        // 这里是您的迁移代码,用于处理从版本2到版本3的架构变更。
+//        database.execSQL("ALTER TABLE cc_dev_recipe ADD COLUMN food_description TEXT ")
+//        database.execSQL("ALTER TABLE cc_dev_recipe ADD COLUMN chef_rec TEXT ")
+//    }
+//}
+
+// 版本2到版本3的迁移策略
+val FOOD_MIGRATION_2_3: Migration = object : Migration(2, 3) {
+    override fun migrate(database: SupportSQLiteDatabase) {
+        database.execSQL("ALTER TABLE cc_dev_recipe ADD COLUMN food_description TEXT")
+        database.execSQL("ALTER TABLE cc_dev_recipe ADD COLUMN chef_rec TEXT")
     }
 }
 
+//由于需要做sd卡下面数据库版本判断,估在StringUtils工具类写个公共值
 @Database(
     entities = [
         DevAccessory::class,
@@ -29,7 +59,7 @@ val FOOD_MIGRATION_1_2: Migration = object : Migration(1, 2) {
         DevRecipePortionSize::class,
         DevRecipeRelTag::class,
         DevRecipeTag::class
-    ], version = 1, exportSchema = false
+    ], version = StringUtils.roomVersion, exportSchema = false,
 )
 abstract class FoodDatabase : RoomDatabase() {
 

+ 15 - 0
BusinessCommon/src/main/java/com/develop/common/data_repo/db/entity/DevRecipe.kt

@@ -121,6 +121,8 @@ data class DevRecipe(
     @ColumnInfo
     val introduction: String?,
 
+
+
     /**
      * 评分
      */
@@ -141,4 +143,17 @@ data class DevRecipe(
 
 //    @ColumnInfo(name = "editionCode")
 //    val editionCode: String?
+
+    /**
+     * 食谱描述
+     * */
+    @ColumnInfo(name = "food_description")
+    val  foodDescription :String?,
+
+
+    /**
+     * 厨师建议
+     * */
+    @ColumnInfo(name = "chef_rec")
+    val  chefRec :String?
 )

+ 4 - 0
BusinessCommon/src/main/java/com/develop/common/ui/CommonBindingActivity.kt

@@ -296,6 +296,7 @@ abstract class CommonBindingActivity<T : ViewBinding> : BaseBindingActivity<T>()
         }
         //所有模式程序运行结束时没有响三声蜂鸣声提示结果程序
         if (event.msg == "dev_end_of_run_tips") {
+            onDevStop()
             CofarSDK.cfgBeep(0, 3)
         }
         //当前errcode不是0,并且提示是程序完成的提示不需要显示
@@ -587,6 +588,9 @@ abstract class CommonBindingActivity<T : ViewBinding> : BaseBindingActivity<T>()
             }
     }
 
+    //处理程序运行完以后方法回调
+    open fun  onDevStop(){
+    }
     @Subscribe
     fun onTuyaEventEntity(event: TuyaEventEntity) {
         onTuyaMsg(event)

+ 113 - 4
BusinessCommon/src/main/java/com/develop/common/utils/StringUtils.java

@@ -1,7 +1,11 @@
 package com.develop.common.utils;
 
+import static com.develop.common.utils.TuyaUtils.TAG;
+
 import android.app.ActivityManager;
 import android.content.Context;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
 import android.os.Environment;
 import android.os.StatFs;
 import android.text.format.Formatter;
@@ -9,6 +13,7 @@ import android.util.DisplayMetrics;
 import android.util.Log;
 
 import com.develop.base.app.BaseApp;
+import com.develop.common.data_repo.db.FoodDatabase;
 
 
 import net.lingala.zip4j.ZipFile;
@@ -25,6 +30,9 @@ import java.nio.channels.FileChannel;
 import java.security.MessageDigest;
 
 public class StringUtils {
+    //room 食谱数据库版本号
+    public static final int roomVersion = 3;
+
     //换行处理
     public static String getStringWrap(String str) {
         if (str == null) {
@@ -83,7 +91,7 @@ public class StringUtils {
         return sb.toString();
     }
 
-    public static void unZip(String zipPath,String defPath) throws ZipException {
+    public static void unZip(String zipPath, String defPath) throws ZipException {
 
 //        File zipFile = new File(zipPath);
 //        ZipFile zip = new ZipFile(zipFile);
@@ -98,14 +106,15 @@ public class StringUtils {
                 Log.d("TAG jieya111", "zip文件无效");
             }
         } catch (ZipException e) {
-            Log.d("TAG jieya111", "zip异常:"+e.getMessage().toString());
+            Log.d("TAG jieya111", "zip异常:" + e.getMessage().toString());
 
             // 处理异常
             e.printStackTrace();
         }
 
     }
-    public  static  void copyFile(File srcDir, File destDir) throws IOException {
+
+    public static void copyFile(File srcDir, File destDir) throws IOException {
         if (!srcDir.exists()) {
             throw new IllegalArgumentException("TAG Source directory does not exist.");
         }
@@ -117,7 +126,7 @@ public class StringUtils {
         }
         for (File file : srcDir.listFiles()) {
             if (file.isFile()) {
-                Log.d("TAG jieya000", "name:"+file.getName());
+                Log.d("TAG jieya000", "name:" + file.getName());
                 File destFile = new File(destDir, file.getName());
                 FileChannel inChannel = new FileInputStream(file).getChannel();
                 FileChannel outChannel = new FileOutputStream(destFile).getChannel();
@@ -288,4 +297,104 @@ public class StringUtils {
         return memory;
     }
 
+
+    //处理数据库问题
+    public static void modifyDatabase() {
+        String DATABASE_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/cofa_cooking/sqlite.db";
+        SQLiteDatabase db = null;
+        try {
+            db = SQLiteDatabase.openDatabase(DATABASE_PATH, null, SQLiteDatabase.OPEN_READWRITE);
+
+            // 获取当前版本
+            int currentVersion = db.getVersion();
+            Log.d("TAG SQL", "Current Database Version: " + currentVersion);
+
+//            // 修改版本号
+//            int newVersion = currentVersion + 1; // 你可以设置为任何你想要的版本号
+////            db.setVersion(newVersion);
+//            Log.d("TAG SQL", "Updated Database Version to: " + newVersion);
+
+
+//            //判断表里面是否有需要的字段
+//            boolean res = checkColumnExists(db,"cc_dev_recipe","food_description");
+//            Log.d("TAG SQL", "cc_dev_recipe --- food_description :" + res);
+//            boolean  issdas = checkColumnExists(db,"cc_dev_recipe","issdas");
+//            Log.d("TAG SQL", "cc_dev_recipe --- issdas :" + issdas);
+
+
+
+
+            if (currentVersion < roomVersion) {
+                //如果sd卡数据库版本号小于room的版本的时候,需要设置版本后才能预打包数据库
+                db.setVersion(roomVersion);
+                //更新以后,需要在你添加字段的表加列名
+
+
+                 // 向表中插入新的 String 字段
+                String tableName = "cc_dev_recipe"; // 替换为实际的表名
+                String newClumnOne = "food_description"; // 替换为你想要添加的列名
+                String newClumntwo = "chef_rec"; // 替换为你想要添加的列名
+//
+//            // SQLite 不支持直接判断列是否存在,通常需要尝试捕捉异常
+                try {
+
+                    //判断这个表有没有  food_description 字段
+                    if (!checkColumnExists(db,tableName,newClumnOne)){
+                        String alterTableQuery = "ALTER TABLE " + tableName + " ADD COLUMN " + newClumnOne + " TEXT;";
+                        db.execSQL(alterTableQuery);
+                    }
+
+                    //判断这个表有没有  chef_rec 字段
+                    if (!checkColumnExists(db,tableName,newClumntwo)){
+                        String alterTwoTableQuery = "ALTER TABLE " + tableName + " ADD COLUMN " + newClumntwo + " TEXT;";
+                        db.execSQL(alterTwoTableQuery);
+                    }
+                    Log.d("TAG SQL", "Added new column: " + newClumnOne);
+                } catch (Exception e) {
+                    Log.e("TAG SQL", "Error adding new column, it might already exist.", e);
+                }
+
+
+            } else {
+                return;
+            }
+
+
+        } catch (Exception e) {
+            Log.e("TAG SQL", "Error while modifying database", e);
+        } finally {
+            if (db != null) {
+                db.close();
+            }
+        }
+    }
+
+    /**
+     * 方法:检查表中某列是否存在
+     * @param db
+     * @param tableName 表名
+     * @param columnName 列名
+     * 存在返回真,不存在返回假
+     * @return
+     */
+    public static boolean checkColumnExists(SQLiteDatabase db, String tableName, String columnName) {
+        boolean result = false ;
+        Cursor cursor = null ;
+
+        try{
+            cursor = db.rawQuery( "select * from sqlite_master where name = ? and sql like ?"
+                    , new String[]{tableName , "%" + columnName + "%"} );
+            result = null != cursor && cursor.moveToFirst() ;
+        }catch (Exception e){
+            Log.e(TAG,"checkColumnExists..." + e.getMessage()) ;
+        }finally{
+            if(null != cursor && !cursor.isClosed()){
+                cursor.close() ;
+            }
+        }
+
+        return result ;
+    }
+
+
 }

+ 15 - 6
BusinessCommon/src/main/java/com/develop/common/widget/TimePickerView.kt

@@ -42,6 +42,7 @@ class TimePickerView : ConstraintLayout {
     private var firstManager: ScrollLinearManager
     private var secondManager: ScrollLinearManager
     private val animation: Animation = AlphaAnimation(1f, 0.2f)
+    private var isCanChange = true
 
     constructor(context: Context) : super(context) {}
     constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
@@ -122,9 +123,11 @@ class TimePickerView : ConstraintLayout {
             updateDisplayTime()
         })
         binding.tvSetTimeFirst.setOnTouchListener { view, motionEvent ->
-            stopAlphaAnim()
-            alphaAnim(binding.tvSetTimeFirst)
-            onTimePickerCallback?.onTimePickerTouchFirst(1)
+            if (isCanChange){
+                stopAlphaAnim()
+                alphaAnim(binding.tvSetTimeFirst)
+                onTimePickerCallback?.onTimePickerTouchFirst(1)
+            }
             false
         }
         binding.tvSetTimeSecond.addOnScrollListener(LinearPositionObserver { pos ->
@@ -132,9 +135,11 @@ class TimePickerView : ConstraintLayout {
             updateDisplayTime()
         })
         binding.tvSetTimeSecond.setOnTouchListener { view, motionEvent ->
-            stopAlphaAnim()
-            alphaAnim(binding.tvSetTimeSecond)
-            onTimePickerCallback?.onTimePickerTouchFirst(2)
+            if (isCanChange){
+                stopAlphaAnim()
+                alphaAnim(binding.tvSetTimeSecond)
+                onTimePickerCallback?.onTimePickerTouchFirst(2)
+            }
             false
         }
         LinearSnapHelper().attachToRecyclerView(binding.tvSetTimeFirst)
@@ -313,6 +318,10 @@ class TimePickerView : ConstraintLayout {
     }
 
     fun isTimeCanChange(isCanChange: Boolean) {
+        this.isCanChange = isCanChange
+        binding.tvSetTimeFirst.isEnabled = !isCanChange
+        binding.tvSetTimeSecond.isEnabled = !isCanChange
+
         firstManager.setCanScrollVertically(isCanChange)
         secondManager.setCanScrollVertically(isCanChange)
     }

二進制
BusinessCommon/src/main/res/drawable-xxxhdpi/ic_detail_tab5.webp


+ 2 - 4
BusinessCommon/src/main/res/values-fr/strings.xml

@@ -154,7 +154,7 @@ Southern plus client est une plate - forme d’information en ligne développée
     <string name="pmpt_cancel">Annulation</string>
     <string name="pmpt_msg">Conseils</string>
     <string name="dev_end_of_run_tips">Terminé!</string>
-    <string name="hight_temp_warning_tips">La température actuelle est supérieure à 60 et la vitesse du moteur est supérieure à 3 vitesses. Tu es sûr de vouloir continuer?</string>
+    <string name="hight_temp_warning_tips">La température actuelle est supérieure à 60 et la vitesse du moteur est supérieure à 3 vitesses.Vous êtes sûr de vouloir continuer?</string>
     <string name="hight_temp_turbo_tips">La température actuelle est supérieure à 60 et la fonction Turbo ne fonctionne pas</string>
     <string name="update_msg">Mise à jour du système, veuillez patienter...</string>
     <string name="update_title">Est - ce la dernière version?</string>
@@ -236,13 +236,11 @@ Southern plus client est une plate - forme d’information en ligne développée
     <string name="unset_target_time">L’heure n’est pas encore définie.</string>
     <string name="recipe_complete">La recette est terminée</string>
     <string name="engjoy_your_meal">Bon repas à vous!</string>
-    <string name="gan_sao_yi_chan">Attention \n · température élevée \n · pas de contenu dans le bol lorsque chauffé \n · ajouter des ingrédients, liquide</string>
-
+    <string name="gan_sao_yi_chan">Attention \n · Chauffe du bol à vide \n · Risque de surchauffe \n · veuillez rajouter de l’eau.</string>
     <string name="zhuan_su_fan_kui_yi_chan">Attention \n · le couvercle du bol n’est pas complètement engagé \n · le moteur est surchargé, permettant à la machine de refroidir, redémarrez avec moins de contenu du bol.</string>
     <string name="dian_zi_cheng_tong_xin_yi_chan">Attention \n · poids non mesuré, balance incorrecte \n · Échelle défectueuse </string>
     <string name="ntc_yi_chan"> Remarque: NTC ne fonctionne pas correctement, veuillez contacter le service technique.</string>
     <string name="mei_fang_guo_yi_chan">Attention : bol non détecté. Veuillez replacer le bol sur la base</string>
-
     <string name="empty_notice">Notification vide</string>
     <string name="press_the_button">Appuyez sur le bouton</string>
     <string name="please_fill_in">Veuillez remplir</string>

+ 1 - 0
BusinessCommon/src/main/res/values-tr/strings.xml

@@ -57,6 +57,7 @@ Nanfang Plus Client, Guangdong Nanfang Newspaper Mobile Media Co, Ltd (bundan b
     <string name="reset">FABRİKA AYARLARINA GERİ DÖN</string>
     <string name="about">HAKKINDA</string>
     <string name="tuya">FAKİR HOME</string>
+    <string name="tuya_049">Uygulama İndirme</string>
     <string name="weight">TARTI</string>
     <string name="local_recipes">Yöresel tarifler</string>
     <string name="download">İndir</string>

+ 2 - 1
BusinessCommon/src/main/res/values/strings.xml

@@ -67,7 +67,7 @@ Nanfang plus client is an online information platform developed and operated by
     <string name="reset">RESTORE FACTORY SETTINGS</string>
     <string name="about">ABOUT</string>
     <string name="tuya">TUYA</string>
-
+    <string name="tuya_049">TUYA</string>
     <string name="tuya_app_title">With Tuya</string>
     <string name="tuya_app_content">Please use app (with Tuya ) to scan the QR code</string>
     <string name="tuya_sn_title">Cobotmix</string>
@@ -224,6 +224,7 @@ Nanfang plus client is an online information platform developed and operated by
     <string name="food_minutes">minutes</string>
 
     <string name="ready_in">Ready in:</string>
+    <string name="rest_time">Rest time:</string>
     <string name="jar">JAR</string>
     <string name="serving_sizes">Serving sizes</string>
     <string name="score">Score</string>

+ 90 - 60
BusinessStep/src/main/java/com/develop/step/ui/ModesDetailActivity.kt

@@ -134,8 +134,8 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
     private var is011 = false
     private var isResetZero = -1  //初始扭橙的值
     private var sn = getSN()
-    private var keep:Boolean =false
-    private lateinit var baseMode :BaseDevMode
+    private var keep: Boolean = false
+    private lateinit var baseMode: BaseDevMode
     private val deviceStateDialog by lazy {
         CancelConfirmDialog()
     }
@@ -258,7 +258,7 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
         viewModel.modeType = intent.extras?.getString(MODE_TYPE, ModesType.CHOP.name) ?: ""
         modeName = intent.extras?.getString("mode_name", "") ?: ""
         opMode = intent.extras?.getString("OP_MODE", "HAND") ?: "HAND"
-        keep = intent.extras?.getBoolean("keep",false) ?:false
+        keep = intent.extras?.getBoolean("keep", false) ?: false
         viewModel.lastModeType = viewModel.modeType
         lastModeType = viewModel.modeType
         modeType = lastModeType
@@ -350,11 +350,11 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
                                 /**
                                  * 当后台点进来模式页面,currentTemp为0故在这重新set值
                                  * */
-                                if (currentTemp==0&&keep){
+                                if (currentTemp == 0 && keep) {
                                     // temp 当前温度  目标温度 targetTemp
-                                    currentTemp = if (CofarSDK.devInfo().temp>baseMode.minTemp){
+                                    currentTemp = if (CofarSDK.devInfo().temp > baseMode.minTemp) {
                                         CofarSDK.devInfo().temp.toInt()
-                                    }else{
+                                    } else {
                                         baseMode.minTemp
                                     }
                                 }
@@ -421,12 +421,12 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
                                  * 当后台点进来模式页面,currentTemp为0故在这重新set值
                                  * */
 
-                                if (currentTemp==0&&keep){
+                                if (currentTemp == 0 && keep) {
                                     // temp 当前温度  目标温度 targetTemp
-                                    currentTemp = if (CofarSDK.devInfo().temp>baseMode.minTemp){
+                                    currentTemp = if (CofarSDK.devInfo().temp > baseMode.minTemp) {
                                         CofarSDK.devInfo().temp.toInt()
-                                    }else{
-                                        baseMode.minTemp+CofarSDK.getTempInterval()
+                                    } else {
+                                        baseMode.minTemp + CofarSDK.getTempInterval()
                                     }
                                 }
 
@@ -703,6 +703,7 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
             return;
         }
 
+
         ThreadUtils.runOnMainThread({
             //currDevInfo.targetTime,
             // currDevInfo.targetTime.toLong()
@@ -775,12 +776,12 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
 
         //devInfo.potCloverStatus 0是合盖,1是没盒盖
         //处理扭橙逻辑 一进来是扭橙盖,重新打开,重新闭合 没办法跳转到扭橙页面
-        if (event.devInfo.potCloverStatus.toInt() == 1){
+        if (event.devInfo.potCloverStatus.toInt() == 1) {
             isResetZero = event.devInfo.resetZero.toInt()
         }
 
         //处理扭橙运行过程中打开盖子还倒计时,估要调用SDK stop方法
-        if (modeType==WorkModes.CITRUS_JUICER&&isClickType == DevStatus.RUNNING.toInt() &&event.devInfo.potCloverStatus.toInt() == 1){
+        if (modeType == WorkModes.CITRUS_JUICER && isClickType == DevStatus.RUNNING.toInt() && event.devInfo.potCloverStatus.toInt() == 1) {
             stopClick()
         }
 
@@ -791,8 +792,7 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
         if (event.devInfo.resetZero.toInt() == 1 && event.devInfo.resetZero.toInt() != isResetZero) {
 
 
-
-            var modeName = if (sn.startsWith("011"))  {
+            var modeName = if (sn.startsWith("011")) {
                 resources.getString(com.develop.common.R.string.citrus_juicer_011)
             } else {
                 resources.getString(com.develop.common.R.string.citrus_juicer)
@@ -890,6 +890,7 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
                 }
             }
             currDevInfo.mode.apply {
+
                 updateTempUI(
                     minTemp.toFloat(),
                     maxTemp.toFloat(),
@@ -1011,30 +1012,12 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
     var configLock = false;
 
 
-    private fun initModeData(type: String, keep: Boolean?= false) {
+    private fun initModeData(type: String, keep: Boolean? = false) {
 
-        Log.d("TAG initModeData", "viewModel.modeType:" + viewModel.modeType+ "    keep:"+keep)
+        Log.d("TAG initModeData", "viewModel.modeType:" + viewModel.modeType + "    keep:" + keep)
         viewModel.modeType.apply {
-             baseMode = CofarSDK.devMode(this)
-            //处理5/7/10寸屏,默认转速不同
-            if (baseMode is Knead && !sn.startsWith("011")){
-                var  defMotorGear = when(StringUtils.getScreenSize(this@ModesDetailActivity)){
-                    5->{
-                        1
-                    }
-                    7->{
-                        3
-                    }
-                    10->{
-                        3
-                    }
-                    else->{
-                        1
-                    }
-                }
-                baseMode.defaultMotorGear = defMotorGear
-            }
-
+            baseMode = CofarSDK.devMode(this)
+            setKneadMotorGear(false)
 
 
             //显示对应模式UI
@@ -1075,11 +1058,11 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
                             motorDirection = restoreConfig.motorDirection;
                             motorGear = restoreConfig.motorGear;
                             targetTime = restoreConfig.targetTime;
-                        }else{
-                             targetTemp = baseMode.defaultTemp.toShort()
-                             motorDirection = baseMode.motorDirection.toByte()
-                             motorGear = baseMode.defaultMotorGear.toByte()
-                             targetTime = baseMode.defaultTime.toInt()
+                        } else {
+                            targetTemp = baseMode.defaultTemp.toShort()
+                            motorDirection = baseMode.motorDirection.toByte()
+                            motorGear = baseMode.defaultMotorGear.toByte()
+                            targetTime = baseMode.defaultTime.toInt()
                         }
                     } else {
                         CofarSDK.changeMode(type, baseMode)
@@ -1095,7 +1078,7 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
 
                     baseMode.apply {
                         currentTemp = targetTemp.toInt()
-                        Log.d("TAG currentTemp","currentTemp:"+currentTemp)
+                        Log.d("TAG currentTemp", "currentTemp:" + currentTemp)
                         updateTempUI(
                             minTemp.toFloat(),
                             maxTemp.toFloat(),
@@ -1289,6 +1272,7 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
                         ModesType.TURBO.name -> {
                             CofarSDK.stop(false)
                         }
+
                         ModesType.SM_WIGHT.name -> {
                             CofarSDK.stop(false)
                             CofarSDK.startWeight()
@@ -1297,6 +1281,7 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
                         ModesType.SM_TURBO.name -> {
                             CofarSDK.stop(false)
                         }
+
                         else -> {
                             userChanging = false
                             CofarSDK.startRunning(viewModel.modeType)
@@ -1357,7 +1342,7 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
                 MotionEvent.ACTION_DOWN -> {
                     if (modeType != WorkModes.CITRUS_JUICER && CofarSDK.devInfo().resetZero.toInt() == 1) {
                         showMsgDialog(resources.getString(com.develop.common.R.string.dev_remove_orange_parts))
-                    }else{
+                    } else {
                         Log.d("dddddd", "按下(${motionEvent.x},${motionEvent.y})")
                         turboDownEvent()
                     }
@@ -1400,7 +1385,7 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
             if (viewModel.modeType == ModesType.TURBO.name) {
                 binding.llTurboView.visibility = View.VISIBLE
             }
-        }else if (viewModel.modeType == ModesType.CITRUS_JUICER.name){
+        } else if (viewModel.modeType == ModesType.CITRUS_JUICER.name) {
             binding.ivTurbo.visibility = View.GONE
         } else {
 //            isWidget = true
@@ -1735,7 +1720,6 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
         binding.apply {
 
 
-
             clCookTemp.updateChangeValue("${FoodSdkUtils.parseTemp(currDevInfo.temp)}°C")
             tempRingView.setRange(minTemp, maxTemp)
             tempRingView.setCanTouch(isTempChange)
@@ -1756,7 +1740,6 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
             }
 
 
-
             var tempBuffer = CofarSDK.devInfo().targetTempBuffer
             steamFire.configNum(
                 CofarUtils.parseTemp(if (tempBuffer.toInt() != -1) tempBuffer else targetTemp.toShort())
@@ -1960,7 +1943,7 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
         //当前用户正在修改不更新按钮状态
         if (userChanging) return
         //切碎功能隐藏按钮
-        if (viewModel.modeType == ModesType.TURBO.name||viewModel.modeType == ModesType.SM_TURBO.name) {
+        if (viewModel.modeType == ModesType.TURBO.name || viewModel.modeType == ModesType.SM_TURBO.name) {
             binding.apply {
                 btnStart.visibility = View.GONE
                 btnResume.visibility = View.GONE
@@ -1972,7 +1955,7 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
             return
         }
 
-        if (viewModel.modeType == ModesType.WIGHT.name||viewModel.modeType == ModesType.SM_WIGHT.name) {
+        if (viewModel.modeType == ModesType.WIGHT.name || viewModel.modeType == ModesType.SM_WIGHT.name) {
             binding.apply {
                 btnStart.visibility = View.GONE
                 btnResume.visibility = View.GONE
@@ -2027,13 +2010,13 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
             DevStatus.STOP -> {
                 binding.apply {
                     ivWeight.visibility = View.VISIBLE
-                    if (viewModel.modeType == ModesType.CITRUS_JUICER.name){
+                    if (viewModel.modeType == ModesType.CITRUS_JUICER.name) {
                         binding.ivTurbo.visibility = View.GONE
-                    }else{
-                        if (isModelNum == "5067"&&viewModel.modeType == ModesType.SM_WIGHT.name){
+                    } else {
+                        if (isModelNum == "5067" && viewModel.modeType == ModesType.SM_WIGHT.name) {
                             ivWeight.visibility = View.GONE
                             ivTurbo.visibility = View.GONE
-                        }else{
+                        } else {
                             ivTurbo.visibility = View.VISIBLE
                         }
                     }
@@ -2075,6 +2058,7 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
      * 点击开始操作
      */
     private fun startClick(showStopTips: Boolean = true) {
+
         var devInfo = CofarSDK.devInfo()
         //判断是否是空炸错误,由于汤锅错误SDK 已经做了
         if (ConfigUtils.getBooleanErrCode(devInfo.errCode.toInt()) && devInfo.devMode == DevModes.AIR_FRYER) {
@@ -2186,10 +2170,12 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
      * 点击停止操作
      */
     private fun stopClick(tips: Boolean = true) {
+
         userChanging = false
         //中途系统出现故障记录
         isClickType = 0
 
+
         //结束
         CofarSDK.stop(tips)
         try {
@@ -2269,7 +2255,7 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
      */
     private fun backClick() {
         if (modeChange) {
-            if (modeType == ModesType.TURBO.name||modeType == ModesType.SM_TURBO.name) { //TURBO未停止之前不能退出
+            if (modeType == ModesType.TURBO.name || modeType == ModesType.SM_TURBO.name) { //TURBO未停止之前不能退出
                 CofarSDK.stop(false)
                 if (DevStatus.STOP != CofarSDK.devInfo().status.toByte()) {
                     return
@@ -2424,7 +2410,7 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
         viewModel.stopTurbo()
     }
 
-    private fun init011Mode(obj :Any){
+    private fun init011Mode(obj: Any) {
 
 
     }
@@ -2632,16 +2618,18 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
         when (event.isType) {
             0 -> {
                 //模式
-                if (CofarSDK.devInfo().runningStatus != DevStatus.STOP){
+                if (CofarSDK.devInfo().runningStatus != DevStatus.STOP) {
                     showMsgOKDialog(getString(com.develop.common.R.string.running_block_tips))
                 }
             }
+
             1 -> {
                 //食谱
-                if (CofarSDK.devInfo().runningStatus != DevStatus.STOP){
+                if (CofarSDK.devInfo().runningStatus != DevStatus.STOP) {
                     var backDialog = CancelConfirmDialog()
                     backDialog.apply {
-                        title = ctx.getString(com.develop.common.R.string.keep_cooking_in_the_background)
+                        title =
+                            ctx.getString(com.develop.common.R.string.keep_cooking_in_the_background)
                         onDialogClickListener = object : CancelConfirmDialog.OnDialogClickListener {
                             override fun onConfirm() {
                                 if (CofarSDK.devInfo().status == DevStatus.STOP.toInt()) {
@@ -2670,7 +2658,7 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
                                     FloatWindowManager.showStepFlowWindow(cookStepEvent)
 
 
-                                    getRecipe(event.recipeNumber?:"")
+                                    getRecipe(event.recipeNumber ?: "")
 
                                     finish()
                                 }
@@ -2681,7 +2669,7 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
                                 runOnMainThread {
                                     FloatWindowManager.hideStepFlowWindow()
                                     CofarSDK.stop()
-                                    getRecipe(event.recipeNumber?:"")
+                                    getRecipe(event.recipeNumber ?: "")
                                     finish()
                                 }
                             }
@@ -2693,13 +2681,53 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
                 }
 
             }
+
             else -> {
 
             }
         }
     }
 
-    private  fun  getRecipe(number:String){
+    private fun setKneadMotorGear(isStop :Boolean) {
+        //处理5/7/10寸屏,默认转速不同
+        if (baseMode is Knead && !sn.startsWith("011")) {
+            var defMotorGear = when (StringUtils.getScreenSize(this@ModesDetailActivity)) {
+                5 -> {
+                    1
+                }
+
+                7 -> {
+                    3
+                }
+
+                10 -> {
+                    3
+                }
+
+                else -> {
+                    1
+                }
+            }
+            baseMode.defaultMotorGear = defMotorGear
+//            if (isStop){
+////                baseMode.isMotorGearChange = true
+//                CofarSDK.devInfo().motorGear = defMotorGear.toByte()
+////                CofarSDK.cfgMotorGear(defMotorGear.toByte())
+//            }
+
+//                CofarSDK.cfgMotorGearNative((byte)this.initMotorGear);
+
+        }
+    }
+
+    //程序运行完以后回调
+    override fun onDevStop() {
+        setKneadMotorGear(true)
+
+
+    }
+
+    private fun getRecipe(number: String) {
         FoodDataProvider.getDatabase().recipeDao().apply {
             var recipeNumber = number
             if (recipeNumber.contains("@")) {
@@ -2729,4 +2757,6 @@ class ModesDetailActivity : CommonBVMActivity<ActivityModeDetailBinding, ModesVi
 
         }
     }
+
+
 }

+ 44 - 4
BusinessStep/src/main/java/com/develop/step/ui/recipes_detail/CookDetailActivity.kt

@@ -188,6 +188,10 @@ class CookDetailActivity : CommonBVMActivity<ActivityCookDetailBinding, CookDeta
             binding.ivTab4.drawable?.apply {
                 DrawableCompat.setTintList(this, tintList)
             }
+            binding.ivTab5.drawable?.apply {
+                DrawableCompat.setTintList(this, tintList)
+            }
+
             binding.ivTab1.setPadding(
                 (com.develop.common.R.dimen.convert_8px).resId2Dimension().toInt()
             )
@@ -200,6 +204,10 @@ class CookDetailActivity : CommonBVMActivity<ActivityCookDetailBinding, CookDeta
             binding.ivTab4.setPadding(
                 (com.develop.common.R.dimen.convert_8px).resId2Dimension().toInt()
             )
+            binding.ivTab5.setPadding(
+                (com.develop.common.R.dimen.convert_8px).resId2Dimension().toInt()
+            )
+
         }
 
 
@@ -248,18 +256,20 @@ class CookDetailActivity : CommonBVMActivity<ActivityCookDetailBinding, CookDeta
         allTabViews.add(binding.ivTab2)
         allTabViews.add(binding.ivTab3)
         binding.ivTab4.setGone()
+        if (!sn.startsWith("033")){
+            binding.ivTab5.setGone()
+        }else{
+         allTabViews.add(binding.ivTab5)
+        }
         selectTab(TAB_SOURCE)
         if (is062) {
             binding.tvMoreDelete.setVisible()
         } else {
             binding.tvMoreDelete.setGone()
         }
-        if (sn.startsWith("010F")||sn.startsWith("011")) {
+        if (sn.startsWith("010F")||sn.startsWith("011")||sn.startsWith("033")) {
             binding.tvMoreShare.setGone()
         }
-        if (sn.startsWith("011")){
-
-        }
     }
 
     private fun initListener() {
@@ -275,6 +285,10 @@ class CookDetailActivity : CommonBVMActivity<ActivityCookDetailBinding, CookDeta
         binding.ivTab4.setOnClickListener {
             selectTab(TAB_SERVE)
         }
+
+        binding.ivTab5.setOnClickListener {
+            selectTab(TAB_CHEF)
+        }
         binding.clStartCooking.setOnClickListener {
             if (cookSource == "remote") {
                 if (viewModel.isDownloadSuccess()) {
@@ -467,6 +481,12 @@ class CookDetailActivity : CommonBVMActivity<ActivityCookDetailBinding, CookDeta
                 binding.ivTab4.isSelected = false
                 replaceFragmentInstance(R.id.fl_tab_content, CookDetailServeFragment())
             }
+
+            TAB_CHEF -> {
+                binding.ivTab5.isSelected = false
+                replaceFragmentInstance(R.id.fl_tab_content, CookDetailChefTipsFragment())
+            }
+
         }
     }
 
@@ -490,6 +510,7 @@ class CookDetailActivity : CommonBVMActivity<ActivityCookDetailBinding, CookDeta
         }
         timeDescBuilder.append("\n")
         timeDescBuilder.append(getString(com.develop.common.R.string.ready_in))
+        timeDescBuilder.append(" ")
         if (detail.recipe.makeHours.isPositive()) {
             timeDescBuilder.append(detail.recipe.makeHours)
             timeDescBuilder.append(getString(com.develop.common.R.string.hours))
@@ -499,6 +520,24 @@ class CookDetailActivity : CommonBVMActivity<ActivityCookDetailBinding, CookDeta
             timeDescBuilder.append(detail.recipe.makeMinutes)
             timeDescBuilder.append(getString(com.develop.common.R.string.min))
         }
+        if (sn.startsWith("033")&&(detail.recipe.restHours.isPositive()||detail.recipe.restMinutes.isPositive())){
+            timeDescBuilder.append("\n")
+            timeDescBuilder.append(getString(com.develop.common.R.string.rest_time))
+            timeDescBuilder.append(" ")
+            if (detail.recipe.restHours.isPositive()) {
+                timeDescBuilder.append(detail.recipe.restHours)
+                timeDescBuilder.append(getString(com.develop.common.R.string.hours))
+                timeDescBuilder.append(" ")
+            }
+            if (detail.recipe.restMinutes.isPositive()) {
+                timeDescBuilder.append(detail.recipe.restMinutes)
+                timeDescBuilder.append(getString(com.develop.common.R.string.min))
+            }
+
+
+        }
+
+
 
         binding.tvFoodTime.text = timeDescBuilder.toString()
         if (is062){
@@ -640,5 +679,6 @@ class CookDetailActivity : CommonBVMActivity<ActivityCookDetailBinding, CookDeta
         private const val TAB_DESC = 2
         private const val TAB_TOOLS = 3
         private const val TAB_SERVE = 4
+        private const val TAB_CHEF = 5
     }
 }

+ 42 - 0
BusinessStep/src/main/java/com/develop/step/ui/recipes_detail/CookDetailChefTipsFragment.kt

@@ -0,0 +1,42 @@
+package com.develop.step.ui.recipes_detail
+
+import android.util.Log
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import com.develop.common.ui.CommonBVMFragment
+import com.develop.common.utils.StringUtils
+import com.develop.step.databinding.FragmentDetailCookChefTipsBinding
+import com.develop.step.databinding.FragmentDetailCookDescBinding
+import com.develop.step.viewmodel.CookDetailViewModel
+
+class CookDetailChefTipsFragment :
+    CommonBVMFragment<FragmentDetailCookChefTipsBinding, CookDetailViewModel>() {
+    override fun createViewModel(): CookDetailViewModel {
+        return getViewModelOfActivity(CookDetailViewModel::class.java)
+    }
+
+    override fun createViewBinding(
+        inflater: LayoutInflater,
+        container: ViewGroup?
+    ): FragmentDetailCookChefTipsBinding {
+        return FragmentDetailCookChefTipsBinding.inflate(inflater, container, false)
+    }
+
+    override fun onPostCreateView() {
+        super.onPostCreateView()
+        viewModel.getRecipeLiveData().observe(viewLifecycleOwner) {
+            var  duction = it.recipe.chefRec
+            if (duction.isNullOrEmpty()){
+                duction = ""
+            }
+            //由于菜谱包介绍的json会返回null,估添加以上判断,如果null下面就会崩
+            //食谱总步骤内容过于密集显示,需要分段显示
+//            binding.tvStepDetail.text = it.recipe.introduction
+            duction.let {str ->
+                binding.tvStepDetail.text = StringUtils.getStringWrap(str)
+            }
+
+        }
+    }
+}
+

+ 57 - 32
BusinessStep/src/main/java/com/develop/step/ui/recipes_detail/CookDetailSourceFragment.kt

@@ -5,8 +5,10 @@ import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
 import android.widget.TextView
+import com.develop.base.ext.getSN
 import com.develop.base.ext.updateText
 import com.develop.common.ui.CommonBVMFragment
+import com.develop.common.utils.StringUtils
 import com.develop.step.R
 import com.develop.step.databinding.FragmentDetailCookSourceBinding
 import com.develop.step.ui.recipes_detail.model.CookSourceItem
@@ -31,44 +33,67 @@ class CookDetailSourceFragment :
 
     override fun onPostCreateView() {
         super.onPostCreateView()
-        binding.rvList.apply {
-            linear()
-            setup {
-                addType<CookSourceItem>(R.layout.item_cook_source)
-                onBind {
-                    val model = getModel<CookSourceItem>()
-                    findView<TextView>(R.id.tv_source_name).updateText(model.name)
-                    findView<TextView>(R.id.tv_source_amount).updateText(model.amount)
+        if (getSN().startsWith("033")){
+            binding.sourceScroll.visibility = View.VISIBLE
+
+            viewModel.getRecipeLiveData().observe(viewLifecycleOwner) {
+                var  foodDescription = it.recipe.foodDescription
+                if (foodDescription.isNullOrEmpty()){
+                    foodDescription = ""
+                }
+                //由于菜谱包介绍的json会返回null,估添加以上判断,如果null下面就会崩
+                //食谱总步骤内容过于密集显示,需要分段显示
+//            binding.tvStepDetail.text = it.recipe.introduction
+                foodDescription.let {str ->
+//                    binding.tvSourceDetail.text = StringUtils.getStringWrap(str)
+                    binding.tvSourceDetail.text = str
                 }
+
             }
-        }
-        viewModel.getRecipeLiveData().observe(viewLifecycleOwner) {
-            viewModel.portionSizeLiveData.observe(viewLifecycleOwner) { size ->
-                val sourceItems = mutableListOf<CookSourceItem>()
-                val originalList = mutableListOf<CookSourceItem>()
-                for (recipeFood in it.material) {
-                    val sourceItem = CookSourceItem(
-                        recipeFood.foodName ?: "",
-                        "${BigDecimal.valueOf(recipeFood.amount ?: 0f.toDouble()).stripTrailingZeros().toPlainString()} ${recipeFood.unit}"
-                    )
-                    if (recipeFood.recipePortionSizeNumber == size.portionSize) {
-                        sourceItems.add(sourceItem)
+
+
+        }else{
+            binding.rvList.visibility = View.VISIBLE
+            binding.rvList.apply {
+                linear()
+                setup {
+                    addType<CookSourceItem>(R.layout.item_cook_source)
+                    onBind {
+                        val model = getModel<CookSourceItem>()
+                        findView<TextView>(R.id.tv_source_name).updateText(model.name)
+                        findView<TextView>(R.id.tv_source_amount).updateText(model.amount)
                     }
-                    originalList.add(sourceItem)
                 }
-                if (sourceItems.isEmpty()) {
-                    // 防止没有任何数据显示
-                    sourceItems.addAll(originalList)
-                }
-                val jarCount = size?.portionSize?.toIntOrNull() ?: 1
-                val string = if (jarCount > 1) {
-                    getString(com.develop.common.R.string.make_n_jars) ?: jarCount.toString()
-                } else {
-                    getString(com.develop.common.R.string.make_1_jar)
+            }
+            viewModel.getRecipeLiveData().observe(viewLifecycleOwner) {
+                viewModel.portionSizeLiveData.observe(viewLifecycleOwner) { size ->
+                    val sourceItems = mutableListOf<CookSourceItem>()
+                    val originalList = mutableListOf<CookSourceItem>()
+                    for (recipeFood in it.material) {
+                        val sourceItem = CookSourceItem(
+                            recipeFood.foodName ?: "",
+                            "${BigDecimal.valueOf(recipeFood.amount ?: 0f.toDouble()).stripTrailingZeros().toPlainString()} ${recipeFood.unit}"
+                        )
+                        if (recipeFood.recipePortionSizeNumber == size.portionSize) {
+                            sourceItems.add(sourceItem)
+                        }
+                        originalList.add(sourceItem)
+                    }
+                    if (sourceItems.isEmpty()) {
+                        // 防止没有任何数据显示
+                        sourceItems.addAll(originalList)
+                    }
+                    val jarCount = size?.portionSize?.toIntOrNull() ?: 1
+                    val string = if (jarCount > 1) {
+                        getString(com.develop.common.R.string.make_n_jars) ?: jarCount.toString()
+                    } else {
+                        getString(com.develop.common.R.string.make_1_jar)
+                    }
+                    binding.tvStepTitle.text = string
+                    binding.rvList.models = sourceItems
                 }
-                binding.tvStepTitle.text = string
-                binding.rvList.models = sourceItems
             }
         }
+
     }
 }

+ 17 - 4
BusinessStep/src/main/res/layout/activity_cook_detail.xml

@@ -133,10 +133,10 @@
         android:id="@+id/view_icon2"
         android:layout_width="@dimen/convert_40px"
         android:layout_height="@dimen/convert_40px"
-        android:layout_marginTop="@dimen/convert_56px"
         android:background="@drawable/ic_detail_easy"
+        android:layout_marginTop="@dimen/convert_20px"
         app:layout_constraintStart_toStartOf="@+id/view_icon1"
-        app:layout_constraintTop_toBottomOf="@+id/view_icon1" />
+        app:layout_constraintTop_toBottomOf="@+id/tv_food_time" />
 
     <TextView
         android:id="@+id/tv_jar_count"
@@ -296,6 +296,7 @@
 
     <ImageView
         android:id="@+id/iv_tab4"
+        android:visibility="gone"
         android:layout_width="@dimen/convert_100px"
         android:layout_height="@dimen/convert_100px"
         android:background="@drawable/bg_detail_tab_selector"
@@ -303,11 +304,23 @@
         android:padding="@dimen/convert_18px"
         android:layout_marginTop="@dimen/convert_100px"
         android:src="@drawable/ic_detail_tab4"
-        app:layout_constraintEnd_toStartOf="@+id/iv_top_banner"
+        app:layout_constraintEnd_toStartOf="@+id/iv_tab5"
         app:layout_constraintStart_toEndOf="@+id/iv_tab3"
         app:layout_constraintTop_toTopOf="parent"
         app:tint="@color/color_cook_tab_tint" />
-
+    <ImageView
+        android:id="@+id/iv_tab5"
+        android:layout_width="@dimen/convert_100px"
+        android:layout_height="@dimen/convert_100px"
+        android:background="@drawable/bg_detail_tab_selector"
+        android:elevation="@dimen/convert_8px"
+        android:padding="@dimen/convert_18px"
+        android:layout_marginTop="@dimen/convert_100px"
+        android:src="@drawable/ic_detail_tab5"
+        app:layout_constraintEnd_toStartOf="@+id/iv_top_banner"
+        app:layout_constraintStart_toEndOf="@+id/iv_tab4"
+        app:layout_constraintTop_toTopOf="parent"
+        app:tint="@color/color_cook_tab_tint" />
     <FrameLayout
         android:id="@+id/fl_tab_content"
         android:layout_width="0dp"

+ 24 - 0
BusinessStep/src/main/res/layout/fragment_detail_cook_chef_tips.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ScrollView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:paddingHorizontal="@dimen/convert_50px"
+    android:paddingTop="@dimen/convert_40px">
+
+    <TextView
+        android:id="@+id/tv_step_detail"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="MAKES 2 JARS (300 ML EACH)"
+        android:textSize="@dimen/convert_28px"
+        android:textColor="@color/step_detail"
+        android:paddingBottom="@dimen/convert_5px"
+        android:lineSpacingExtra="@dimen/convert_30px"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+
+        />
+
+</ScrollView>

+ 25 - 0
BusinessStep/src/main/res/layout/fragment_detail_cook_source.xml

@@ -6,6 +6,30 @@
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:paddingHorizontal="@dimen/convert_40px">
 
+    <ScrollView
+        android:visibility="gone"
+        android:id="@+id/source_scroll"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:paddingHorizontal="@dimen/convert_50px"
+        android:paddingTop="@dimen/convert_40px">
+
+        <TextView
+            android:id="@+id/tv_source__detail"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="MAKES 2 JARS (300 ML EACH)"
+            android:textSize="@dimen/convert_28px"
+            android:textColor="@color/step_detail"
+            android:paddingBottom="@dimen/convert_5px"
+            android:lineSpacingExtra="@dimen/convert_30px"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+
+            />
+
+    </ScrollView>
+
     <TextView
         android:visibility="gone"
         android:id="@+id/tv_step_title"
@@ -22,6 +46,7 @@
         android:id="@+id/rv_list"
         android:layout_width="match_parent"
         android:layout_height="0dp"
+        android:visibility="gone"
         android:layout_marginTop="@dimen/convert_5px"
         app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
         app:layout_constraintTop_toBottomOf="@+id/tv_step_title"

+ 4 - 2
app/src/main/AndroidManifest.xml

@@ -32,7 +32,7 @@
 
     <application
         android:name=".FoodCookingApp"
-        android:allowBackup="true"
+        android:allowBackup="false"
         android:dataExtractionRules="@xml/data_extraction_rules"
         android:fullBackupContent="@xml/backup_rules"
         android:icon="@mipmap/ic_launcher"
@@ -44,7 +44,9 @@
         android:supportsRtl="true"
         android:theme="@string/app_theme"
         android:largeHeap="true"
-        tools:targetApi="31">
+        tools:targetApi="31"
+        tools:replace="android:allowBackup"
+        >
 
 
 

+ 3 - 3
libBase/src/main/java/com/develop/base/ext/GlobaExt.kt

@@ -228,7 +228,7 @@ fun getSN(): String {
 //        return "032D21060020123010190001"
 //        return "000A50370020123010190011"
 //         return  "030A10390020123010190002"
-//        return  "033F20020020123010190001"
+        return  "033F20020020123010190001"
 //        return "033G20020020123010190001"
 //        return  "014A19050020123010190002"
 //        return "029C21010020123010190001"
@@ -238,7 +238,7 @@ fun getSN(): String {
 //        return  "062A20030020123010190003"
 //        return "062A20030020123010190004"
 //        return  "063A10390020123010190001"
-        return  "049B10390020123010190001"
+//        return  "049B10390020123010190001"
 //        return "000A50370020123010190017"
 
 //        return  "000A10390020123010190023"
@@ -266,7 +266,7 @@ fun getSN(): String {
 fun getGoneLogin(): Boolean {
     var sn = getSN()
     return sn.startsWith("032D") || sn.startsWith("011A")
-            || sn.startsWith("030A") || sn.startsWith("010F")
+            || sn.startsWith("030A") || sn.startsWith("010F")|| sn.startsWith("033F")
 }
 
 fun getSNUrl(): String {

二進制
libThirdPart/libs/cofar-cooking-device-sdk-0.0.1-SNAPSHOT.jar