1.添加多表盘选择
authorkfl_614 <kfl_614@163.com>
Sun, 29 Mar 2020 10:36:39 +0000 (18:36 +0800)
committerkfl_614 <kfl_614@163.com>
Sun, 29 Mar 2020 10:36:39 +0000 (18:36 +0800)
2.添加低电量模式
3.优化框架结构。防止在切换Fragment装天异常。
4.修复APP列表指示器的间距

Signed-off-by: kfl_614 <kfl_614@163.com>
71 files changed:
app/EQC_G5.jks [new file with mode: 0644]
app/build.gradle
app/src/main/AndroidManifest.xml
app/src/main/java/com/ic/launcher/FragmentManage.java [new file with mode: 0644]
app/src/main/java/com/ic/launcher/IcLauncherApplication.java
app/src/main/java/com/ic/launcher/MainActivity.java
app/src/main/java/com/ic/launcher/SelectDialActivity.java [new file with mode: 0644]
app/src/main/java/com/ic/launcher/adapter/WatchPreviewAdapter.java [new file with mode: 0644]
app/src/main/java/com/ic/launcher/configure/l02/L02AppInfo.java
app/src/main/java/com/ic/launcher/configure/l02/L02Icon.java
app/src/main/java/com/ic/launcher/entity/ClockDialEntity.java [new file with mode: 0644]
app/src/main/java/com/ic/launcher/fragment/AppListFragment.java
app/src/main/java/com/ic/launcher/fragment/BaseFragment.java [new file with mode: 0644]
app/src/main/java/com/ic/launcher/fragment/L02MainFragment.java
app/src/main/java/com/ic/launcher/fragment/LowPowerModeFragment.java [new file with mode: 0644]
app/src/main/java/com/ic/launcher/fragment/SelectClockDialFragment.java [new file with mode: 0644]
app/src/main/java/com/ic/launcher/fragment/clock/Clock12DialFragment.java [new file with mode: 0644]
app/src/main/java/com/ic/launcher/fragment/clock/Clock6DialFragment.java [new file with mode: 0644]
app/src/main/java/com/ic/launcher/fragment/l02/L02StatusBarFragment.java [deleted file]
app/src/main/java/com/ic/launcher/fragment/l02/L02WatchFragment.java [deleted file]
app/src/main/java/com/ic/launcher/listener/ILowPowerCallPhoneListener.java [new file with mode: 0644]
app/src/main/java/com/ic/launcher/listener/ILowPowerStateListener.java [new file with mode: 0644]
app/src/main/java/com/ic/launcher/listener/ISelectDialListener.java [new file with mode: 0644]
app/src/main/java/com/ic/launcher/mode/AnalogColorModel.java [new file with mode: 0644]
app/src/main/java/com/ic/launcher/mode/AppModel.java [moved from app/src/main/java/com/ic/launcher/mode/AppListModel.java with 51% similarity]
app/src/main/java/com/ic/launcher/mode/BaseModel.java [new file with mode: 0644]
app/src/main/java/com/ic/launcher/mode/L02MainModel.java
app/src/main/java/com/ic/launcher/mode/LowPowerModel.java [new file with mode: 0644]
app/src/main/java/com/ic/launcher/presenter/AppListPresenter.java
app/src/main/java/com/ic/launcher/presenter/BatteryPresenter.java
app/src/main/java/com/ic/launcher/presenter/HardwarePresenter.java
app/src/main/java/com/ic/launcher/presenter/PhoneStatePresenter.java
app/src/main/java/com/ic/launcher/presenter/PresenterCycle.java [new file with mode: 0644]
app/src/main/java/com/ic/launcher/presenter/QueryPhoneState.java
app/src/main/java/com/ic/launcher/presenter/QueryThread.java
app/src/main/java/com/ic/launcher/presenter/TimeDatePresenter.java
app/src/main/java/com/ic/launcher/util/SPUtils.java
app/src/main/java/com/ic/launcher/widget/ClockDrawableView.java [new file with mode: 0644]
app/src/main/java/com/ic/launcher/widget/ClockWatchView.java [deleted file]
app/src/main/java/com/ic/launcher/widget/WidgetTimeImageView.java
app/src/main/res/layout/activity_select_dial.xml [new file with mode: 0644]
app/src/main/res/layout/fragment_app_list.xml
app/src/main/res/layout/fragment_clock_12_dial.xml [new file with mode: 0644]
app/src/main/res/layout/fragment_clock_6_dial.xml [new file with mode: 0644]
app/src/main/res/layout/fragment_l02_main.xml
app/src/main/res/layout/fragment_l02_status_bar.xml [deleted file]
app/src/main/res/layout/fragment_l02_watch.xml [deleted file]
app/src/main/res/layout/fragment_low_power_mode.xml [new file with mode: 0644]
app/src/main/res/layout/fragment_select_clock_dial.xml [new file with mode: 0644]
app/src/main/res/layout/item_watch_preview.xml [new file with mode: 0644]
app/src/main/res/mipmap-ldpi/clock12_dial_preview.png [new file with mode: 0644]
app/src/main/res/mipmap-ldpi/clock6_dial_preview.png [new file with mode: 0644]
app/src/main/res/mipmap-ldpi/clockl02_dial_preview.png [new file with mode: 0644]
app/src/main/res/mipmap-mdpi/clock12_dial.png [new file with mode: 0644]
app/src/main/res/mipmap-mdpi/clock12_hand_cap.png [new file with mode: 0644]
app/src/main/res/mipmap-mdpi/clock12_hand_hour.png [new file with mode: 0644]
app/src/main/res/mipmap-mdpi/clock12_hand_minute.png [new file with mode: 0644]
app/src/main/res/mipmap-mdpi/clock12_hand_second.png [new file with mode: 0644]
app/src/main/res/mipmap-mdpi/clock6_dial.png [new file with mode: 0644]
app/src/main/res/mipmap-mdpi/clock6_hand_cap.png [new file with mode: 0644]
app/src/main/res/mipmap-mdpi/clock6_hand_hour.png [new file with mode: 0644]
app/src/main/res/mipmap-mdpi/clock6_hand_minute.png [new file with mode: 0644]
app/src/main/res/mipmap-mdpi/clock6_hand_second.png [new file with mode: 0644]
app/src/main/res/mipmap-mdpi/low_power_battery.png [new file with mode: 0644]
app/src/main/res/mipmap-mdpi/low_power_dial.png [new file with mode: 0644]
app/src/main/res/mipmap-mdpi/qs_background.png [new file with mode: 0644]
app/src/main/res/values/attr.xml
app/src/main/res/values/dimens.xml
app/src/main/res/values/strings.xml
app/src/main/res/values/styles.xml
app/version_code.properties

diff --git a/app/EQC_G5.jks b/app/EQC_G5.jks
new file mode 100644 (file)
index 0000000..2229d46
Binary files /dev/null and b/app/EQC_G5.jks differ
index 61fd4a8..85f4e93 100644 (file)
@@ -130,5 +130,9 @@ dependencies {
     //1.2.0-alpha05
     implementation "com.google.android.material:material:1.2.0-alpha05"
 
-    compile 'com.google.zxing:core:3.4.0'
+    implementation 'com.google.zxing:core:3.4.0'
+
+    implementation "androidx.viewpager2:viewpager2:1.0.0"
+
+    implementation 'com.jakewharton.threetenabp:threetenabp:1.2.2'
 }
index 0bb3561..3f4551a 100644 (file)
@@ -4,6 +4,7 @@
     package="com.ic.launcher"
     android:sharedUserId="android.uid.system">
 
+    <uses-permission android:name="android.permission.SHUTDOWN" />
     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
         android:theme="@style/AppTheme">
-        <activity android:name=".QrCodeActivity">
+        <activity android:name=".SelectDialActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.intent.action.VIEW" />
-                <category android:name="android.intent.category.LAUNCHER"/>
+
+                <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
 
+        <activity android:name=".QrCodeActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <action android:name="android.intent.action.VIEW" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
 
         <activity android:name=".MainActivity">
             <intent-filter>
diff --git a/app/src/main/java/com/ic/launcher/FragmentManage.java b/app/src/main/java/com/ic/launcher/FragmentManage.java
new file mode 100644 (file)
index 0000000..ed9a272
--- /dev/null
@@ -0,0 +1,203 @@
+package com.ic.launcher;
+
+import android.content.Context;
+import android.util.SparseArray;
+
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentTransaction;
+
+import com.ic.launcher.fragment.AppListFragment;
+import com.ic.launcher.fragment.L02MainFragment;
+import com.ic.launcher.fragment.LowPowerModeFragment;
+import com.ic.launcher.fragment.clock.Clock12DialFragment;
+import com.ic.launcher.fragment.clock.Clock6DialFragment;
+import com.ic.launcher.mode.L02MainModel;
+import com.ic.launcher.util.SPUtils;
+
+import static com.ic.launcher.configure.l02.L02Icon.CLOCK_INDEX_12;
+import static com.ic.launcher.configure.l02.L02Icon.CLOCK_INDEX_6;
+import static com.ic.launcher.configure.l02.L02Icon.CLOCK_INDEX_L02;
+
+public class FragmentManage {
+
+    private Context mContext;
+
+    private final static int MAIN_FRAGMENT_INDEX = 0;
+    private final static int APP_FRAGMENT_INDEX = 1;
+    private final static int LOW_FRAGMENT_INDEX = 2;
+
+    private SparseArray<Fragment> mAddFt;
+
+    private FragmentManager ftManager;
+
+    FragmentManage(Context context, FragmentManager ftManager) {
+        this.ftManager = ftManager;
+        mAddFt = new SparseArray<>();
+        this.mContext = context;
+    }
+
+    /**
+     * 去Sp中取值,没有 默认为 {@link  L02MainFragment}  数字表盘
+     * 可能的值为 {@link Clock6DialFragment} 或者 {@link Clock12DialFragment}  模拟表盘
+     */
+
+    void showCurrMainFragment(boolean finish) {
+        Fragment fragment = getFragmentList(MAIN_FRAGMENT_INDEX);
+        if (fragment == null) {
+            fragment = getCurrMainFragment();
+            addFragmentList(MAIN_FRAGMENT_INDEX, fragment);
+        }
+        addOrShowFragment(finish, fragment);
+    }
+
+    void showAppFragment(boolean finish, int flag) {
+        Fragment fragment = getFragmentList(APP_FRAGMENT_INDEX);
+        if (fragment == null) {
+            fragment = AppListFragment.newInstance(flag);
+            addFragmentList(APP_FRAGMENT_INDEX, fragment);
+        } else {
+            ((AppListFragment) fragment).setMoveEndItem(flag != 1);
+        }
+        addOrShowFragment(finish, fragment);
+    }
+
+    void changeMainClock(boolean finish) {
+        Fragment fragment = getCurrMainFragment();
+        Fragment oldFt = getFragmentList(MAIN_FRAGMENT_INDEX);
+        if ((fragment instanceof L02MainFragment && oldFt instanceof L02MainFragment)
+                || (fragment instanceof Clock6DialFragment && oldFt instanceof Clock6DialFragment)
+                || (fragment instanceof Clock12DialFragment && oldFt instanceof Clock12DialFragment)) {
+            return;
+        }
+
+        replaceMainFragment(finish, fragment);
+    }
+
+    boolean onBackFragment(boolean finish) {
+        if (mAddFt.get(0).isVisible()) {
+            return true;
+        }
+
+        if (mAddFt.get(1).isVisible()) {
+            showCurrMainFragment(finish);
+            return true;
+        }
+
+        return false;
+    }
+
+    void gotoLowPowerMode(boolean finish) {
+
+        Fragment fragment = getFragmentList(LOW_FRAGMENT_INDEX);
+
+        //如果不为空,表示已经处理低电量模式
+        if (fragment != null) {
+            return;
+        }
+
+        fragment = LowPowerModeFragment.newInstance();
+
+
+        replaceLowFragment(finish, fragment);
+    }
+
+    void quitLowPowerMode(boolean finish) {
+
+        Fragment fragment = getFragmentList(LOW_FRAGMENT_INDEX);
+        //如果为空,表示已经不在低电量模式
+        if (fragment == null) {
+            return;
+        }
+
+        Fragment mainFt = getCurrMainFragment();
+
+        replaceMainFragment(finish, mainFt);
+    }
+
+
+    private Fragment getCurrMainFragment() {
+        int main = SPUtils.getClockDialSP(mContext);
+        switch (main) {
+            case CLOCK_INDEX_6:
+                return Clock6DialFragment.newInstance();
+            case CLOCK_INDEX_12:
+                return Clock12DialFragment.newInstance();
+            default:
+                return L02MainFragment.newInstance();
+        }
+    }
+
+    private Fragment getFragmentList(int index) {
+        return mAddFt.get(index);
+    }
+
+    private void addFragmentList(int index, Fragment fragment) {
+        mAddFt.put(index, fragment);
+    }
+
+
+    private void replaceMainFragment(boolean finish, Fragment fragment) {
+        if (finish || fragment == null) {
+            return;
+        }
+
+        FragmentTransaction ft = ftManager.beginTransaction();
+        Fragment dd = mAddFt.get(MAIN_FRAGMENT_INDEX);
+        if(dd != null){
+            ft.remove(mAddFt.get(MAIN_FRAGMENT_INDEX));
+            mAddFt.remove(MAIN_FRAGMENT_INDEX);
+        }
+
+        addFragmentList(MAIN_FRAGMENT_INDEX, fragment);
+
+        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
+
+        ft.add(R.id.main_content_fl, fragment);
+        ft.commit();
+    }
+
+    private void replaceLowFragment(boolean finish, Fragment fragment) {
+        if (finish || fragment == null) {
+            return;
+        }
+
+        FragmentTransaction ft = ftManager.beginTransaction();
+
+        for (int i = 0; i < mAddFt.size(); i++) {
+            ft.remove(mAddFt.get(i));
+            mAddFt.remove(i);
+        }
+
+        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
+
+        addFragmentList(LOW_FRAGMENT_INDEX, fragment);
+
+        ft.add(R.id.main_content_fl, fragment);
+        ft.commit();
+    }
+
+    private void addOrShowFragment(boolean finish, Fragment fragment) {
+        if (finish || fragment == null) {
+            return;
+        }
+
+        FragmentTransaction ft = ftManager.beginTransaction();
+
+        for (int i = 0; i < mAddFt.size(); i++) {
+            if (mAddFt.get(i).isAdded()) {
+                ft.hide(mAddFt.get(i));
+            }
+        }
+
+        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
+
+        if (fragment.isAdded()) {
+            ft.show(fragment);
+        } else {
+            ft.add(R.id.main_content_fl, fragment);
+        }
+
+        ft.commit();
+    }
+}
index 6a3005c..169218f 100644 (file)
@@ -4,16 +4,17 @@ import android.app.Application;
 
 import com.ic.launcher.util.CrashHandler;
 import com.ic.launcher.util.IcLog;
+import com.jakewharton.threetenabp.AndroidThreeTen;
 
 public class IcLauncherApplication extends Application {
 
     @Override
     public void onCreate() {
         super.onCreate();
-
-        IcLog.setLogHead("IcLauncher");
-
         CrashHandler crashHandler = CrashHandler.getInstance();
         crashHandler.init(getApplicationContext());
+
+        IcLog.setLogHead("IcLauncher");
+        AndroidThreeTen.init(this);
     }
 }
index 6d52e7f..7a8ab87 100644 (file)
 package com.ic.launcher;
 
 import androidx.appcompat.app.AppCompatActivity;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentTransaction;
 
+import android.content.BroadcastReceiver;
+import android.content.Context;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.os.Bundle;
-import android.util.SparseArray;
 import android.view.KeyEvent;
 
-import com.ic.launcher.fragment.AppListFragment;
-import com.ic.launcher.fragment.L02MainFragment;
 import com.ic.launcher.listener.IChangeMainFragmentListener;
+import com.ic.launcher.listener.ILowPowerStateListener;
 import com.ic.launcher.listener.MainClockGestureDetectorImpl;
+import com.ic.launcher.util.IcLog;
 import com.ic.launcher.util.ServiceUtil;
 import com.ic.launcher.util.SystemUtils;
 
 
+
 public class MainActivity extends AppCompatActivity implements
         MainClockGestureDetectorImpl.OnClockGestureFlingListener,
-        IChangeMainFragmentListener {
-
-    private static final String SERVICE_PKG_NAME = "com.enqualcomm.support";
-
-    private FragmentManager fragmentManager;
+        IChangeMainFragmentListener,
+        ILowPowerStateListener {
 
-    private SparseArray<Fragment> mAddFt;
+    private static final String TAG = "MainActivity";
 
-    private L02MainFragment l02MainFt;
-    private AppListFragment appListFt;
+    private static final String SERVICE_PKG_NAME = "com.enqualcomm.support";
+    private boolean isLowPower = false;
 
+    private FragmentManage ftManage;
+    private boolean isChangeClock=false;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
-        mAddFt = new SparseArray<>();
-        fragmentManager = getSupportFragmentManager();
-
-        l02MainFt = L02MainFragment.newInstance();
+        ftManage = new FragmentManage(this,getSupportFragmentManager());
+        ftManage.showCurrMainFragment(isFinishing());
 
-        commitFragment(l02MainFt);
+        registerChangeClockReceiver();
 
         ServiceUtil.startServiceUtil(getApplicationContext(),
-                "com.ic.action.WORK_SERVICE", getPackageName());
+               "com.ic.action.WORK_SERVICE", getPackageName());
     }
 
     @Override
-    public void onDouble() {
-        try {
-            String cid = SystemUtils.GetCidFromSystem();
-            if (cid.startsWith("TESTPROTOCOL")) {
-                try {
-                    // 协议测试
-                    Intent intent = getPackageManager().getLaunchIntentForPackage(SERVICE_PKG_NAME);
-                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
-                    startActivity(intent);
-                } catch (Exception ignored) {
-                }
-            }
-        } catch (Exception ignored) {
+    protected void onResume() {
+        super.onResume();
+        if(isChangeClock){
+            ftManage.changeMainClock(isFinishing());
+            isChangeClock=false;
         }
     }
 
     @Override
-    public void onDirection(int flag) {
-        switch (flag) {
-            case 1:
-                //左滑
-                if (appListFt == null) {
-                    appListFt = AppListFragment.newInstance(1);
-                } else {
-                    appListFt.setMoveEndItem(false);
-                }
-                commitFragment(appListFt);
-                break;
-            case 2:
-                //右滑
-                if (appListFt == null) {
-                    appListFt = AppListFragment.newInstance(2);
-                } else {
-                    appListFt.setMoveEndItem(true);
-                }
-                commitFragment(appListFt);
-                break;
-        }
+    protected void onDestroy() {
+        super.onDestroy();
+        unRegisterTimeDateReceiver();
     }
 
     @Override
-    public void onChangeMain() {
-        //app列表已滑动到第一个或者第二个,需要切换到主main
-        commitFragment(l02MainFt);
+    public void onDouble() {
+        if (isLowPower) return;
+        startTestProtocol();
     }
 
-    private void commitFragment(Fragment fragment) {
-        if (isFinishing()) {
-            return;
-        }
-
-        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
-
-        for (int i = 0; i < mAddFt.size(); i++) {
-            fragmentTransaction.hide(mAddFt.get(i));
-        }
+    @Override
+    public void onDirection(int flag) {
+        if (isLowPower) return;
+        ftManage.showAppFragment(isFinishing(), flag);
+    }
 
-        fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
-        //fragmentTransaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);
+    @Override
+    public void onChangeMain() {
+        ftManage.showCurrMainFragment(isFinishing());
+    }
 
-        if (fragment.isAdded()) {
-            fragmentTransaction.show(fragment);
+    @Override
+    public void onLowChange(boolean state) {
+        if (state) {
+            ftManage.gotoLowPowerMode(isFinishing());
         } else {
-            putFragmentToArray(fragment);
-            fragmentTransaction.add(R.id.main_content_fl, fragment);
+            ftManage.quitLowPowerMode(isFinishing());
         }
-
-        //fragmentTransaction.commitAllowingStateLoss();
-
-        fragmentTransaction.commit();
     }
 
     @Override
     public boolean onKeyDown(int keyCode, KeyEvent event) {
         if (keyCode == KeyEvent.KEYCODE_BACK) {
             // 禁用 KEYCODE_BACK 退出功能
-            if (mAddFt.get(0).isVisible()) {
+            if (ftManage.onBackFragment(isFinishing())) {
                 return true;
             }
+        }
+        return super.onKeyDown(keyCode, event);
+    }
 
-            if(mAddFt.get(1).isVisible()){
-                commitFragment(l02MainFt);
-                return true;
+
+    private void startTestProtocol() {
+        try {
+            String cid = SystemUtils.GetCidFromSystem();
+            if (cid.startsWith("TESTPROTOCOL")) {
+                try {
+                    // 协议测试
+                    Intent intent = getPackageManager().getLaunchIntentForPackage(SERVICE_PKG_NAME);
+                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+                    startActivity(intent);
+                } catch (Exception ignored) {
+                }
             }
+        } catch (Exception ignored) {
         }
-        return super.onKeyDown(keyCode, event);
     }
 
-    private void putFragmentToArray(Fragment fragment) {
-        int flag = 0;
-        if (fragment instanceof AppListFragment) {
-            flag = 1;
+    private void registerChangeClockReceiver() {
+        IntentFilter filter = new IntentFilter();
+        filter.addAction("com.ic.action.CHANGE_CLOCK");
+        registerReceiver(mIntentReceiver, filter);
+    }
+
+    private void unRegisterTimeDateReceiver() {
+        try {
+            unregisterReceiver(mIntentReceiver);
+        } catch (IllegalArgumentException e) {
+            IcLog.e(TAG, "unRegisterTimeDateReceiver", e);
         }
-        mAddFt.put(flag, fragment);
     }
+
+    private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String action = intent.getAction();
+            if ("com.ic.action.CHANGE_CLOCK".equals(action)) {
+                isChangeClock =true;
+            }
+        }
+    };
+
 }
diff --git a/app/src/main/java/com/ic/launcher/SelectDialActivity.java b/app/src/main/java/com/ic/launcher/SelectDialActivity.java
new file mode 100644 (file)
index 0000000..bb99324
--- /dev/null
@@ -0,0 +1,33 @@
+package com.ic.launcher;
+
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentTransaction;
+
+import android.os.Bundle;
+
+import com.ic.launcher.fragment.SelectClockDialFragment;
+
+public class SelectDialActivity extends AppCompatActivity {
+
+    private FragmentManager ftManager;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_select_dial);
+        ftManager = getSupportFragmentManager();
+        addOrShowFragment(isFinishing(),SelectClockDialFragment.newInstance());
+    }
+
+    private void addOrShowFragment(boolean finish, Fragment fragment) {
+        if (finish || fragment == null) {
+            return;
+        }
+
+        FragmentTransaction ft = ftManager.beginTransaction();
+        ft.add(R.id.select_dial_content_fl, fragment);
+        ft.commit();
+    }
+}
diff --git a/app/src/main/java/com/ic/launcher/adapter/WatchPreviewAdapter.java b/app/src/main/java/com/ic/launcher/adapter/WatchPreviewAdapter.java
new file mode 100644 (file)
index 0000000..d119bae
--- /dev/null
@@ -0,0 +1,62 @@
+package com.ic.launcher.adapter;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.core.content.ContextCompat;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.ic.launcher.databinding.ItemWatchPreviewBinding;
+import com.ic.launcher.entity.ClockDialEntity;
+import com.ic.launcher.listener.ISelectDialListener;
+
+import static com.ic.launcher.configure.l02.L02Icon.l02ClockDial;
+
+public class WatchPreviewAdapter extends RecyclerView.Adapter<WatchPreviewAdapter.PreviewViewHolder> {
+
+    private Context context;
+    private ISelectDialListener listener;
+
+    public WatchPreviewAdapter(Context context,ISelectDialListener listener){
+        this.context=context;
+        this.listener =listener;
+    }
+
+    @NonNull
+    @Override
+    public PreviewViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+        return new PreviewViewHolder(ItemWatchPreviewBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
+    }
+
+    @Override
+    public void onBindViewHolder(@NonNull PreviewViewHolder holder, int position) {
+        holder.bindItem(context,l02ClockDial[position],listener);
+    }
+
+    @Override
+    public int getItemCount() {
+        return l02ClockDial.length;
+    }
+
+    class PreviewViewHolder extends RecyclerView.ViewHolder {
+
+        private ItemWatchPreviewBinding binding = null;
+
+        public PreviewViewHolder(@NonNull ItemWatchPreviewBinding itemView) {
+            super(itemView.getRoot());
+            binding = itemView;
+        }
+
+        public void bindItem(Context context,ClockDialEntity entity,ISelectDialListener listener) {
+            if (binding != null) {
+                binding.setEntity(entity);
+                binding.setOnClick(listener);
+                binding.setPreviewDrawable(ContextCompat.getDrawable(context,entity.getDialPreview()));
+                binding.executePendingBindings();
+            }
+        }
+    }
+
+}
index c1133fa..5c61d11 100644 (file)
@@ -4,6 +4,7 @@ import android.graphics.Color;
 
 import com.ic.launcher.R;
 import com.ic.launcher.entity.AppInfoEntity;
+import com.ic.launcher.fragment.LowPowerModeFragment;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -12,6 +13,10 @@ public class L02AppInfo {
 
     private static final int BACK_COLOUR = Color.parseColor("#000000");
 
+    /**
+     * 拨号的顺序不能变 在低电量模式下会查找这个列表,然后查找索引为1的拨号,
+     * 如果要修改 请到 {@link  LowPowerModeFragment} 中一并修改
+     **/
     public static final List<AppInfoEntity> mL02DefaultAppList = new ArrayList<AppInfoEntity>() {
         {
             //联系人
index ba58d9e..404945b 100644 (file)
@@ -1,6 +1,7 @@
 package com.ic.launcher.configure.l02;
 
 import com.ic.launcher.R;
+import com.ic.launcher.entity.ClockDialEntity;
 
 public class L02Icon {
 
@@ -63,4 +64,14 @@ public class L02Icon {
             R.mipmap.clockl02_minutes_8,
             R.mipmap.clockl02_minutes_9
     };
+
+    public static final int CLOCK_INDEX_6 = 1701;
+    public static final int CLOCK_INDEX_L02 = 1702;
+    public static final int CLOCK_INDEX_12 = 1703;
+
+    public static ClockDialEntity[] l02ClockDial = new ClockDialEntity[]{
+            new ClockDialEntity("clock16",CLOCK_INDEX_6,R.mipmap.clock6_dial_preview),
+            new ClockDialEntity("clockl02",CLOCK_INDEX_L02,R.mipmap.clockl02_dial_preview),
+            new ClockDialEntity("clock12",CLOCK_INDEX_12,R.mipmap.clock12_dial_preview),
+    };
 }
diff --git a/app/src/main/java/com/ic/launcher/entity/ClockDialEntity.java b/app/src/main/java/com/ic/launcher/entity/ClockDialEntity.java
new file mode 100644 (file)
index 0000000..1b8eb2c
--- /dev/null
@@ -0,0 +1,39 @@
+package com.ic.launcher.entity;
+
+import android.graphics.drawable.Drawable;
+
+public class ClockDialEntity {
+    private String dialKey;
+    private int dialValue;
+    private int dialPreview;
+
+    public ClockDialEntity(String dialKey, int dialValue, int dialPreview) {
+        this.dialKey = dialKey;
+        this.dialValue = dialValue;
+        this.dialPreview = dialPreview;
+    }
+
+    public String getDialKey() {
+        return dialKey;
+    }
+
+    public void setDialKey(String dialKey) {
+        this.dialKey = dialKey;
+    }
+
+    public int getDialValue() {
+        return dialValue;
+    }
+
+    public void setDialValue(int dialValue) {
+        this.dialValue = dialValue;
+    }
+
+    public int getDialPreview() {
+        return dialPreview;
+    }
+
+    public void setDialPreview(int dialPreview) {
+        this.dialPreview = dialPreview;
+    }
+}
index 904b576..f5fa09c 100644 (file)
@@ -2,10 +2,12 @@ package com.ic.launcher.fragment;
 
 
 import android.content.Context;
+import android.graphics.Rect;
 import android.os.Bundle;
 
 import androidx.annotation.NonNull;
 import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
 import androidx.lifecycle.ViewModelProvider;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.PagerSnapHelper;
@@ -14,6 +16,7 @@ import androidx.recyclerview.widget.RecyclerView;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.Toast;
 
 import com.ic.launcher.IcLauncherApplication;
 import com.ic.launcher.R;
@@ -21,7 +24,7 @@ import com.ic.launcher.adapter.AppInfoAdapter;
 import com.ic.launcher.adapter.IndicatorAdapter;
 import com.ic.launcher.listener.IChangeMainFragmentListener;
 import com.ic.launcher.listener.ICheckAppItemListener;
-import com.ic.launcher.mode.AppListModel;
+import com.ic.launcher.mode.AppModel;
 import com.ic.launcher.util.IcLog;
 
 
@@ -29,14 +32,14 @@ public class AppListFragment extends Fragment {
     private static final String TAG = "AppListFragment";
 
     private Context mContext;
+
     private RecyclerView mAppRv;
 
-    private IcLauncherApplication mApp;
+    private AppModel appModel;
 
     private IChangeMainFragmentListener changeMainFragmentListener;
     private AppInfoAdapter appAdapter;
 
-    private AppListModel appListModel;
 
     private RecyclerView indicatorRv;
     private IndicatorAdapter indicatorAdapter;
@@ -47,13 +50,9 @@ public class AppListFragment extends Fragment {
     @Override
     public void onAttach(@NonNull Context context) {
         super.onAttach(context);
-        this.mContext = context;
-
+        mContext = context;
         if (context instanceof IChangeMainFragmentListener) {
             changeMainFragmentListener = (IChangeMainFragmentListener) context;
-        } else {
-            throw new RuntimeException(context.toString()
-                    + " must implement MainClockGestureDetectorImpl.OnClockGestureFlingListener");
         }
     }
 
@@ -68,11 +67,13 @@ public class AppListFragment extends Fragment {
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        mApp = (IcLauncherApplication) mContext.getApplicationContext();
         Bundle bundle = getArguments();
         if (bundle != null) {
             mCurrType = bundle.getInt("type");
         }
+
+        appModel = initFragmentModel(getActivity());
+        onObserveModelValue(appModel);
     }
 
     @Override
@@ -81,17 +82,14 @@ public class AppListFragment extends Fragment {
         View view = inflater.inflate(R.layout.fragment_app_list, container, false);
         mAppRv = view.findViewById(R.id.app_list);
         indicatorRv = view.findViewById(R.id.app_indicator_rv);
-
         initRecyclerView();
-        initAppListModel();
-
+        appModel.updateAppInfoList();
         return view;
     }
 
     @Override
     public void onResume() {
         super.onResume();
-        IcLog.i(TAG, "onResume");
         if (mCurrType == 2) {
             //只有初始化进来的时候才执行,
             mAppRv.scrollToPosition(appAdapter.getAppEndIndex());
@@ -100,12 +98,6 @@ public class AppListFragment extends Fragment {
         }
     }
 
-    @Override
-    public void onPause() {
-        super.onPause();
-        IcLog.i(TAG, "onPause");
-    }
-
     public void setMoveEndItem(boolean move) {
         if (move) {
             mAppRv.scrollToPosition(appAdapter.getAppEndIndex());
@@ -116,6 +108,18 @@ public class AppListFragment extends Fragment {
         }
     }
 
+    private AppModel initFragmentModel(FragmentActivity activity) {
+        AppModel.Factory factory = new AppModel.Factory((IcLauncherApplication) mContext.getApplicationContext());
+        return new ViewModelProvider(activity, factory).get(AppModel.class);
+    }
+
+    private void onObserveModelValue(AppModel baseModel) {
+        baseModel.getObservableAppList().observe(this, appList -> appAdapter.updateAppInfoList(appList));
+        baseModel.getObservableAppState().observe(this, this::initIndicator);
+        baseModel.getObservableErrorInfo().observe(this, info -> Toast.makeText(mContext, info, Toast.LENGTH_SHORT).show());
+    }
+
+
     private void initRecyclerView() {
         appAdapter = new AppInfoAdapter(mContext, itemListener);
         LinearLayoutManager mLayoutManager = new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false);
@@ -123,28 +127,17 @@ public class AppListFragment extends Fragment {
         mAppRv.setLayoutManager(mLayoutManager);
         mAppRv.setAdapter(appAdapter);
 
+
         new PagerSnapHelper().attachToRecyclerView(mAppRv);
 
         mAppRv.addOnScrollListener(scrollListener);
     }
 
-    private void initAppListModel() {
-        AppListModel.Factory factory = new AppListModel.Factory(mApp);
-        appListModel = new ViewModelProvider(this, factory).get(AppListModel.class);
-
-        appListModel.getObsAppInfoList().observe(getViewLifecycleOwner(), appList -> {
-            appAdapter.updateAppInfoList(appList);
-        });
-
-        appListModel.getObsAppState().observe(getViewLifecycleOwner(), this::initIndicator);
-
-        appListModel.updateAppInfoList();
-    }
-
     private void initIndicator(boolean[] state) {
         indicatorAdapter = new IndicatorAdapter(state);
         LinearLayoutManager mLayoutManager = new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false);
         indicatorRv.setLayoutManager(mLayoutManager);
+        indicatorRv.addItemDecoration(new SpacesItemDecoration(4));
         indicatorRv.setAdapter(indicatorAdapter);
     }
 
@@ -202,12 +195,20 @@ public class AppListFragment extends Fragment {
         }
     };
 
-    private ICheckAppItemListener itemListener = new ICheckAppItemListener() {
-        @Override
-        public void onAppItem(int pos) {
-            appListModel.onStartAppActivity(pos);
+    public class SpacesItemDecoration extends RecyclerView.ItemDecoration {
+        private int space;
+
+        public SpacesItemDecoration(int space) {
+            this.space = space;
         }
-    };
 
+        @Override
+        public void getItemOffsets(Rect outRect, @NonNull View view,
+                                   RecyclerView parent, RecyclerView.State state) {
+            outRect.right = space;
+            outRect.left = space;
+        }
+    }
 
+    private ICheckAppItemListener itemListener = pos -> appModel.onStartAppActivity(pos);
 }
diff --git a/app/src/main/java/com/ic/launcher/fragment/BaseFragment.java b/app/src/main/java/com/ic/launcher/fragment/BaseFragment.java
new file mode 100644 (file)
index 0000000..6c540e5
--- /dev/null
@@ -0,0 +1,91 @@
+package com.ic.launcher.fragment;
+
+import android.annotation.SuppressLint;
+import android.app.Application;
+import android.content.Context;
+import android.os.Bundle;
+import android.view.View;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.view.GestureDetectorCompat;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+
+import com.ic.launcher.IcLauncherApplication;
+import com.ic.launcher.listener.MainClockGestureDetectorImpl;
+import com.ic.launcher.mode.BaseModel;
+import com.ic.launcher.util.IcLog;
+
+public abstract class BaseFragment extends Fragment {
+
+    private static final String TAG = "BaseFragment";
+
+    protected Context mContext;
+
+    protected BaseModel mBaseModel;
+
+    private GestureDetectorCompat gesture;
+    private MainClockGestureDetectorImpl.OnClockGestureFlingListener flingListener;
+
+    @Override
+    public void onAttach(@NonNull Context context) {
+        super.onAttach(context);
+        this.mContext = context;
+
+        if (context instanceof MainClockGestureDetectorImpl.OnClockGestureFlingListener) {
+            flingListener = (MainClockGestureDetectorImpl.OnClockGestureFlingListener) context;
+        }
+    }
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        IcLog.i(TAG,"onCreate");
+        mBaseModel = initFragmentModel(getActivity(), (IcLauncherApplication) mContext.getApplicationContext());
+        onObserveModelValue(mBaseModel);
+        mBaseModel.OnUiCreate();
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        IcLog.i(TAG,"onResume");
+        if(mBaseModel != null){
+            mBaseModel.OnUiResume();
+        }
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        IcLog.i(TAG,"onPause");
+        if(mBaseModel != null){
+            mBaseModel.OnUiPause();
+        }
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        IcLog.i(TAG,"onDestroy");
+        if(mBaseModel != null){
+            mBaseModel.OnUiDestroy();
+        }
+    }
+
+    protected abstract BaseModel initFragmentModel(FragmentActivity activity, Application application);
+    protected abstract void onObserveModelValue(BaseModel baseModel);
+
+
+    @SuppressLint("ClickableViewAccessibility")
+    protected void initOnTouchListener(View view) {
+        gesture = new GestureDetectorCompat(mContext, new MainClockGestureDetectorImpl(flingListener));
+        view.setOnTouchListener((v, event) -> {
+            if (gesture.onTouchEvent(event)) {
+                return true;
+            }
+            return true;
+        });
+    }
+}
index 503d562..acd042a 100644 (file)
@@ -1,43 +1,32 @@
 package com.ic.launcher.fragment;
 
-import android.annotation.SuppressLint;
+import android.app.Application;
 import android.content.Context;
 import android.os.Bundle;
 
 import androidx.annotation.NonNull;
-import androidx.core.view.GestureDetectorCompat;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentTransaction;
+import androidx.fragment.app.FragmentActivity;
 import androidx.lifecycle.ViewModelProvider;
 
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 
-import com.ic.launcher.IcLauncherApplication;
-import com.ic.launcher.R;
-import com.ic.launcher.fragment.l02.L02WatchFragment;
-import com.ic.launcher.fragment.l02.L02StatusBarFragment;
-import com.ic.launcher.listener.MainClockGestureDetectorImpl;
+import com.ic.launcher.databinding.FragmentL02MainBinding;
+import com.ic.launcher.listener.ILowPowerStateListener;
+import com.ic.launcher.mode.BaseModel;
 import com.ic.launcher.mode.L02MainModel;
 import com.ic.launcher.util.IcLog;
+import com.ic.launcher.util.SPUtils;
 
 
-public class L02MainFragment extends Fragment {
+public class L02MainFragment extends BaseFragment {
 
     private static final String TAG = "L02MainFragment";
 
-    private Context mContext;
-    private IcLauncherApplication mApp;
+    private FragmentL02MainBinding mainBinding;
 
-    private L02MainModel watchMainModel;
-
-    private L02StatusBarFragment statusBarFt;
-    private L02WatchFragment watchFt;
-
-    private GestureDetectorCompat gesture;
-
-    private MainClockGestureDetectorImpl.OnClockGestureFlingListener flingListener;
+    private ILowPowerStateListener lowPower;
 
     public static L02MainFragment newInstance() {
         return new L02MainFragment();
@@ -46,126 +35,126 @@ public class L02MainFragment extends Fragment {
     @Override
     public void onAttach(@NonNull Context context) {
         super.onAttach(context);
-        this.mContext = context;
 
-        if (context instanceof MainClockGestureDetectorImpl.OnClockGestureFlingListener) {
-            flingListener = (MainClockGestureDetectorImpl.OnClockGestureFlingListener) context;
-        } else {
-            throw new RuntimeException(context.toString()
-                    + " must implement MainClockGestureDetectorImpl.OnClockGestureFlingListener");
+        if (context instanceof ILowPowerStateListener) {
+            lowPower = (ILowPowerStateListener) context;
         }
     }
 
     @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        mApp = (IcLauncherApplication) mContext.getApplicationContext();
+    protected BaseModel initFragmentModel(FragmentActivity activity, Application application) {
+        L02MainModel.Factory factory = new L02MainModel.Factory(application);
+        return new ViewModelProvider(activity, factory).get(L02MainModel.class);
+    }
 
+    @Override
+    protected void onObserveModelValue(BaseModel baseModel) {
+        L02MainModel mainModel = (L02MainModel)baseModel;
+        observePhoneValue( mainModel);
+        observeBatteryValue(mainModel);
+        observeDataTimeValue(mainModel);
+        observeHardwareValue(mainModel);
+
+        //进入电量模式
+        baseModel.getObservableLowPower().observe(this,status ->{
+            IcLog.i(TAG,"getObservableLowPower status"+status);
+            if(status){
+                lowPower.onLowChange(true);
+            }
+        });
     }
 
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
                              Bundle savedInstanceState) {
-        View view = inflater.inflate(R.layout.fragment_l02_main, container, false);
-        statusBarFt = (L02StatusBarFragment) getChildFragmentManager().findFragmentById(R.id.l02_status_fl);
-        watchFt = (L02WatchFragment) getChildFragmentManager().findFragmentById(R.id.l02_watch_fl);
+        mainBinding = FragmentL02MainBinding.inflate(inflater, container, false);
+        mainBinding.setHeartValue(String.valueOf(SPUtils.getBloodHeartSP(mContext)));
+        mainBinding.setStepValue("0");
         //监听事件
-        initL02MainModel();
-        initOnTouchListener(view);
-        IcLog.i(TAG, "onCreateView");
-        return view;
-    }
-
-    @Override
-    public void onHiddenChanged(boolean hidden) {
-        super.onHiddenChanged(hidden);
-        if(hidden){
-            IcLog.i(TAG, "Fragment hidden");
-        }else{
-            IcLog.i(TAG, "Fragment show");
-        }
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-        if(watchMainModel != null){
-            watchMainModel.onFragmentResume();
-        }
-        IcLog.i(TAG, "onResume");
+        initOnTouchListener(mainBinding.getRoot());
+        return mainBinding.getRoot();
     }
 
-    @Override
-    public void onPause() {
-        super.onPause();
-        if(watchMainModel != null){
-            watchMainModel.onFragmentPause();
-        }
-
-        IcLog.i(TAG, "onPause");
-    }
+    private void observePhoneValue(L02MainModel model) {
+        model.getObservablePhoneType().observe(this, resID ->{
+            if(mainBinding != null){
+                mainBinding.setPhoneNetType(resID);
+            }
 
-    @Override
-    public void onDestroyView() {
-        super.onDestroyView();
-        IcLog.i(TAG, "onDestroyView");
-        if(watchMainModel != null){
-            watchMainModel.onFragmentDestroy();
-        }
-    }
+        });
 
-    private void initL02MainModel() {
-        L02MainModel.Factory factory = new L02MainModel.Factory(mApp);
+        model.getObservableSignal().observe(this, resID ->{
+            if(mainBinding != null){
+                mainBinding.setPhoneSignal(resID);
+            }
+        });
 
-        watchMainModel = new ViewModelProvider(this, factory).get(L02MainModel.class);
-        observeStateBarValue(watchMainModel);
-        observeWatchValue(watchMainModel);
+        model.getObservableTransport().observe(this, resID -> {
+            if(mainBinding != null){
+                mainBinding.setPhoneTransport(resID);
+            }
+        });
     }
 
-    private void observeStateBarValue(L02MainModel model) {
-        model.getObsPhoneSignalID().observe(getViewLifecycleOwner(), resID -> statusBarFt.updatePhoneSignal(resID));
-
-        model.getObsPhoneTransportID().observe(getViewLifecycleOwner(), resID -> statusBarFt.updateTransportValue(resID));
-
-        model.getObsPhoneTypeID().observe(getViewLifecycleOwner(), resID -> statusBarFt.updateNetTypeValue(resID));
+    private void observeBatteryValue(L02MainModel model) {
+        model.getObservableBatteryValue().observe(this, value ->{
+            if(mainBinding != null){
+                mainBinding.setBatteryValue(value);
+            }
 
-        model.getObsBatteryCharging().observe(getViewLifecycleOwner(), charging -> statusBarFt.updateBatteryChargeValue(charging));
+        });
 
-        model.getObsBatteryResID().observe(getViewLifecycleOwner(), resID -> statusBarFt.updateBatteryDrawable(resID));
+        model.getObservableBattery().observe(this, resID ->{
+            if(mainBinding != null){
+                mainBinding.setBatteryDrawable(resID);
+            }
+        });
 
-        model.getObsBatteryValue().observe(getViewLifecycleOwner(), value -> statusBarFt.updateBatteryValue(value));
+        model.getObservableBatteryCharging().observe(this, state -> {
+            if(mainBinding != null){
+                mainBinding.setBatteryCharge(state);
+            }
+        });
     }
 
-    private void observeWatchValue(L02MainModel model) {
-        model.getObsTime().observe(getViewLifecycleOwner(), timeList -> watchFt.updateTimeValue(timeList));
-
-        model.getObsWeek().observe(getViewLifecycleOwner(), week -> watchFt.updateWeekValue(week));
-
-        model.getObsYear().observe(getViewLifecycleOwner(), year -> watchFt.updateDateValue(year));
+    private void observeDataTimeValue(L02MainModel model) {
+        model.getObservableWeek().observe(this, week ->{
+            if(mainBinding != null){
+                mainBinding.setWatchWeek(week);
+            }
+        });
 
-        model.getObsHardwareHeart().observe(getViewLifecycleOwner(), heart -> watchFt.updateHeartValue(heart));
+        model.getObservableYear().observe(this, year -> {
+            if(mainBinding != null){
+                mainBinding.setWatchDate(year);
+            }
+        });
 
-        model.getObsHardwarePed().observe(getViewLifecycleOwner(), ped -> watchFt.updatePedValue(ped));
+        model.getObservableTime().observe(this, time -> {
+            if(mainBinding != null){
+                updateTimeValue(time);
+            }
+        });
     }
 
+    private void observeHardwareValue(L02MainModel model) {
+        model.getObservableHardwareHeart().observe(this, heart ->{
+            if(mainBinding != null){
+                mainBinding.setHeartValue(heart);
+            }
+        });
 
-    private void controlStatusBar(boolean isShow) {
-        FragmentTransaction ft = getChildFragmentManager().beginTransaction();
-        if (isShow && !statusBarFt.isVisible()) {
-            ft.show(statusBarFt).commit();
-        } else {
-            ft.hide(statusBarFt).commit();
-        }
-    }
-
-    @SuppressLint("ClickableViewAccessibility")
-    private void initOnTouchListener(View view) {
-        gesture = new GestureDetectorCompat(mContext, new MainClockGestureDetectorImpl(flingListener));
-        view.setOnTouchListener((v, event) -> {
-            if (gesture.onTouchEvent(event)) {
-                return true;
+        model.getObservableHardwarePed().observe(this, ped -> {
+            if(mainBinding != null){
+                mainBinding.setStepValue(ped);
             }
-            return true;
         });
     }
+
+    private void updateTimeValue(int[] value){
+        mainBinding.setHourTen(value[0]);
+        mainBinding.setHourBit(value[1]);
+        mainBinding.setMinuteTen(value[2]);
+        mainBinding.setMinuteBit(value[3]);
+    }
 }
diff --git a/app/src/main/java/com/ic/launcher/fragment/LowPowerModeFragment.java b/app/src/main/java/com/ic/launcher/fragment/LowPowerModeFragment.java
new file mode 100644 (file)
index 0000000..68eac0c
--- /dev/null
@@ -0,0 +1,121 @@
+package com.ic.launcher.fragment;
+
+
+import android.app.Application;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+import androidx.lifecycle.ViewModelProvider;
+
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.ic.launcher.IcLauncherApplication;
+import com.ic.launcher.configure.l02.L02AppInfo;
+import com.ic.launcher.databinding.FragmentLowPowerModeBinding;
+import com.ic.launcher.entity.AppInfoEntity;
+import com.ic.launcher.listener.ILowPowerCallPhoneListener;
+import com.ic.launcher.listener.ILowPowerStateListener;
+import com.ic.launcher.mode.LowPowerModel;
+import com.ic.launcher.util.IcLog;
+
+/**
+ * A simple {@link Fragment} subclass.
+ */
+public class LowPowerModeFragment extends Fragment {
+
+    private static final String TAG = "LowPowerModeFragment";
+
+    private Context mContext;
+
+    private LowPowerModel lowPowerModel;
+
+    private FragmentLowPowerModeBinding mPowerModeBinding;
+    private String batteryValue;
+
+    private ILowPowerStateListener lowPower;
+
+    public static LowPowerModeFragment newInstance() {
+        return new LowPowerModeFragment();
+    }
+
+    @Override
+    public void onAttach(@NonNull Context context) {
+        super.onAttach(context);
+
+        mContext = context;
+        if (context instanceof ILowPowerStateListener) {
+            lowPower = (ILowPowerStateListener) context;
+        }
+    }
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        IcLauncherApplication mApp = (IcLauncherApplication) mContext.getApplicationContext();
+        lowPowerModel = initFragmentModel(getActivity(),mApp);
+        onObserveModelValue(lowPowerModel);
+        lowPowerModel.OnUiCreate();
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        lowPowerModel.OnUiDestroy();
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                             Bundle savedInstanceState) {
+        // Inflate the layout for this fragment
+        mPowerModeBinding = FragmentLowPowerModeBinding.inflate(inflater, container, false);
+        mPowerModeBinding.setCallPhone(callListener);
+        mPowerModeBinding.setLowPowerValue(batteryValue);
+        return mPowerModeBinding.getRoot();
+    }
+
+    private LowPowerModel initFragmentModel(FragmentActivity activity, Application application){
+        LowPowerModel.Factory factory = new LowPowerModel.Factory(application);
+        return new ViewModelProvider(activity, factory).get(LowPowerModel.class);
+    }
+
+    private void onObserveModelValue(LowPowerModel baseModel) {
+        baseModel.getObservableLowPowerValue().observe(this, this::updateLowPowerValue);
+
+        //退出低电量模式
+        baseModel.getObservableLowPower().observe(this,status ->{
+            IcLog.i(TAG,"getObservableLowPower status"+status);
+            if(!status){
+                lowPower.onLowChange(false);
+            }
+        });
+    }
+
+    private void updateLowPowerValue(String value){
+        if(mPowerModeBinding != null){
+            mPowerModeBinding.setLowPowerValue(value);
+        }
+        batteryValue= value;
+    }
+
+    private ILowPowerCallPhoneListener callListener = () -> {
+        AppInfoEntity entity = L02AppInfo.mL02DefaultAppList.get(1);
+        if(entity != null){
+            try {
+                Intent intent = new Intent(Intent.ACTION_MAIN);
+                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+                intent.setComponent(new ComponentName(entity.getPackageName(), entity.getActivityName()));
+                mContext.startActivity(intent);
+            }catch (Exception e){
+                IcLog.e(TAG,"ILowPowerCallPhoneListener",e);
+            }
+        }
+    };
+}
diff --git a/app/src/main/java/com/ic/launcher/fragment/SelectClockDialFragment.java b/app/src/main/java/com/ic/launcher/fragment/SelectClockDialFragment.java
new file mode 100644 (file)
index 0000000..ac94030
--- /dev/null
@@ -0,0 +1,99 @@
+package com.ic.launcher.fragment;
+
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Rect;
+import android.net.Uri;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.viewpager2.widget.ViewPager2;
+
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.ic.launcher.R;
+import com.ic.launcher.adapter.WatchPreviewAdapter;
+import com.ic.launcher.listener.ISelectDialListener;
+import com.ic.launcher.util.SPUtils;
+
+import static java.lang.Math.abs;
+
+
+public class SelectClockDialFragment extends Fragment {
+
+    private Context mContext;
+    private int pageTranslationX;
+
+    public static SelectClockDialFragment newInstance() {
+        return   new SelectClockDialFragment();
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        this.mContext =context;
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                             Bundle savedInstanceState) {
+        View view =  inflater.inflate(R.layout.fragment_select_clock_dial, container, false);
+
+
+        final ViewPager2 viewPager2 = view.findViewById(R.id.select_clock_page);
+        WatchPreviewAdapter viewPagerAdapter = new WatchPreviewAdapter(mContext,listener);
+        viewPager2.setAdapter(viewPagerAdapter);
+
+        viewPager2.setOffscreenPageLimit(1);
+        int nextItemVisiblePx = (int)getResources().getDimension(R.dimen.viewpager_next_item_visible);
+        int currentItemHorizontalMarginPx = (int)getResources().getDimension(R.dimen.viewpager_current_item_horizontal_margin);
+        pageTranslationX= nextItemVisiblePx + currentItemHorizontalMarginPx;
+
+        viewPager2.setPageTransformer(new CustomPageTransformer());
+
+        viewPager2.addItemDecoration(new SpacesItemDecoration(currentItemHorizontalMarginPx));
+
+        return view;
+    }
+
+    public class SpacesItemDecoration extends RecyclerView.ItemDecoration {
+        private int space;
+
+        public SpacesItemDecoration(int space) {
+            this.space = space;
+        }
+
+        @Override
+        public void getItemOffsets(Rect outRect, @NonNull View view,
+                                   RecyclerView parent, RecyclerView.State state) {
+            outRect.right = space;
+            outRect.left = space;
+        }
+    }
+
+    public class CustomPageTransformer implements ViewPager2.PageTransformer {
+        @Override
+        public void transformPage(@NonNull View page, float position) {
+            page.setTranslationX(-pageTranslationX*position);
+            page.setScaleY(1 - (0.35f * abs(position)));
+        }
+    }
+
+    private ISelectDialListener listener = entity -> {
+        SPUtils.setClockDialSP(mContext,entity.getDialValue());
+        sendChangeMainClock();
+        if(getActivity() != null){
+            getActivity().finish();
+        }
+    };
+
+    private void sendChangeMainClock(){
+        Intent intent = new Intent();
+        intent.setAction("com.ic.action.CHANGE_CLOCK");
+        mContext.sendBroadcast(intent);
+    }
+}
diff --git a/app/src/main/java/com/ic/launcher/fragment/clock/Clock12DialFragment.java b/app/src/main/java/com/ic/launcher/fragment/clock/Clock12DialFragment.java
new file mode 100644 (file)
index 0000000..4e49fb0
--- /dev/null
@@ -0,0 +1,53 @@
+package com.ic.launcher.fragment.clock;
+
+import android.app.Application;
+import android.os.Bundle;
+
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+
+import androidx.fragment.app.FragmentActivity;
+import androidx.lifecycle.ViewModelProvider;
+
+import com.ic.launcher.IcLauncherApplication;
+import com.ic.launcher.R;
+import com.ic.launcher.fragment.BaseFragment;
+import com.ic.launcher.mode.AnalogColorModel;
+import com.ic.launcher.mode.BaseModel;
+import com.ic.launcher.widget.ClockDrawableView;
+
+
+public class Clock12DialFragment extends BaseFragment {
+
+    private ClockDrawableView clockDrawableView;
+
+    public static Clock12DialFragment newInstance() {
+        return new Clock12DialFragment();
+    }
+
+    @Override
+    protected BaseModel initFragmentModel(FragmentActivity activity, Application application) {
+        AnalogColorModel.Factory factory = new AnalogColorModel.Factory(application);
+        return new ViewModelProvider(activity, factory).get(AnalogColorModel.class);
+    }
+
+    @Override
+    protected void onObserveModelValue(BaseModel baseModel) {
+        AnalogColorModel analogModel = (AnalogColorModel) baseModel;
+        analogModel.getObservableHourList().observe(this,hours ->{
+            clockDrawableView.onTimeChanged(hours[0],hours[1],hours[2]);
+        });
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                             Bundle savedInstanceState) {
+        View view =  inflater.inflate(R.layout.fragment_clock_12_dial, container, false);
+        clockDrawableView = view.findViewById(R.id.clock_12_drawable_view);
+        initOnTouchListener(view);
+        return view;
+    }
+
+}
diff --git a/app/src/main/java/com/ic/launcher/fragment/clock/Clock6DialFragment.java b/app/src/main/java/com/ic/launcher/fragment/clock/Clock6DialFragment.java
new file mode 100644 (file)
index 0000000..54e0af4
--- /dev/null
@@ -0,0 +1,50 @@
+package com.ic.launcher.fragment.clock;
+import android.app.Application;
+import android.os.Bundle;
+
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.fragment.app.FragmentActivity;
+import androidx.lifecycle.ViewModelProvider;
+
+import com.ic.launcher.R;
+import com.ic.launcher.fragment.BaseFragment;
+import com.ic.launcher.mode.AnalogColorModel;
+import com.ic.launcher.mode.BaseModel;
+import com.ic.launcher.widget.ClockDrawableView;
+
+
+public class Clock6DialFragment extends BaseFragment {
+
+    private ClockDrawableView clockDrawableView;
+
+    public static Clock6DialFragment newInstance() {
+        return new Clock6DialFragment();
+    }
+
+    @Override
+    protected BaseModel initFragmentModel(FragmentActivity activity, Application application) {
+        AnalogColorModel.Factory factory = new AnalogColorModel.Factory(application);
+        return new ViewModelProvider(activity, factory).get(AnalogColorModel.class);
+    }
+
+    @Override
+    protected void onObserveModelValue(BaseModel baseModel) {
+        AnalogColorModel analogModel = (AnalogColorModel) baseModel;
+        analogModel.getObservableHourList().observe(this,hours ->{
+            clockDrawableView.onTimeChanged(hours[0],hours[1],hours[2]);
+        });
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                             Bundle savedInstanceState) {
+        View view = inflater.inflate(R.layout.fragment_clock_6_dial, container, false);
+        clockDrawableView = view.findViewById(R.id.clock_6_drawable_view);
+        initOnTouchListener(view);
+        return view;
+    }
+
+}
diff --git a/app/src/main/java/com/ic/launcher/fragment/l02/L02StatusBarFragment.java b/app/src/main/java/com/ic/launcher/fragment/l02/L02StatusBarFragment.java
deleted file mode 100644 (file)
index 63bc6da..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-package com.ic.launcher.fragment.l02;
-
-
-import android.content.Context;
-import android.os.Bundle;
-
-import androidx.annotation.NonNull;
-import androidx.fragment.app.Fragment;
-
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.ic.launcher.databinding.FragmentL02StatusBarBinding;
-import com.ic.launcher.util.IcLog;
-
-
-public class L02StatusBarFragment extends Fragment {
-    private static final String TAG = "L02StatusBarFt";
-    private FragmentL02StatusBarBinding mStateBarBinding;
-
-
-    @Override
-    public void onAttach(@NonNull Context context) {
-        super.onAttach(context);
-    }
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-    }
-
-    @Override
-    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
-                             Bundle savedInstanceState) {
-        mStateBarBinding = FragmentL02StatusBarBinding.inflate(inflater, container, false);
-        return mStateBarBinding.getRoot();
-    }
-
-    public void updateBatteryValue(String value) {
-        mStateBarBinding.setBatteryValue(value);
-    }
-
-    public void updateBatteryDrawable(int drawableRes) {
-        mStateBarBinding.setBatteryDrawable(drawableRes);
-    }
-
-    public void updateBatteryChargeValue(boolean state) {
-        mStateBarBinding.setBatteryCharge(state);
-    }
-
-    public void updatePhoneSignal(int value) {
-        mStateBarBinding.setPhoneSignal(value);
-    }
-
-    public void updateTransportValue(int value) {
-        mStateBarBinding.setPhoneTransport(value);
-    }
-
-    public void updateNetTypeValue(int value) {
-        mStateBarBinding.setPhoneNetType(value);
-    }
-}
diff --git a/app/src/main/java/com/ic/launcher/fragment/l02/L02WatchFragment.java b/app/src/main/java/com/ic/launcher/fragment/l02/L02WatchFragment.java
deleted file mode 100644 (file)
index d2099d1..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-package com.ic.launcher.fragment.l02;
-
-
-import android.content.Context;
-import android.os.Bundle;
-
-import androidx.annotation.NonNull;
-import androidx.fragment.app.Fragment;
-
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.ic.launcher.databinding.FragmentL02WatchBinding;
-import com.ic.launcher.util.SPUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class L02WatchFragment extends Fragment {
-
-    private static final String TAG = "L02WatchFragment";
-
-    private Context mContext;
-    private FragmentL02WatchBinding watchBinding;
-
-    @Override
-    public void onAttach(@NonNull Context context) {
-        super.onAttach(context);
-        mContext = context;
-    }
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-    }
-
-    @Override
-    public View onCreateView(LayoutInflater inflater,
-                             ViewGroup container,
-                             Bundle savedInstanceState) {
-
-        watchBinding = FragmentL02WatchBinding.inflate(inflater, container, false);
-        updateHeartValue(String.valueOf(SPUtils.getBloodHeartSP(mContext)));
-        updatePedValue("0");
-        return watchBinding.getRoot();
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-    }
-
-    @Override
-    public void onPause() {
-        super.onPause();
-    }
-
-    @Override
-    public void onDestroy() {
-        super.onDestroy();
-    }
-
-    public void updateHeartValue(String value){
-        watchBinding.setHeartValue(value);
-    }
-
-    public void updatePedValue(String value){
-        watchBinding.setStepValue(value);
-    }
-
-    public void updateWeekValue(String value){
-        watchBinding.setWatchWeek(value);
-    }
-
-    public void updateDateValue(String value){
-        watchBinding.setWatchDate(value);
-    }
-
-    public void updateTimeValue(ArrayList<Integer> value){
-        watchBinding.setTimeText(value);
-    }
-}
diff --git a/app/src/main/java/com/ic/launcher/listener/ILowPowerCallPhoneListener.java b/app/src/main/java/com/ic/launcher/listener/ILowPowerCallPhoneListener.java
new file mode 100644 (file)
index 0000000..a580a96
--- /dev/null
@@ -0,0 +1,5 @@
+package com.ic.launcher.listener;
+
+public interface ILowPowerCallPhoneListener {
+    void onCallPhone();
+}
diff --git a/app/src/main/java/com/ic/launcher/listener/ILowPowerStateListener.java b/app/src/main/java/com/ic/launcher/listener/ILowPowerStateListener.java
new file mode 100644 (file)
index 0000000..2e9f7ad
--- /dev/null
@@ -0,0 +1,5 @@
+package com.ic.launcher.listener;
+
+public interface ILowPowerStateListener {
+    void onLowChange(boolean state);
+}
diff --git a/app/src/main/java/com/ic/launcher/listener/ISelectDialListener.java b/app/src/main/java/com/ic/launcher/listener/ISelectDialListener.java
new file mode 100644 (file)
index 0000000..ac5816b
--- /dev/null
@@ -0,0 +1,7 @@
+package com.ic.launcher.listener;
+
+import com.ic.launcher.entity.ClockDialEntity;
+
+public interface ISelectDialListener {
+    void onSelectDial(ClockDialEntity entity);
+}
diff --git a/app/src/main/java/com/ic/launcher/mode/AnalogColorModel.java b/app/src/main/java/com/ic/launcher/mode/AnalogColorModel.java
new file mode 100644 (file)
index 0000000..d914cac
--- /dev/null
@@ -0,0 +1,48 @@
+package com.ic.launcher.mode;
+
+import android.app.Application;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.ViewModel;
+import androidx.lifecycle.ViewModelProvider;
+
+import com.ic.launcher.presenter.PresenterCycle;
+import com.ic.launcher.presenter.TimeDatePresenter;
+
+public class AnalogColorModel extends BaseModel{
+
+    AnalogColorModel(@NonNull Application application) {
+        super(application);
+        PresenterCycle state = getPresenterList(TIME_LIST_INDEX);
+        if(state != null){
+            ((TimeDatePresenter)state).setAnalogClock(true);
+        }
+    }
+
+    public static class Factory extends ViewModelProvider.NewInstanceFactory {
+
+        @NonNull
+        private final Application mApplication;
+
+
+        public Factory(@NonNull Application application) {
+            mApplication = application;
+        }
+
+        @SuppressWarnings("unchecked")
+        @Override
+        @NonNull
+        public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
+            return (T) new AnalogColorModel(mApplication);
+        }
+    }
+
+    public LiveData<int[]> getObservableHourList() {
+        PresenterCycle state = getPresenterList(TIME_LIST_INDEX);
+        if(state != null){
+            return ((TimeDatePresenter)state).getObsHourList();
+        }
+        return null;
+    }
+}
@@ -13,42 +13,50 @@ import com.ic.launcher.presenter.AppListPresenter;
 
 import java.util.List;
 
-
-public class AppListModel extends AndroidViewModel {
+public class AppModel extends AndroidViewModel {
 
     private final AppListPresenter appListPresenter;
 
-    private final LiveData<List<AppInfoEntity>> mObsAppInfoList;
-    private final LiveData<boolean[]> mObsAppState;
-    private final LiveData<String> mObsActivityError;
-
-    public AppListModel(@NonNull Application application) {
+    private AppModel(Application application) {
         super(application);
-        this.appListPresenter = new AppListPresenter(application);
-        mObsAppInfoList = appListPresenter.getObsAppInfoList();
+        appListPresenter = new AppListPresenter(application);
 
-        mObsAppState = appListPresenter.getObsAppState();
-        mObsActivityError = appListPresenter.getObsActivityError();
     }
 
-    public LiveData<List<AppInfoEntity>> getObsAppInfoList() {
-        return mObsAppInfoList;
+    public void updateAppInfoList() {
+        if (appListPresenter != null) {
+            appListPresenter.updateSystemApp();
+        }
+
     }
 
-    public LiveData<boolean[]> getObsAppState() {
-        return mObsAppState;
+    public void onStartAppActivity(int pos) {
+        if (appListPresenter != null) {
+            appListPresenter.startAppActivity(pos);
+        }
+
     }
 
-    public LiveData<String> getObsActivityError() {
-        return mObsActivityError;
+    public LiveData<List<AppInfoEntity>> getObservableAppList() {
+        if (appListPresenter != null) {
+            return appListPresenter.getObsAppInfoList();
+        }
+
+        return null;
     }
 
-    public void updateAppInfoList() {
-        appListPresenter.updateSystemApp();
+    public LiveData<boolean[]> getObservableAppState() {
+        if (appListPresenter != null) {
+            return appListPresenter.getObsAppState();
+        }
+        return null;
     }
 
-    public void onStartAppActivity(int pos) {
-        appListPresenter.startAppActivity(pos);
+    public LiveData<String> getObservableErrorInfo() {
+        if (appListPresenter != null) {
+            return appListPresenter.getObsActivityError();
+        }
+        return null;
     }
 
     public static class Factory extends ViewModelProvider.NewInstanceFactory {
@@ -56,6 +64,7 @@ public class AppListModel extends AndroidViewModel {
         @NonNull
         private final Application mApplication;
 
+
         public Factory(@NonNull Application application) {
             mApplication = application;
         }
@@ -64,7 +73,7 @@ public class AppListModel extends AndroidViewModel {
         @Override
         @NonNull
         public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
-            return (T) new AppListModel(mApplication);
+            return (T) new AppModel(mApplication);
         }
     }
 }
diff --git a/app/src/main/java/com/ic/launcher/mode/BaseModel.java b/app/src/main/java/com/ic/launcher/mode/BaseModel.java
new file mode 100644 (file)
index 0000000..8a56e99
--- /dev/null
@@ -0,0 +1,73 @@
+package com.ic.launcher.mode;
+
+import android.app.Application;
+import android.util.SparseArray;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.AndroidViewModel;
+import androidx.lifecycle.LiveData;
+
+import com.ic.launcher.presenter.BatteryPresenter;
+import com.ic.launcher.presenter.PresenterCycle;
+import com.ic.launcher.presenter.TimeDatePresenter;
+
+public abstract class BaseModel extends AndroidViewModel {
+
+    protected final static int PHONE_LIST_INDEX = 0;
+    protected final static int BATTERY_LIST_INDEX = 1;
+    protected final static int TIME_LIST_INDEX = 2;
+    protected final static int HARDWARE_LIST_INDEX = 3;
+
+    private final SparseArray<PresenterCycle> mPresenter;
+
+    BaseModel(@NonNull Application application) {
+        super(application);
+        mPresenter = new SparseArray<>();
+
+        BatteryPresenter batteryPresenter = new BatteryPresenter(application.getApplicationContext());
+        TimeDatePresenter timeDatePresenter = new TimeDatePresenter(application.getApplicationContext());
+
+        addPresenterList(BATTERY_LIST_INDEX, batteryPresenter);
+        addPresenterList(TIME_LIST_INDEX, timeDatePresenter);
+    }
+
+    PresenterCycle getPresenterList(int index) {
+        return mPresenter.get(index);
+    }
+
+    void addPresenterList(int index, PresenterCycle cycle) {
+        mPresenter.put(index, cycle);
+    }
+
+    public void OnUiCreate() {
+        for (int i = 0; i < mPresenter.size(); i++) {
+            mPresenter.valueAt(i).onPresenterCreate();
+        }
+    }
+
+    public void OnUiResume() {
+        for (int i = 0; i < mPresenter.size(); i++) {
+            mPresenter.valueAt(i).onPresenterResume();
+        }
+    }
+
+    public void OnUiPause() {
+        for (int i = 0; i < mPresenter.size(); i++) {
+            mPresenter.valueAt(i).onPresenterPause();
+        }
+    }
+
+    public void OnUiDestroy() {
+        for (int i = 0; i < mPresenter.size(); i++) {
+            mPresenter.valueAt(i).onPresenterDestroy();
+        }
+    }
+
+    public LiveData<Boolean> getObservableLowPower() {
+        PresenterCycle state = getPresenterList(BATTERY_LIST_INDEX);
+        if(state != null){
+            return ((BatteryPresenter)state).getObsLowPower();
+        }
+        return null;
+    }
+}
index c5534ab..dfb623b 100644 (file)
@@ -3,7 +3,6 @@ package com.ic.launcher.mode;
 import android.app.Application;
 
 import androidx.annotation.NonNull;
-import androidx.lifecycle.AndroidViewModel;
 import androidx.lifecycle.LiveData;
 import androidx.lifecycle.ViewModel;
 import androidx.lifecycle.ViewModelProvider;
@@ -11,82 +10,28 @@ import androidx.lifecycle.ViewModelProvider;
 import com.ic.launcher.presenter.BatteryPresenter;
 import com.ic.launcher.presenter.HardwarePresenter;
 import com.ic.launcher.presenter.PhoneStatePresenter;
+import com.ic.launcher.presenter.PresenterCycle;
 import com.ic.launcher.presenter.TimeDatePresenter;
-import com.ic.launcher.util.IcLog;
 
-import java.util.ArrayList;
 
-public class L02MainModel extends AndroidViewModel {
+public class L02MainModel extends BaseModel {
 
     private static final String TAG = "L02MainModel";
 
-    private final PhoneStatePresenter phonePresenter;
-    private final BatteryPresenter batteryPresenter;
-    private final TimeDatePresenter timeDatePresenter;
-    private final HardwarePresenter hardwarePresenter;
-
-    private final LiveData<Integer> mObsPhoneTypeID;
-    private final LiveData<Integer> mObsPhoneSignalID;
-    private final LiveData<Integer> mObsPhoneTransportID;
-
-    private final LiveData<String> mObsBatteryValue;
-    private final LiveData<Boolean> mObsBatteryCharging;
-    private final LiveData<Integer> mObsBatteryResID;
-
-    private final LiveData<ArrayList<Integer>> mObsTime;
-    private final LiveData<String> mObsYear;
-    private final LiveData<String> mObsWeek;
-
-    private final LiveData<String> mObsHardwareHeart;
-    private final LiveData<String> mObsHardwarePed;
-
-    public L02MainModel(@NonNull Application application) {
+    private L02MainModel(Application application) {
         super(application);
-        this.phonePresenter = new PhoneStatePresenter(application.getApplicationContext());
-        this.batteryPresenter = new BatteryPresenter(application.getApplicationContext());
-        this.timeDatePresenter = new TimeDatePresenter(application.getApplicationContext());
-        this.hardwarePresenter = new HardwarePresenter(application.getApplicationContext());
-
-        mObsPhoneSignalID = phonePresenter.getPhoneSignalObservable();
-        mObsPhoneTypeID = phonePresenter.getPhoneTypeObservable();
-        mObsPhoneTransportID = phonePresenter.getPhoneTransportObservable();
-
-        mObsBatteryCharging = batteryPresenter.getObsBatteryCharging();
-        mObsBatteryResID = batteryPresenter.getObsBatteryResID();
-        mObsBatteryValue = batteryPresenter.getObsBatteryValue();
+        PhoneStatePresenter phonePresenter = new PhoneStatePresenter(application.getApplicationContext());
+        HardwarePresenter hardwarePresenter = new HardwarePresenter(application.getApplicationContext());
 
-        mObsTime = timeDatePresenter.getObsTime();
-        mObsYear = timeDatePresenter.getObsYear();
-        mObsWeek = timeDatePresenter.getmObsWeek();
-
-        mObsHardwareHeart = hardwarePresenter.getObsHardwareHeart();
-        mObsHardwarePed = hardwarePresenter.getObsHardwarePed();
-    }
-
-    public void onFragmentCreate(){
-        IcLog.i(TAG,"onFragmentCreate");
-    }
-
-    public void onFragmentResume(){
-        IcLog.i(TAG,"onFragmentResume");
-        hardwarePresenter.sendGetPedBroadcast();
-        timeDatePresenter.onResumePresenter();
-        phonePresenter.onResumePresenter();
-    }
+        addPresenterList(PHONE_LIST_INDEX,phonePresenter);
+        addPresenterList(HARDWARE_LIST_INDEX,hardwarePresenter);
 
-    public void onFragmentPause(){
-        IcLog.i(TAG,"onFragmentPause");
-        timeDatePresenter.onPausePresenter();
-        phonePresenter.onPausePresenter();
+        PresenterCycle state = getPresenterList(TIME_LIST_INDEX);
+        if(state != null){
+            ((TimeDatePresenter)state).setAnalogClock(false);
+        }
     }
 
-    public void onFragmentDestroy(){
-        IcLog.i(TAG,"onFragmentDestroy");
-        batteryPresenter.unRegisterBatteryReceiver();
-        hardwarePresenter.unRegisterHardwareReceiver();
-        phonePresenter.onDestroyPresenter();
-        timeDatePresenter.unRegisterTimeDateReceiver();
-    }
 
     public static class Factory extends ViewModelProvider.NewInstanceFactory {
 
@@ -106,47 +51,91 @@ public class L02MainModel extends AndroidViewModel {
         }
     }
 
-    public LiveData<Integer> getObsPhoneTypeID() {
-        return mObsPhoneTypeID;
+    public LiveData<Integer> getObservablePhoneType() {
+        PresenterCycle state = getPresenterList(PHONE_LIST_INDEX);
+        if(state != null){
+            return ((PhoneStatePresenter)state).getPhoneTypeObservable();
+        }
+        return null;
     }
 
-    public LiveData<Integer> getObsPhoneSignalID() {
-        return mObsPhoneSignalID;
+    public LiveData<Integer> getObservableSignal() {
+        PresenterCycle state = getPresenterList(PHONE_LIST_INDEX);
+        if(state != null){
+            return ((PhoneStatePresenter)state).getPhoneSignalObservable();
+        }
+        return null;
     }
 
-    public LiveData<Integer> getObsPhoneTransportID() {
-        return mObsPhoneTransportID;
+    public LiveData<Integer> getObservableTransport() {
+        PresenterCycle state = getPresenterList(PHONE_LIST_INDEX);
+        if(state != null){
+            return ((PhoneStatePresenter)state).getPhoneTransportObservable();
+        }
+        return null;
     }
 
-    public LiveData<String> getObsBatteryValue() {
-        return mObsBatteryValue;
+    public LiveData<Integer> getObservableBattery() {
+        PresenterCycle state = getPresenterList(BATTERY_LIST_INDEX);
+        if(state != null){
+            return ((BatteryPresenter)state).getObsBatteryResID();
+        }
+        return null;
     }
 
-    public LiveData<Boolean> getObsBatteryCharging() {
-        return mObsBatteryCharging;
+    public LiveData<Boolean> getObservableBatteryCharging() {
+        PresenterCycle state = getPresenterList(BATTERY_LIST_INDEX);
+        if(state != null){
+            return ((BatteryPresenter)state).getObsBatteryCharging();
+        }
+        return null;
     }
 
-    public LiveData<Integer> getObsBatteryResID() {
-        return mObsBatteryResID;
+    public LiveData<String> getObservableBatteryValue() {
+        PresenterCycle state = getPresenterList(BATTERY_LIST_INDEX);
+        if(state != null){
+            return ((BatteryPresenter)state).getObsBatteryValue();
+        }
+        return null;
     }
 
-    public LiveData<ArrayList<Integer>> getObsTime() {
-        return mObsTime;
+    public LiveData<String> getObservableHardwareHeart() {
+        PresenterCycle state = getPresenterList(HARDWARE_LIST_INDEX);
+        if(state != null){
+            return ((HardwarePresenter)state).getObsHardwareHeart();
+        }
+        return null;
     }
 
-    public LiveData<String> getObsYear() {
-        return mObsYear;
+    public LiveData<String> getObservableHardwarePed() {
+        PresenterCycle state = getPresenterList(HARDWARE_LIST_INDEX);
+        if(state != null){
+            return ((HardwarePresenter)state).getObsHardwarePed();
+        }
+        return null;
     }
 
-    public LiveData<String> getObsWeek() {
-        return mObsWeek;
+    public LiveData<String> getObservableWeek() {
+        PresenterCycle state = getPresenterList(TIME_LIST_INDEX);
+        if(state != null){
+            return ((TimeDatePresenter)state).getObsWeek();
+        }
+        return null;
     }
 
-    public LiveData<String> getObsHardwareHeart() {
-        return mObsHardwareHeart;
+    public LiveData<String> getObservableYear() {
+        PresenterCycle state = getPresenterList(TIME_LIST_INDEX);
+        if(state != null){
+            return ((TimeDatePresenter)state).getObsYear();
+        }
+        return null;
     }
 
-    public LiveData<String> getObsHardwarePed() {
-        return mObsHardwarePed;
+    public LiveData<int[]> getObservableTime() {
+        PresenterCycle state = getPresenterList(TIME_LIST_INDEX);
+        if(state != null){
+            return ((TimeDatePresenter)state).getObsTime();
+        }
+        return null;
     }
 }
diff --git a/app/src/main/java/com/ic/launcher/mode/LowPowerModel.java b/app/src/main/java/com/ic/launcher/mode/LowPowerModel.java
new file mode 100644 (file)
index 0000000..6002e43
--- /dev/null
@@ -0,0 +1,66 @@
+package com.ic.launcher.mode;
+
+import android.app.Application;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.AndroidViewModel;
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.ViewModel;
+import androidx.lifecycle.ViewModelProvider;
+
+import com.ic.launcher.presenter.BatteryPresenter;
+
+public class LowPowerModel extends AndroidViewModel {
+
+    private final BatteryPresenter batteryPresenter;
+
+    private LowPowerModel(Application application) {
+        super(application);
+        batteryPresenter = new BatteryPresenter(application);
+
+    }
+
+    public void OnUiCreate() {
+        if (batteryPresenter != null) {
+            batteryPresenter.onPresenterCreate();
+        }
+    }
+
+    public void OnUiDestroy() {
+        if (batteryPresenter != null) {
+            batteryPresenter.onPresenterDestroy();
+        }
+    }
+
+    public LiveData<String> getObservableLowPowerValue() {
+        if (batteryPresenter != null) {
+            return batteryPresenter.getObsLowPowerValue();
+        }
+        return null;
+    }
+
+    public LiveData<Boolean> getObservableLowPower() {
+        if (batteryPresenter != null) {
+            return batteryPresenter.getObsLowPower();
+        }
+        return null;
+    }
+
+    public static class Factory extends ViewModelProvider.NewInstanceFactory {
+
+        @NonNull
+        private final Application mApplication;
+
+
+        public Factory(@NonNull Application application) {
+            mApplication = application;
+        }
+
+        @SuppressWarnings("unchecked")
+        @Override
+        @NonNull
+        public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
+            return (T) new LowPowerModel(mApplication);
+        }
+    }
+}
index bdc912c..93a152a 100644 (file)
@@ -15,7 +15,7 @@ import com.ic.launcher.entity.AppInfoEntity;
 
 import java.util.List;
 
-public class AppListPresenter {
+public class AppListPresenter{
 
     private Context context;
     private MutableLiveData<List<AppInfoEntity>> mObsAppInfoList;
@@ -24,6 +24,7 @@ public class AppListPresenter {
 
     private String mErrorInfo;
 
+
     public AppListPresenter(Context context) {
         this.context = context;
         mObsAppInfoList = new MutableLiveData<>();
index 4d16b68..23cbc09 100644 (file)
@@ -5,6 +5,7 @@ import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.os.BatteryManager;
+import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 
 import androidx.lifecycle.MediatorLiveData;
@@ -13,13 +14,21 @@ import com.ic.launcher.configure.l02.L02Icon;
 import com.ic.launcher.util.IcLog;
 
 
-public class BatteryPresenter {
+public class BatteryPresenter extends PresenterCycle {
     private static final String TAG = "BatteryPresenter";
+
+    private static final int LOW_LEVEL = 15;
+    private static final int SHUT_DOWN_LEVEL = 5;
+
     private Context mContext;
 
+    private boolean isLowPowerState = false;
+
     private MediatorLiveData<String> mObsBatteryValue;
     private MediatorLiveData<Boolean> mObsBatteryCharging;
     private MediatorLiveData<Integer> mObsBatteryResID;
+    private MediatorLiveData<Boolean> mObsLowPower;
+    private MediatorLiveData<String> mObsLowPowerValue;
 
     public MediatorLiveData<String> getObsBatteryValue() {
         return mObsBatteryValue;
@@ -33,6 +42,28 @@ public class BatteryPresenter {
         return mObsBatteryResID;
     }
 
+    public MediatorLiveData<Boolean> getObsLowPower() {
+        return mObsLowPower;
+    }
+
+    public MediatorLiveData<String> getObsLowPowerValue() {
+        return mObsLowPowerValue;
+    }
+
+    @Override
+    public void onPresenterCreate() {
+        super.onPresenterCreate();
+        IcLog.i(TAG,"BatteryPresenter onPresenterCreate");
+        registerBatteryReceiver();
+    }
+
+    @Override
+    public void onPresenterDestroy() {
+        super.onPresenterDestroy();
+        IcLog.i(TAG,"BatteryPresenter onPresenterDestroy");
+        unRegisterBatteryReceiver();
+    }
+
     public BatteryPresenter(Context context) {
         mContext = context;
 
@@ -40,23 +71,27 @@ public class BatteryPresenter {
         mObsBatteryCharging = new MediatorLiveData<>();
         mObsBatteryResID = new MediatorLiveData<>();
 
-        registerBatteryReceiver();
+        mObsLowPower = new MediatorLiveData<>();
+        mObsLowPowerValue = new MediatorLiveData<>();
     }
 
+    /**
+     * 注册监听电量改变,充电拔出广播
+     */
     private void registerBatteryReceiver() {
         IntentFilter filter = new IntentFilter();
         filter.addAction(Intent.ACTION_BATTERY_CHANGED);
-        filter.addAction(Intent.ACTION_BATTERY_LOW);
-        filter.addAction(Intent.ACTION_BATTERY_OKAY);
-        filter.addAction(Intent.ACTION_POWER_CONNECTED);
         filter.addAction(Intent.ACTION_POWER_DISCONNECTED);
         mContext.registerReceiver(mIntentReceiver, filter);
     }
 
-    public void unRegisterBatteryReceiver() {
+    /**
+     * 移除广播
+     */
+    private void unRegisterBatteryReceiver() {
         try {
             mContext.unregisterReceiver(mIntentReceiver);
-        } catch (Exception e) {
+        } catch (IllegalArgumentException e) {
             IcLog.e(TAG, "BatteryPresenter", e);
         }
     }
@@ -72,48 +107,59 @@ public class BatteryPresenter {
                     return;
                 }
 
-                IcLog.i(TAG, "Battery Statu:" + acyion);
-
                 switch (acyion) {
                     case Intent.ACTION_BATTERY_CHANGED:
+                        IcLog.i(TAG, "Battery Statu: ACTION_BATTERY_CHANGED");
                         int status = intent.getIntExtra("status", -1);
                         int rawlevel = intent.getIntExtra("level", -1);
                         int scale = intent.getIntExtra("scale", -1);
-                        updateBatteryValue(rawlevel, scale);
-                        updateBatteryCharging(status);
-                        break;
-                    case Intent.ACTION_BATTERY_OKAY:
-                        mObsBatteryCharging.setValue(false);
-                        IcLog.i(TAG, "POWER ACTION_BATTERY_OKAY");
+                        updateBatteryValue(rawlevel, scale, status);
                         break;
                     case Intent.ACTION_POWER_DISCONNECTED:
-                        //电量满了,或者 没有接电源
+                        // 没有接电源
                         mObsBatteryCharging.setValue(false);
                         IcLog.i(TAG, "POWER ACTION_POWER_DISCONNECTED");
                         break;
-                    case Intent.ACTION_POWER_CONNECTED:
-                        IcLog.i(TAG, "POWER CONNECTED");
-                        break;
                 }
             }
         }
     };
 
-    private void updateBatteryValue(int rawlevel, int scale) {
-        int level = -1; // percentage, or -1 for unknown
+    private void updateBatteryValue(int rawlevel, int scale, int status) {
+        int level = -1;
         if (rawlevel >= 0 && scale > 0) {
             level = (rawlevel * 100) / scale;
         }
 
+        IcLog.i(TAG, "Battery Value:" + level);
+
+        if (level == -1) return;
+
+        //低于5 则直接关机
+        if (level <= SHUT_DOWN_LEVEL) {
+            shutDown();
+        } else if (level <= LOW_LEVEL) {
+            //进入低电量
+            if(!gotoLowPowerMode(level)){
+                updateBatteryObserveValue(level,status);
+            }
+        } else {
+            //退出低电量模式
+            if (isLowPowerState) {
+                mObsLowPower.setValue(false);
+                isLowPowerState = false;
+            }
+            updateBatteryObserveValue(level,status);
+        }
+    }
 
+    private void updateBatteryObserveValue(int level,int status){
         mObsBatteryResID.setValue(L02Icon.l02BatteryResId[getBatteryLevel(level)]);
         mObsBatteryValue.setValue(level + "%");
-    }
 
-    private void updateBatteryCharging(int state) {
-        if (BatteryManager.BATTERY_STATUS_CHARGING == state) {
+        if (BatteryManager.BATTERY_STATUS_CHARGING == status) {
             mObsBatteryCharging.setValue(true);
-        }else{
+        } else {
             mObsBatteryCharging.setValue(false);
         }
     }
@@ -134,4 +180,49 @@ public class BatteryPresenter {
 
         return index;
     }
+
+    private boolean gotoLowPowerMode(int level) {
+        //判断是否在通话中,如果是 则返回
+        if (phoneIsInUse()) return false;
+
+        //是否是首次进入到低电量模式
+        if (!isLowPowerState) {
+            mObsLowPower.setValue(true);
+            getHome();
+            isLowPowerState = true;
+        }
+
+        //更新低电量的值
+        mObsLowPowerValue.setValue(level + "%");
+
+        return true;
+    }
+
+    private void getHome() {
+        Intent intent = new Intent(Intent.ACTION_MAIN);
+        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        intent.addCategory(Intent.CATEGORY_HOME);
+        mContext.startActivity(intent);
+    }
+
+    private boolean phoneIsInUse() {
+        TelephonyManager mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
+        if (mTelephonyManager == null) {
+            return false;
+        }
+        int state = mTelephonyManager.getCallState();
+        return state != TelephonyManager.CALL_STATE_IDLE;
+    }
+
+
+    private void shutDown() {
+        try {
+            Intent intent = new Intent("android.intent.action.ACTION_REQUEST_SHUTDOWN");
+            intent.putExtra("android.intent.extra.KEY_CONFIRM", false);
+            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+            mContext.startActivity(intent);
+        } catch (Exception e) {
+            IcLog.e(TAG, "shutdown", e);
+        }
+    }
 }
index d1441b0..148ae14 100644 (file)
@@ -11,7 +11,7 @@ import androidx.lifecycle.MediatorLiveData;
 import com.ic.launcher.util.IcLog;
 import com.ic.launcher.util.SPUtils;
 
-public class HardwarePresenter {
+public class HardwarePresenter extends PresenterCycle {
     private static final String TAG = "HardwarePresenter";
 
     private static final String HEART_ACTION = "com.ic.action.BLOOD_HEART";
@@ -23,14 +23,28 @@ public class HardwarePresenter {
     private MediatorLiveData<String> mObsHardwareHeart;
     private MediatorLiveData<String> mObsHardwarePed;
 
-    public HardwarePresenter(Context context) {
+    @Override
+    public void onPresenterCreate() {
+        super.onPresenterCreate();
+        registerHardwareBroadcast();
+    }
 
-        this.mContext = context;
+    @Override
+    public void onPresenterResume() {
+        super.onPresenterResume();
+        sendGetPedBroadcast();
+    }
 
+    @Override
+    public void onPresenterDestroy() {
+        super.onPresenterDestroy();
+        unRegisterHardwareReceiver();
+    }
+
+    public HardwarePresenter(Context context) {
+        this.mContext = context;
         mObsHardwareHeart = new MediatorLiveData<>();
         mObsHardwarePed = new MediatorLiveData<>();
-
-        registerHardwareBroadcast();
     }
 
     public MediatorLiveData<String> getObsHardwareHeart() {
@@ -41,6 +55,12 @@ public class HardwarePresenter {
         return mObsHardwarePed;
     }
 
+    private void sendGetPedBroadcast(){
+        Intent pedIntent = new Intent();
+        pedIntent.setAction(GET_PED_ACTION);
+        mContext.sendBroadcast(pedIntent);
+    }
+
     private void registerHardwareBroadcast() {
         IntentFilter filter = new IntentFilter();
         filter.addAction(PED_ACTION);
@@ -48,20 +68,14 @@ public class HardwarePresenter {
         mContext.registerReceiver(mIntentReceiver, filter);
     }
 
-    public void unRegisterHardwareReceiver() {
+    private void unRegisterHardwareReceiver() {
         try {
             mContext.unregisterReceiver(mIntentReceiver);
-        }catch (Exception e){
+        }catch (IllegalArgumentException e){
             IcLog.e(TAG,"HardwareReceiver",e);
         }
     }
 
-    public void sendGetPedBroadcast(){
-        Intent pedIntent = new Intent();
-        pedIntent.setAction(GET_PED_ACTION);
-        mContext.sendBroadcast(pedIntent);
-    }
-
     private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
index 8d854d7..896ffba 100644 (file)
@@ -6,7 +6,7 @@ import androidx.lifecycle.LiveData;
 import androidx.lifecycle.MediatorLiveData;
 
 
-public class PhoneStatePresenter {
+public class PhoneStatePresenter extends PresenterCycle {
     private static final String TAG = "PhoneStatePresenter";
 
     private QueryPhoneState queryState;
@@ -17,27 +17,9 @@ public class PhoneStatePresenter {
     private MediatorLiveData<Integer> mObsPhoneTypeID;
     private MediatorLiveData<Integer> mObsPhoneSignalID;
 
-    public PhoneStatePresenter(Context context) {
-        mObsPhoneTypeID = new MediatorLiveData<>();
-        mObsPhoneSignalID = new MediatorLiveData<>();
-        mObsPhoneTransportID = new MediatorLiveData<>();
-
-        queryState = new QueryPhoneState(context,mObsPhoneTypeID,mObsPhoneSignalID,mObsPhoneTransportID);
-    }
-
-    public LiveData<Integer> getPhoneTypeObservable() {
-        return mObsPhoneTypeID;
-    }
-
-    public LiveData<Integer> getPhoneSignalObservable() {
-        return mObsPhoneSignalID;
-    }
-
-    public LiveData<Integer> getPhoneTransportObservable() {
-        return mObsPhoneTransportID;
-    }
-
-    public void onResumePresenter() {
+    @Override
+    public void onPresenterResume() {
+        super.onPresenterResume();
         if(mQueryThread == null){
             mQueryThread = new Thread(queryState);
             mQueryThread.start();
@@ -46,20 +28,46 @@ public class PhoneStatePresenter {
         }
     }
 
-    public void onPausePresenter() {
+    @Override
+    public void onPresenterPause() {
+        super.onPresenterPause();
         if (mQueryThread != null && queryState != null) {
             queryState.pauseQueryThread();
         }
     }
 
-    public void onDestroyPresenter() {
+    @Override
+    public void onPresenterDestroy() {
+        super.onPresenterDestroy();
         if (mQueryThread != null) {
             mQueryThread.interrupt();
         }
 
         mQueryThread = null;
 
-        queryState.destroyPhoneState();
+        if(queryState != null){
+            queryState.destroyPhoneState();
+        }
         queryState=null;
     }
+
+    public PhoneStatePresenter(Context context) {
+        mObsPhoneTypeID = new MediatorLiveData<>();
+        mObsPhoneSignalID = new MediatorLiveData<>();
+        mObsPhoneTransportID = new MediatorLiveData<>();
+
+        queryState = new QueryPhoneState(context,mObsPhoneTypeID,mObsPhoneSignalID,mObsPhoneTransportID);
+    }
+
+    public LiveData<Integer> getPhoneTypeObservable() {
+        return mObsPhoneTypeID;
+    }
+
+    public LiveData<Integer> getPhoneSignalObservable() {
+        return mObsPhoneSignalID;
+    }
+
+    public LiveData<Integer> getPhoneTransportObservable() {
+        return mObsPhoneTransportID;
+    }
 }
diff --git a/app/src/main/java/com/ic/launcher/presenter/PresenterCycle.java b/app/src/main/java/com/ic/launcher/presenter/PresenterCycle.java
new file mode 100644 (file)
index 0000000..89cec58
--- /dev/null
@@ -0,0 +1,16 @@
+package com.ic.launcher.presenter;
+
+public abstract class PresenterCycle {
+
+    public void onPresenterCreate() {
+    }
+
+    public void onPresenterResume() {
+    }
+
+    public void onPresenterPause() {
+    }
+
+    public void onPresenterDestroy() {
+    }
+}
index c5e8320..00d96c3 100644 (file)
@@ -127,7 +127,7 @@ public class QueryPhoneState extends QueryThread {
             if (cellInfo instanceof CellInfoLte) {
                 // cast to CellInfoLte and call all the CellInfoLte methods you need
                 int level = ((CellInfoLte) cellInfo).getCellSignalStrength().getLevel() + 1;
-                IcLog.i(TAG, "Signal Strength level:" + level);
+                //IcLog.i(TAG, "Signal Strength level:" + level);
                 if (level != oldSignalLevel) {
                     oldSignalLevel = level;
                     mObsPhoneSignalID.postValue(l02SignalResId[level + 1]);
index 922dd9b..a90b73a 100644 (file)
@@ -3,7 +3,7 @@ package com.ic.launcher.presenter;
 import com.ic.launcher.util.IcLog;
 
 public abstract class QueryThread extends Thread {
-    private static final String TAG="QueryThread";
+    private static final String TAG = "QueryThread";
 
     private final Object lock = new Object();
     private boolean pause = false;
@@ -32,6 +32,9 @@ public abstract class QueryThread extends Thread {
         }
     }
 
+    /****
+     *    此处时间不能乱修改,模拟表盘 秒表也用。所以要修改请{@link TimeDatePresenter} 一起修改
+     */
     @Override
     public void run() {
         super.run();
index f44de06..0d3abd6 100644 (file)
@@ -5,51 +5,108 @@ import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
-import android.text.format.DateFormat;
+import android.content.pm.PackageManager;
+import android.os.Handler;
+import android.os.Message;
+import android.text.TextUtils;
 
+import androidx.annotation.NonNull;
 import androidx.lifecycle.MediatorLiveData;
 
 import com.ic.launcher.util.IcLog;
 
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.TimeZone;
+import org.threeten.bp.Instant;
+import org.threeten.bp.LocalDateTime;
+import org.threeten.bp.ZoneId;
+import org.threeten.bp.format.DateTimeFormatter;
+import org.threeten.bp.format.TextStyle;
+
+import java.lang.ref.WeakReference;
+import java.util.Locale;
+
 
 import static com.ic.launcher.configure.l02.L02Icon.l02TimeHourImage;
 import static com.ic.launcher.configure.l02.L02Icon.l02TimeMinutesImage;
 
-public class TimeDatePresenter {
+public class TimeDatePresenter extends PresenterCycle {
 
     private static final String TAG = "TimeDatePresenter";
+    private static final DateTimeFormatter MMDD = DateTimeFormatter.ofPattern("MM-dd");
 
-    private static final CharSequence DEFAULT_FORMAT_24_HOUR = "HH:mm";
-    private static final CharSequence DEFAULT_FORMAT_MM_DD = "MM-dd";
-    private static final CharSequence DEFAULT_FORMAT_EEEEE = "EEEE";
-
-    private MediatorLiveData<ArrayList<Integer>> mObsTime;
+    private MediatorLiveData<int[]> mObsTime;
     private MediatorLiveData<String> mObsYear;
     private MediatorLiveData<String> mObsWeek;
 
+    private MediatorLiveData<int[]> mObsHourList;
 
     private Context mContext;
-    private Calendar mTime;
-    private boolean mShouldRunTicker = false;
 
-    private ArrayList<Integer> timeList;
+    private Thread loopThread = null;
+    private LoopSecondThread mLoopSecond = null;
+
+    private boolean mAnalogClock=false;
+    private SecondMessage secondMessage;
+
+    @Override
+    public void onPresenterCreate() {
+        super.onPresenterCreate();
+        registerTimeDateReceiver();
+    }
+
+    @Override
+    public void onPresenterResume() {
+        super.onPresenterResume();
+        //如果获取秒钟的线程没有启动。则启动
+        if (mAnalogClock) {
+            if (loopThread == null || mLoopSecond == null) {
+                mLoopSecond = new LoopSecondThread();
+                loopThread = new Thread(mLoopSecond);
+                loopThread.start();
+            } else {
+                mLoopSecond.resumeQueryThread();
+            }
+        }
+    }
+
+    @Override
+    public void onPresenterPause() {
+        super.onPresenterPause();
+        if (mAnalogClock) {
+            if (mLoopSecond != null) {
+                mLoopSecond.pauseQueryThread();
+            }
+        }
+    }
+
+    @Override
+    public void onPresenterDestroy() {
+        super.onPresenterDestroy();
+        unRegisterTimeDateReceiver();
+
+        if (loopThread != null) {
+            loopThread.interrupt();
+        }
+    }
+
+    public void setAnalogClock(boolean analog) {
+        this.mAnalogClock = analog;
+    }
 
     public TimeDatePresenter(Context context) {
         mContext = context;
-        timeList = new ArrayList<>();
-        createTime(null);
 
         mObsTime = new MediatorLiveData<>();
         mObsYear = new MediatorLiveData<>();
         mObsWeek = new MediatorLiveData<>();
 
-        registerTimeDateReceiver();
+        mObsHourList = new MediatorLiveData<>();
+
+        secondMessage = new SecondMessage(this);
+
+        analysisDataTimeValue(null);
     }
 
-    public MediatorLiveData<ArrayList<Integer>> getObsTime() {
+    public MediatorLiveData<int[]> getObsTime() {
         return mObsTime;
     }
 
@@ -57,18 +114,14 @@ public class TimeDatePresenter {
         return mObsYear;
     }
 
-    public MediatorLiveData<String> getmObsWeek() {
+    public MediatorLiveData<String> getObsWeek() {
         return mObsWeek;
     }
 
-    public void onResumePresenter() {
-        onTimeChanged();
-        mShouldRunTicker = true;
+    public MediatorLiveData<int[]> getObsHourList() {
+        return mObsHourList;
     }
 
-    public void onPausePresenter() {
-        mShouldRunTicker = false;
-    }
 
     private void registerTimeDateReceiver() {
         IntentFilter filter = new IntentFilter();
@@ -78,10 +131,10 @@ public class TimeDatePresenter {
         mContext.registerReceiver(mIntentReceiver, filter);
     }
 
-    public void unRegisterTimeDateReceiver() {
+    private void unRegisterTimeDateReceiver() {
         try {
             mContext.unregisterReceiver(mIntentReceiver);
-        } catch (Exception e) {
+        } catch (IllegalArgumentException e) {
             IcLog.e(TAG, "unRegisterTimeDateReceiver", e);
         }
     }
@@ -89,53 +142,81 @@ public class TimeDatePresenter {
     private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
-            if (Intent.ACTION_TIMEZONE_CHANGED.equals(intent.getAction())) {
-                final String timeZone = intent.getStringExtra("time-zone");
-                createTime(timeZone);
-            } else if (!mShouldRunTicker && (Intent.ACTION_TIME_TICK.equals(intent.getAction())
-                    || Intent.ACTION_TIME_CHANGED.equals(intent.getAction()))) {
-                return;
+            String action = intent.getAction();
+            if (TextUtils.isEmpty(action)) return;
+
+            if (Intent.ACTION_TIMEZONE_CHANGED.equals(action)) {
+                analysisDataTimeValue(intent.getStringExtra("time-zone"));
+            } else {
+                analysisDataTimeValue(null);
             }
-            onTimeChanged();
         }
     };
 
-    private void createTime(String timeZone) {
-        if (timeZone != null) {
-            mTime = Calendar.getInstance(TimeZone.getTimeZone(timeZone));
+    private void analysisDataTimeValue(String z) {
+
+        LocalDateTime currDateTime;
+
+        if (!TextUtils.isEmpty(z)) {
+            ZoneId zone = ZoneId.of(z).getRules().getOffset(Instant.now());
+            currDateTime = LocalDateTime.now(zone);
         } else {
-            mTime = Calendar.getInstance();
+            currDateTime = LocalDateTime.now(ZoneId.systemDefault());
+        }
+
+
+        if (mAnalogClock) {
+            updateAnalogClock(currDateTime);
+        } else {
+            //如果当前是数字表盘
+            computeMainClockTime(currDateTime);
         }
     }
 
-    private void onTimeChanged() {
-        mTime.setTimeInMillis(System.currentTimeMillis());
+    private void computeMainClockTime(LocalDateTime localDateTime) {
 
-        CharSequence time = DateFormat.format(DEFAULT_FORMAT_24_HOUR, mTime);
-        CharSequence mmdd = DateFormat.format(DEFAULT_FORMAT_MM_DD, mTime);
-        CharSequence week = DateFormat.format(DEFAULT_FORMAT_EEEEE, mTime);
+        mObsYear.setValue(localDateTime.format(MMDD));
 
-        timeList.clear();
+        mObsWeek.setValue(localDateTime.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.getDefault()));
 
-        boolean isHour = true;
+        int hour = localDateTime.getHour();
+        int minute = localDateTime.getMinute();
 
-        for (int i = 0; i < time.length(); i++) {
-            if (time.charAt(i) == ':') {
-                isHour = false;
-                continue;
-            }
+        mObsTime.setValue(new int[]{
+                l02TimeHourImage[hour / 10],
+                l02TimeHourImage[hour % 10],
+                l02TimeMinutesImage[minute / 10],
+                l02TimeMinutesImage[minute % 10]});
+    }
 
-            if (isHour) {
-                timeList.add(l02TimeHourImage[Character.getNumericValue(time.charAt(i))]);
-            } else {
-                timeList.add(l02TimeMinutesImage[Character.getNumericValue(time.charAt(i))]);
-            }
+    private void updateAnalogClock(LocalDateTime localDateTime) {
+        //模拟表盘
+        mObsHourList.setValue(new int[]{
+                localDateTime.getHour(),
+                localDateTime.getMinute(),
+                localDateTime.getSecond()});
+    }
+
+    private static class SecondMessage extends Handler{
+        private WeakReference<TimeDatePresenter> reference;
+
+        public SecondMessage(TimeDatePresenter ref) {
+            this.reference = new WeakReference<TimeDatePresenter>(ref) ;
         }
 
-        mObsTime.setValue(timeList);
-        mObsYear.setValue(mmdd.toString());
-        mObsWeek.setValue(week.toString());
+        @Override
+        public void dispatchMessage(@NonNull Message msg) {
+            super.dispatchMessage(msg);
+            reference.get().analysisDataTimeValue(null);
+        }
+    }
 
-        IcLog.i(TAG, "time" + time.toString() + " mmdd:" + mmdd.toString() + " week" + week.toString());
+    private class LoopSecondThread extends QueryThread {
+        @Override
+        void onThreadExecute() {
+            if(secondMessage != null){
+                secondMessage.sendEmptyMessage(1);
+            }
+        }
     }
 }
index 9cae414..22b92f7 100644 (file)
@@ -7,7 +7,7 @@ public class SPUtils {
 
     private static final String Blood_Heart = "Blood_Heart";
 
-    public static SharedPreferences getSP(Context context) {
+    private static SharedPreferences getSP(Context context) {
         return context.getSharedPreferences("IcBloodSet", Context.MODE_PRIVATE);
     }
 
@@ -23,4 +23,23 @@ public class SPUtils {
             editor.apply();
         }
     }
+
+    private static final String Clock_Main= "Clock_Main";
+
+    private static SharedPreferences getClockSP(Context context) {
+        return context.getSharedPreferences("IcClockDial", Context.MODE_PRIVATE);
+    }
+
+    public static int getClockDialSP(Context context) {
+        return getClockSP(context).getInt(Clock_Main, 0);
+    }
+
+
+    public static void setClockDialSP(Context context,int main) {
+        SharedPreferences.Editor editor = getClockSP(context).edit();
+        if (editor != null) {
+            editor.putInt(Clock_Main, main);
+            editor.apply();
+        }
+    }
 }
diff --git a/app/src/main/java/com/ic/launcher/widget/ClockDrawableView.java b/app/src/main/java/com/ic/launcher/widget/ClockDrawableView.java
new file mode 100644 (file)
index 0000000..66d3ba2
--- /dev/null
@@ -0,0 +1,122 @@
+package com.ic.launcher.widget;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.view.View;
+
+import androidx.core.content.ContextCompat;
+
+import com.ic.launcher.R;
+
+
+public class ClockDrawableView extends View {
+
+    private Drawable mHourHand;
+    private Drawable mMinuteHand;
+    private Drawable mSecondHead;
+
+    private int mDialWidth;
+    private int mDialHeight;
+
+
+    private float mMinutes;
+    private float mHour;
+    private float mSecond;
+
+    private int rX;
+    private int rY;
+
+    public ClockDrawableView(Context context) {
+        this(context, null);
+    }
+
+    public ClockDrawableView(Context context, AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public ClockDrawableView(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+
+        TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.ClockDrawableView,defStyleAttr,0);
+
+        int dialResId = typedArray.getResourceId(R.styleable.ClockDrawableView_mBackgroundClock,-1);
+        int hourResId = typedArray.getResourceId(R.styleable.ClockDrawableView_mHourHandClock,-1);
+        int minuteResId = typedArray.getResourceId(R.styleable.ClockDrawableView_mMinuteHandClock,-1);
+        int secondResId = typedArray.getResourceId(R.styleable.ClockDrawableView_mSecondHandClock,-1);
+
+        Drawable mDial =ContextCompat.getDrawable(context,dialResId);
+        mHourHand = ContextCompat.getDrawable(context,hourResId);
+        mMinuteHand = ContextCompat.getDrawable(context,minuteResId);
+        mSecondHead = ContextCompat.getDrawable(context,secondResId);
+
+        typedArray.recycle();
+
+        if(mDial != null){
+            mDialWidth = mDial.getIntrinsicWidth();
+            mDialHeight = mDial.getIntrinsicHeight();
+
+            rX = mDialWidth / 2;
+            rY = mDialHeight / 2;
+        }
+    }
+
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+
+        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
+        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
+        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
+        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
+
+        float hScale = 1.0f;
+        float vScale = 1.0f;
+
+        if (widthMode != MeasureSpec.UNSPECIFIED && widthSize < mDialWidth) {
+            hScale = (float) widthSize / (float) mDialWidth;
+        }
+
+        if (heightMode != MeasureSpec.UNSPECIFIED && heightSize < mDialHeight) {
+            vScale = (float) heightSize / (float) mDialHeight;
+        }
+
+        float scale = Math.min(hScale, vScale);
+
+        setMeasuredDimension(resolveSizeAndState((int) (mDialWidth * scale), widthMeasureSpec, 0),
+                resolveSizeAndState((int) (mDialHeight * scale), heightMeasureSpec, 0));
+    }
+
+
+    private void drawCustomDrawable(Canvas canvas, Drawable drawable, int rx, int ry, float value) {
+        canvas.save();
+        canvas.rotate(value, rx, ry);
+        int w = drawable.getIntrinsicWidth();
+        int h = drawable.getIntrinsicHeight();
+        drawable.setBounds(rx - (w / 2), ry - (h / 2), rx + (w / 2), ry + (h / 2));
+        drawable.draw(canvas);
+        canvas.restore();
+    }
+
+    @Override
+    protected void onDraw(Canvas canvas) {
+        super.onDraw(canvas);
+        //绘制小时
+        drawCustomDrawable(canvas, mHourHand, rX, rY, mHour / 12.0f * 360.0f);
+        //绘制分钟
+        drawCustomDrawable(canvas, mMinuteHand, rX, rY, mMinutes / 60.0f * 360.0f);
+        //绘制秒钟
+        drawCustomDrawable(canvas, mSecondHead, rX, rY, mSecond / 60.0f * 360.0f);
+    }
+
+    public void onTimeChanged(int hour, int minute, int second) {
+
+        mMinutes = minute + second / 60.0f;
+        mHour = hour + mMinutes / 60.0f;
+        mSecond = second;
+
+        invalidate();
+    }
+}
diff --git a/app/src/main/java/com/ic/launcher/widget/ClockWatchView.java b/app/src/main/java/com/ic/launcher/widget/ClockWatchView.java
deleted file mode 100644 (file)
index bd8e8b6..0000000
+++ /dev/null
@@ -1,135 +0,0 @@
-package com.ic.launcher.widget;
-
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.Rect;
-import android.util.AttributeSet;
-import android.util.TypedValue;
-import android.view.View;
-
-import androidx.annotation.Nullable;
-
-public class ClockWatchView extends View {
-
-    private float mRadius; //外圆半径
-
-    private int mColorLong = Color.WHITE; //长线的颜色
-    private int mColorShort = Color.WHITE; //短线的颜色
-
-    //指针末尾的长度
-    private float mPointEndLength;
-
-    private Paint mPaint;
-
-    public ClockWatchView(Context context) {
-        this(context, null);
-    }
-
-    public ClockWatchView(Context context, @Nullable AttributeSet attrs) {
-        this(context, null, 0);
-    }
-
-    public ClockWatchView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-        //初始化画笔
-        init();
-    }
-
-    private void init() {
-        mPaint = new Paint();
-        mPaint.setAntiAlias(true);
-        mPaint.setDither(true);
-    }
-
-    @Override
-    protected void onDraw(Canvas canvas) {
-        canvas.save();
-
-        //移动到中心部分
-        canvas.translate(getWidth() / 2, getHeight() / 2);
-
-        //绘制刻度
-        paintScale(canvas);
-
-        canvas.restore();
-    }
-
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-
-
-        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
-        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
-        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
-        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
-
-
-        if (widthMode == MeasureSpec.AT_MOST
-                || widthMode == MeasureSpec.UNSPECIFIED
-                || heightMeasureSpec == MeasureSpec.AT_MOST
-                || heightMeasureSpec == MeasureSpec.UNSPECIFIED) {
-            //宽度高度至少有一个确定的值,不能同时为wrap_content
-            return;
-        } else { //至少有一个为确定值,要获取其中的最小值
-            if (widthMode == MeasureSpec.EXACTLY) {
-                setMeasuredDimension(widthSize, heightSize);
-            }
-        }
-    }
-
-
-    @Override
-    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
-        super.onSizeChanged(w, h, oldw, oldh);
-        mRadius = (Math.min(w, h)) / 2;
-        mPointEndLength = mRadius / 6;
-    }
-
-    private void paintScale(Canvas canvas) {
-        //设置宽度
-        mPaint.setStrokeWidth(dpToPx(1));
-        int lineWidth = 0;
-        for (int i = 0; i < 60; i++) {
-            if (i % 5 == 0) { //整点
-                mPaint.setStrokeWidth(dpToPx(2f));
-                mPaint.setColor(mColorLong);
-                lineWidth = 8;
-                mPaint.setTextSize(spToPx(26));
-                String text = ((i / 5) == 0 ? 12 : (i / 5)) + "";
-                Rect textBound = new Rect();
-                mPaint.getTextBounds(text, 0, text.length(), textBound);
-                mPaint.setColor(Color.WHITE);
-                canvas.save();
-                if (i > 15 && i < 45) {
-                    canvas.translate(0, -mRadius + lineWidth - dpToPx(5) + (textBound.bottom - textBound.top));
-                } else if (i == 15 || i == 45) {
-                    canvas.translate(0, -mRadius + lineWidth - dpToPx(8) + (textBound.bottom - textBound.top));
-                } else {
-                    canvas.translate(0, -mRadius + lineWidth + dpToPx(2) + (textBound.bottom - textBound.top));
-                }
-                canvas.rotate(-6 * i);
-                mPaint.setStyle(Paint.Style.FILL);
-                canvas.drawText(text, -(textBound.right - textBound.left) / 2, textBound.bottom+dpToPx(6) , mPaint);
-                canvas.restore();
-            } else { //非整点
-                lineWidth = 4;
-                mPaint.setColor(mColorShort);
-                mPaint.setStrokeWidth(dpToPx(0.5f));
-            }
-            canvas.drawLine(0, -mRadius, 0, -mRadius + lineWidth, mPaint);
-            canvas.rotate(6);
-        }
-        canvas.restore();
-    }
-
-    private float dpToPx(float dp) {
-        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics());
-    }
-
-    private float spToPx(float sp) {
-        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, getResources().getDisplayMetrics());
-    }
-}
index 4a8feca..83b83a8 100644 (file)
@@ -41,17 +41,26 @@ public class WidgetTimeImageView extends RelativeLayout {
         mImageView[3] = (ImageView) view.findViewById(R.id.time_minute_bit);
     }
 
-    private void updateTime(ArrayList<Integer> timeRes) {
+    private void updateTime(int hourTen,int hourBit,int minuteTen,int minuteBit) {
 
-        if (timeRes == null || timeRes.size() == 0 || timeRes.size() != oldTimeArray.length) {
-            return;
+        if(hourTen != oldTimeArray[0]){
+            mImageView[0].setImageResource(hourTen);
+            oldTimeArray[0]=hourTen;
         }
 
-        for (int i = 0; i < timeRes.size(); i++) {
-            if (oldTimeArray[i] != timeRes.get(i)) {
-                mImageView[i].setImageResource(timeRes.get(i));
-                oldTimeArray[i] = timeRes.get(i);
-            }
+        if(hourBit != oldTimeArray[1]){
+            mImageView[1].setImageResource(hourBit);
+            oldTimeArray[1]=hourTen;
+        }
+
+        if(minuteTen != oldTimeArray[2]){
+            mImageView[2].setImageResource(minuteTen);
+            oldTimeArray[2]=minuteTen;
+        }
+
+        if(minuteBit != oldTimeArray[3]){
+            mImageView[3].setImageResource(minuteBit);
+            oldTimeArray[3]=minuteBit;
         }
 
         if (!isShowColon) {
@@ -60,10 +69,10 @@ public class WidgetTimeImageView extends RelativeLayout {
         }
     }
 
-    @BindingAdapter(value = {"app:timeImageResId"}, requireAll = false)
-    public static void updateTimeImge(WidgetTimeImageView view, ArrayList<Integer> timeRes) {
+    @BindingAdapter(value = {"app:hourTenResId","app:hourBitResId","app:minuteTenResId","app:minuteBitResId"}, requireAll = false)
+    public static void updateTimeImage(WidgetTimeImageView view, int hourTen,int hourBit,int minuteTen,int minuteBit) {
         if (view != null) {
-            view.updateTime(timeRes);
+            view.updateTime(hourTen,hourBit,minuteTen,minuteBit);
         }
     }
 }
diff --git a/app/src/main/res/layout/activity_select_dial.xml b/app/src/main/res/layout/activity_select_dial.xml
new file mode 100644 (file)
index 0000000..0feb6e2
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/select_dial_content_fl"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".MainActivity" />
\ No newline at end of file
index 9def55e..fe75f5b 100644 (file)
@@ -13,7 +13,7 @@
 
     <androidx.recyclerview.widget.RecyclerView
         android:id="@+id/app_indicator_rv"
-        android:layout_width="wrap_content"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_gravity="bottom|center_horizontal"
         android:overScrollMode="never"
diff --git a/app/src/main/res/layout/fragment_clock_12_dial.xml b/app/src/main/res/layout/fragment_clock_12_dial.xml
new file mode 100644 (file)
index 0000000..4e56df1
--- /dev/null
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    tools:context=".fragment.clock.Clock12DialFragment"
+    android:background="@android:color/transparent">
+
+    <ImageView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:src="@mipmap/clock12_dial"/>
+
+    <com.ic.launcher.widget.ClockDrawableView
+        android:id="@+id/clock_12_drawable_view"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        app:mBackgroundClock="@mipmap/clock12_dial"
+        app:mHourHandClock="@mipmap/clock12_hand_hour"
+        app:mMinuteHandClock="@mipmap/clock12_hand_minute"
+        app:mSecondHandClock="@mipmap/clock12_hand_second"
+        android:background="@android:color/transparent"/>
+
+    <ImageView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:src="@mipmap/clock12_hand_cap"
+        android:layout_gravity="center"/>
+
+</FrameLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_clock_6_dial.xml b/app/src/main/res/layout/fragment_clock_6_dial.xml
new file mode 100644 (file)
index 0000000..8f7fa81
--- /dev/null
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    tools:context=".fragment.clock.Clock6DialFragment">
+
+    <ImageView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:src="@mipmap/clock6_dial"/>
+
+    <com.ic.launcher.widget.ClockDrawableView
+        android:id="@+id/clock_6_drawable_view"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        app:mBackgroundClock="@mipmap/clock6_dial"
+        app:mHourHandClock="@mipmap/clock6_hand_hour"
+        app:mMinuteHandClock="@mipmap/clock6_hand_minute"
+        app:mSecondHandClock="@mipmap/clock6_hand_second"
+        android:background="@android:color/transparent"/>
+
+    <ImageView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:src="@mipmap/clock6_hand_cap"
+        android:layout_gravity="center"/>
+
+</FrameLayout>
\ No newline at end of file
index c5857e7..ba6d674 100644 (file)
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:context=".fragment.L02MainFragment"
-    android:orientation="vertical">
-
-    <fragment
-        android:id="@+id/l02_status_fl"
-        android:name="com.ic.launcher.fragment.l02.L02StatusBarFragment"
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/status_bar_height_dm"
-        android:layout_marginTop="10dp"/>
+    tools:context=".fragment.l02.L02StatusBarFragment">
+
+    <data>
+
+        <variable
+            name="phoneSignal"
+            type="int" />
+
+        <variable
+            name="phoneNetType"
+            type="int" />
+
+        <variable
+            name="phoneTransport"
+            type="int" />
+
+        <variable
+            name="batteryDrawable"
+            type="int" />
+
+        <variable
+            name="batteryValue"
+            type="String" />
+
+        <variable
+            name="batteryCharge"
+            type="boolean" />
+
+        <variable
+            name="hourTen"
+            type="int" />
+
+        <variable
+            name="hourBit"
+            type="int" />
+
+        <variable
+            name="minuteTen"
+            type="int" />
+
+        <variable
+            name="minuteBit"
+            type="int" />
+
+        <variable
+            name="watchDate"
+            type="String" />
+
+        <variable
+            name="watchWeek"
+            type="String" />
 
-    <fragment
-        android:id="@+id/l02_watch_fl"
-        android:name="com.ic.launcher.fragment.l02.L02WatchFragment"
+        <variable
+            name="heartValue"
+            type="String" />
+
+        <variable
+            name="stepValue"
+            type="String" />
+    </data>
+
+    <RelativeLayout
         android:layout_width="match_parent"
-        android:layout_height="match_parent" />
+        android:layout_height="match_parent">
+
+        <RelativeLayout
+            android:id="@+id/main_status"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/status_bar_height_dm"
+            android:layout_marginTop="10dp">
+
+            <com.ic.launcher.widget.WidgetPhoneStateView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="10dp"
+                app:netTypeDrawable="@{phoneNetType}"
+                app:signalDrawable="@{phoneSignal}"
+                app:transportDrawable="@{phoneTransport}" />
+
+            <com.ic.launcher.widget.WidgetBatteryStateView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignParentEnd="true"
+                android:layout_marginEnd="10dp"
+                app:batteryCharge="@{batteryCharge}"
+                app:batteryDrawable="@{batteryDrawable}"
+                app:batteryValue="@{batteryValue}" />
+        </RelativeLayout>
+
+
+        <com.ic.launcher.widget.WidgetTimeImageView
+            android:id="@+id/l02_time_image"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_below="@id/main_status"
+            android:layout_centerHorizontal="true"
+            android:layout_marginTop="25dp"
+            app:hourBitResId="@{hourBit}"
+            app:hourTenResId="@{hourTen}"
+            app:minuteBitResId="@{minuteBit}"
+            app:minuteTenResId="@{minuteTen}" />
+
+        <View
+            android:id="@+id/l02_time_sp"
+            android:layout_width="1dp"
+            android:layout_height="80dp"
+            android:layout_below="@id/l02_time_image"
+            android:layout_centerHorizontal="true" />
+
+        <TextView
+            android:id="@+id/l02_watch_data"
+            style="@style/watchDateTextStyle"
+            android:layout_below="@id/l02_time_image"
+            android:layout_marginEnd="8dp"
+            android:layout_toStartOf="@id/l02_time_sp"
+            android:text="@{watchDate}" />
+
+        <TextView
+            style="@style/watchDateTextStyle"
+            android:layout_below="@id/l02_time_image"
+            android:layout_marginStart="8dp"
+            android:layout_toEndOf="@id/l02_time_sp"
+            android:text="@{watchWeek}" />
+
+        <ImageView
+            android:id="@+id/l02_heart_img"
+            style="@style/watchDateIconStyle"
+            android:layout_alignParentStart="true"
+            android:layout_marginStart="40dp"
+            android:src="@mipmap/clockl02_heartrate_icon" />
+
+        <TextView
+            android:id="@+id/l02_heart_value"
+            style="@style/watchDateIconTextStyle"
+            android:layout_marginStart="5dp"
+            android:layout_toEndOf="@id/l02_heart_img"
+            android:text="@{heartValue}" />
+
+        <ImageView
+            android:id="@+id/l02_pedometer_img"
+            style="@style/watchDateIconStyle"
+            android:layout_toEndOf="@id/l02_time_sp"
+            android:src="@mipmap/clockl02_pedometer" />
+
+        <TextView
+            android:id="@+id/l02_pedometer_value"
+            style="@style/watchDateIconTextStyle"
+            android:layout_marginStart="2dp"
+            android:layout_toEndOf="@id/l02_pedometer_img"
+            android:text="@{stepValue}" />
+
+    </RelativeLayout>
 
-</LinearLayout>
\ No newline at end of file
+</layout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_l02_status_bar.xml b/app/src/main/res/layout/fragment_l02_status_bar.xml
deleted file mode 100644 (file)
index 2ccb81d..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<layout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    tools:context=".fragment.l02.L02StatusBarFragment">
-
-    <data>
-        <variable
-            name="phoneSignal"
-            type="int" />
-
-        <variable
-            name="phoneNetType"
-            type="int" />
-
-        <variable
-            name="phoneTransport"
-            type="int" />
-
-        <variable
-            name="batteryDrawable"
-            type="int" />
-
-        <variable
-            name="batteryValue"
-            type="String" />
-
-        <variable
-            name="batteryCharge"
-            type="boolean" />
-    </data>
-
-    <androidx.constraintlayout.widget.ConstraintLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent">
-
-
-        <com.ic.launcher.widget.WidgetPhoneStateView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintHorizontal_bias="0.118"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="parent"
-            app:netTypeDrawable="@{phoneNetType}"
-            app:signalDrawable="@{phoneSignal}"
-            app:transportDrawable="@{phoneTransport}" />
-
-        <com.ic.launcher.widget.WidgetBatteryStateView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            app:batteryCharge="@{batteryCharge}"
-            app:batteryDrawable="@{batteryDrawable}"
-            app:batteryValue="@{batteryValue}"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintHorizontal_bias="0.938"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="parent"/>
-
-    </androidx.constraintlayout.widget.ConstraintLayout>
-</layout>
diff --git a/app/src/main/res/layout/fragment_l02_watch.xml b/app/src/main/res/layout/fragment_l02_watch.xml
deleted file mode 100644 (file)
index e71fdca..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<layout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    tools:context=".fragment.l02.L02WatchFragment">
-
-    <data>
-
-        <import type="java.util.ArrayList" />
-
-        <variable
-            name="timeText"
-            type="ArrayList&lt;Integer&gt;" />
-
-        <variable
-            name="watchDate"
-            type="String" />
-
-        <variable
-            name="watchWeek"
-            type="String" />
-
-        <variable
-            name="heartValue"
-            type="String" />
-
-        <variable
-            name="stepValue"
-            type="String" />
-    </data>
-
-    <RelativeLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent">
-
-        <com.ic.launcher.widget.WidgetTimeImageView
-            android:id="@+id/l02_time_image"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_centerHorizontal="true"
-            android:layout_marginTop="25dp"
-            app:timeImageResId="@{timeText}"/>
-
-        <View
-            android:id="@+id/l02_time_sp"
-            android:layout_width="1dp"
-            android:layout_height="80dp"
-            android:layout_below="@id/l02_time_image"
-            android:layout_centerHorizontal="true" />
-
-        <TextView
-            android:id="@+id/l02_watch_data"
-            style="@style/watchDateTextStyle"
-            android:layout_below="@id/l02_time_image"
-            android:layout_marginEnd="8dp"
-            android:layout_toStartOf="@id/l02_time_sp"
-            android:text="@{watchDate}" />
-
-        <TextView
-            style="@style/watchDateTextStyle"
-            android:layout_below="@id/l02_time_image"
-            android:layout_marginStart="8dp"
-            android:layout_toEndOf="@id/l02_time_sp"
-            android:text="@{watchWeek}" />
-
-        <ImageView
-            style="@style/watchDateIconStyle"
-            android:id="@+id/l02_heart_img"
-            android:src="@mipmap/clockl02_heartrate_icon"
-            android:layout_alignParentStart="true"
-            android:layout_marginStart="40dp" />
-
-        <TextView
-            style="@style/watchDateIconTextStyle"
-            android:id="@+id/l02_heart_value"
-            android:text="@{heartValue}"
-            android:layout_marginStart="5dp"
-            android:layout_toEndOf="@id/l02_heart_img" />
-
-        <ImageView
-            style="@style/watchDateIconStyle"
-            android:id="@+id/l02_pedometer_img"
-            android:src="@mipmap/clockl02_pedometer"
-            android:layout_toEndOf="@id/l02_time_sp"/>
-
-        <TextView
-            style="@style/watchDateIconTextStyle"
-            android:id="@+id/l02_pedometer_value"
-            android:layout_marginStart="2dp"
-            android:layout_toEndOf="@id/l02_pedometer_img"
-            android:text="@{stepValue}"/>
-
-    </RelativeLayout>
-</layout>
diff --git a/app/src/main/res/layout/fragment_low_power_mode.xml b/app/src/main/res/layout/fragment_low_power_mode.xml
new file mode 100644 (file)
index 0000000..dce1951
--- /dev/null
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools">
+
+    <data>
+        <variable
+            name="lowPowerValue"
+            type="String" />
+
+        <variable
+            name="callPhone"
+            type="com.ic.launcher.listener.ILowPowerCallPhoneListener" />
+
+    </data>
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@mipmap/qs_background"
+        tools:context=".fragment.LowPowerModeFragment">
+
+        <TextClock
+            android:id="@+id/low_power_time_tv"
+            style="@style/LowPowerTextStyle"
+            android:layout_centerHorizontal="true"
+            android:layout_marginTop="10dp"
+            android:format12Hour="HH:mm"
+            android:includeFontPadding="false"
+            android:textSize="60sp"
+            android:background="@android:color/transparent"/>
+
+        <ImageView
+            android:id="@+id/low_power_battery_iv"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_below="@id/low_power_time_tv"
+            android:layout_centerHorizontal="true"
+            android:src="@mipmap/low_power_battery"
+            android:background="@android:color/transparent"/>
+
+        <TextView
+            android:id="@+id/battery_level"
+            style="@style/LowPowerTextStyle"
+            android:layout_below="@id/low_power_battery_iv"
+            android:layout_centerHorizontal="true"
+            android:textColor="@android:color/holo_red_dark"
+            android:background="@android:color/transparent"
+            android:text="@{lowPowerValue}"/>
+
+        <TextView
+            android:id="@+id/tips"
+            style="@style/LowPowerTextStyle"
+            android:layout_below="@id/battery_level"
+            android:layout_centerHorizontal="true"
+            android:text="@string/low_power_mode"
+            android:textColor="#FFAE12"
+            android:background="@android:color/transparent"/>
+
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true"
+            android:layout_centerHorizontal="true"
+            android:layout_marginBottom="20dp"
+            android:src="@mipmap/low_power_dial"
+            android:background="@android:color/transparent"
+            android:onClick="@{()->callPhone.onCallPhone()}"/>
+    </RelativeLayout>
+</layout>
+
diff --git a/app/src/main/res/layout/fragment_select_clock_dial.xml b/app/src/main/res/layout/fragment_select_clock_dial.xml
new file mode 100644 (file)
index 0000000..bafa4d4
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.viewpager2.widget.ViewPager2 xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/select_clock_page"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#000000"
+    tools:context=".fragment.SelectClockDialFragment"/>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_watch_preview.xml b/app/src/main/res/layout/item_watch_preview.xml
new file mode 100644 (file)
index 0000000..3910c06
--- /dev/null
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <data>
+
+        <variable
+            name="entity"
+            type="com.ic.launcher.entity.ClockDialEntity" />
+
+        <variable
+            name="previewDrawable"
+            type="android.graphics.drawable.Drawable" />
+
+        <variable
+            name="onClick"
+            type="com.ic.launcher.listener.ISelectDialListener" />
+    </data>
+
+    <ImageView
+        android:id="@+id/preview_iv"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_gravity="center"
+        android:src="@{previewDrawable}"
+        android:onClick="@{()-> onClick.onSelectDial(entity)}"/>
+
+</layout>
diff --git a/app/src/main/res/mipmap-ldpi/clock12_dial_preview.png b/app/src/main/res/mipmap-ldpi/clock12_dial_preview.png
new file mode 100644 (file)
index 0000000..eea0cde
Binary files /dev/null and b/app/src/main/res/mipmap-ldpi/clock12_dial_preview.png differ
diff --git a/app/src/main/res/mipmap-ldpi/clock6_dial_preview.png b/app/src/main/res/mipmap-ldpi/clock6_dial_preview.png
new file mode 100644 (file)
index 0000000..e3da025
Binary files /dev/null and b/app/src/main/res/mipmap-ldpi/clock6_dial_preview.png differ
diff --git a/app/src/main/res/mipmap-ldpi/clockl02_dial_preview.png b/app/src/main/res/mipmap-ldpi/clockl02_dial_preview.png
new file mode 100644 (file)
index 0000000..f70c97a
Binary files /dev/null and b/app/src/main/res/mipmap-ldpi/clockl02_dial_preview.png differ
diff --git a/app/src/main/res/mipmap-mdpi/clock12_dial.png b/app/src/main/res/mipmap-mdpi/clock12_dial.png
new file mode 100644 (file)
index 0000000..482840a
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/clock12_dial.png differ
diff --git a/app/src/main/res/mipmap-mdpi/clock12_hand_cap.png b/app/src/main/res/mipmap-mdpi/clock12_hand_cap.png
new file mode 100644 (file)
index 0000000..c29f1f6
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/clock12_hand_cap.png differ
diff --git a/app/src/main/res/mipmap-mdpi/clock12_hand_hour.png b/app/src/main/res/mipmap-mdpi/clock12_hand_hour.png
new file mode 100644 (file)
index 0000000..1fdfbc8
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/clock12_hand_hour.png differ
diff --git a/app/src/main/res/mipmap-mdpi/clock12_hand_minute.png b/app/src/main/res/mipmap-mdpi/clock12_hand_minute.png
new file mode 100644 (file)
index 0000000..7520b10
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/clock12_hand_minute.png differ
diff --git a/app/src/main/res/mipmap-mdpi/clock12_hand_second.png b/app/src/main/res/mipmap-mdpi/clock12_hand_second.png
new file mode 100644 (file)
index 0000000..5339839
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/clock12_hand_second.png differ
diff --git a/app/src/main/res/mipmap-mdpi/clock6_dial.png b/app/src/main/res/mipmap-mdpi/clock6_dial.png
new file mode 100644 (file)
index 0000000..02d6217
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/clock6_dial.png differ
diff --git a/app/src/main/res/mipmap-mdpi/clock6_hand_cap.png b/app/src/main/res/mipmap-mdpi/clock6_hand_cap.png
new file mode 100644 (file)
index 0000000..a21be4d
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/clock6_hand_cap.png differ
diff --git a/app/src/main/res/mipmap-mdpi/clock6_hand_hour.png b/app/src/main/res/mipmap-mdpi/clock6_hand_hour.png
new file mode 100644 (file)
index 0000000..5843110
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/clock6_hand_hour.png differ
diff --git a/app/src/main/res/mipmap-mdpi/clock6_hand_minute.png b/app/src/main/res/mipmap-mdpi/clock6_hand_minute.png
new file mode 100644 (file)
index 0000000..1de66fa
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/clock6_hand_minute.png differ
diff --git a/app/src/main/res/mipmap-mdpi/clock6_hand_second.png b/app/src/main/res/mipmap-mdpi/clock6_hand_second.png
new file mode 100644 (file)
index 0000000..beb73db
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/clock6_hand_second.png differ
diff --git a/app/src/main/res/mipmap-mdpi/low_power_battery.png b/app/src/main/res/mipmap-mdpi/low_power_battery.png
new file mode 100644 (file)
index 0000000..1bcf586
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/low_power_battery.png differ
diff --git a/app/src/main/res/mipmap-mdpi/low_power_dial.png b/app/src/main/res/mipmap-mdpi/low_power_dial.png
new file mode 100644 (file)
index 0000000..5029f40
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/low_power_dial.png differ
diff --git a/app/src/main/res/mipmap-mdpi/qs_background.png b/app/src/main/res/mipmap-mdpi/qs_background.png
new file mode 100644 (file)
index 0000000..1bc9fbd
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/qs_background.png differ
index a667cf9..a4f7efc 100644 (file)
@@ -1,10 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
-    <declare-styleable name="GalleryRecyclerView">
-        <attr name="helper" format="string">
-            <enum name="LinearSnapHelper" value="0" />
-            <enum name="PagerSnapHelper" value="1" />
-        </attr>
-
+    <declare-styleable name="ClockDrawableView">
+        <attr name="mBackgroundClock" format="reference" />
+        <attr name="mHourHandClock" format="reference" />
+        <attr name="mMinuteHandClock" format="reference" />
+        <attr name="mSecondHandClock" format="reference" />
     </declare-styleable>
 </resources>
\ No newline at end of file
index 5aa14fd..d3c6f5a 100644 (file)
@@ -2,4 +2,7 @@
 <resources>
     
     <dimen name="status_bar_height_dm">48dp</dimen>
+
+    <dimen name="viewpager_next_item_visible">26dp</dimen>
+    <dimen name="viewpager_current_item_horizontal_margin">42dp</dimen>
 </resources>
\ No newline at end of file
index c5d1592..83c99c5 100644 (file)
@@ -15,6 +15,7 @@
     <string name="app_name_short_message">短信</string>
     <string name="app_name_setting">设置</string>
 
+    <string name="low_power_mode">低电量模式</string>
 
     <string name="all_group">所有人</string>
 
index 8d80872..55e31e6 100644 (file)
         <item name="android:includeFontPadding">false</item>
         <item name="android:background">@android:color/transparent</item>
     </style>
+
+    <style name="LowPowerTextStyle">
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:textSize">36sp</item>
+        <item name="android:textColor">#FFFFFF</item>
+        <item name="android:includeFontPadding">false</item>
+    </style>
 </resources>
index faba9c9..66ab9d7 100644 (file)
@@ -1,2 +1,2 @@
-#Wed Mar 25 19:58:58 CST 2020
-VERSION_CODE=22
+#Sun Mar 29 18:27:02 CST 2020
+VERSION_CODE=24