From: kfl_614 Date: Sun, 29 Mar 2020 10:36:39 +0000 (+0800) Subject: 1.添加多表盘选择 X-Git-Url: http://git.snicker.com.cn/Users/apple/Desktop/static/gitweb.css?a=commitdiff_plain;h=e46379d65b5ca6f3b11ef25f6b625446aaf9b5d6;p=launcher4.git 1.添加多表盘选择 2.添加低电量模式 3.优化框架结构。防止在切换Fragment装天异常。 4.修复APP列表指示器的间距 Signed-off-by: kfl_614 --- diff --git a/app/EQC_G5.jks b/app/EQC_G5.jks new file mode 100644 index 0000000..2229d46 Binary files /dev/null and b/app/EQC_G5.jks differ diff --git a/app/build.gradle b/app/build.gradle index 61fd4a8..85f4e93 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -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' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0bb3561..3f4551a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,6 +4,7 @@ package="com.ic.launcher" android:sharedUserId="android.uid.system"> + @@ -18,14 +19,23 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> - + - + + + + + + + + + + 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 index 0000000..ed9a272 --- /dev/null +++ b/app/src/main/java/com/ic/launcher/FragmentManage.java @@ -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 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(); + } +} diff --git a/app/src/main/java/com/ic/launcher/IcLauncherApplication.java b/app/src/main/java/com/ic/launcher/IcLauncherApplication.java index 6a3005c..169218f 100644 --- a/app/src/main/java/com/ic/launcher/IcLauncherApplication.java +++ b/app/src/main/java/com/ic/launcher/IcLauncherApplication.java @@ -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); } } diff --git a/app/src/main/java/com/ic/launcher/MainActivity.java b/app/src/main/java/com/ic/launcher/MainActivity.java index 6d52e7f..7a8ab87 100644 --- a/app/src/main/java/com/ic/launcher/MainActivity.java +++ b/app/src/main/java/com/ic/launcher/MainActivity.java @@ -1,146 +1,140 @@ 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 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 index 0000000..bb99324 --- /dev/null +++ b/app/src/main/java/com/ic/launcher/SelectDialActivity.java @@ -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 index 0000000..d119bae --- /dev/null +++ b/app/src/main/java/com/ic/launcher/adapter/WatchPreviewAdapter.java @@ -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 { + + 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(); + } + } + } + +} diff --git a/app/src/main/java/com/ic/launcher/configure/l02/L02AppInfo.java b/app/src/main/java/com/ic/launcher/configure/l02/L02AppInfo.java index c1133fa..5c61d11 100644 --- a/app/src/main/java/com/ic/launcher/configure/l02/L02AppInfo.java +++ b/app/src/main/java/com/ic/launcher/configure/l02/L02AppInfo.java @@ -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 mL02DefaultAppList = new ArrayList() { { //联系人 diff --git a/app/src/main/java/com/ic/launcher/configure/l02/L02Icon.java b/app/src/main/java/com/ic/launcher/configure/l02/L02Icon.java index ba58d9e..404945b 100644 --- a/app/src/main/java/com/ic/launcher/configure/l02/L02Icon.java +++ b/app/src/main/java/com/ic/launcher/configure/l02/L02Icon.java @@ -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 index 0000000..1b8eb2c --- /dev/null +++ b/app/src/main/java/com/ic/launcher/entity/ClockDialEntity.java @@ -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; + } +} diff --git a/app/src/main/java/com/ic/launcher/fragment/AppListFragment.java b/app/src/main/java/com/ic/launcher/fragment/AppListFragment.java index 904b576..f5fa09c 100644 --- a/app/src/main/java/com/ic/launcher/fragment/AppListFragment.java +++ b/app/src/main/java/com/ic/launcher/fragment/AppListFragment.java @@ -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 index 0000000..6c540e5 --- /dev/null +++ b/app/src/main/java/com/ic/launcher/fragment/BaseFragment.java @@ -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; + }); + } +} diff --git a/app/src/main/java/com/ic/launcher/fragment/L02MainFragment.java b/app/src/main/java/com/ic/launcher/fragment/L02MainFragment.java index 503d562..acd042a 100644 --- a/app/src/main/java/com/ic/launcher/fragment/L02MainFragment.java +++ b/app/src/main/java/com/ic/launcher/fragment/L02MainFragment.java @@ -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 index 0000000..68eac0c --- /dev/null +++ b/app/src/main/java/com/ic/launcher/fragment/LowPowerModeFragment.java @@ -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 index 0000000..ac94030 --- /dev/null +++ b/app/src/main/java/com/ic/launcher/fragment/SelectClockDialFragment.java @@ -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 index 0000000..4e49fb0 --- /dev/null +++ b/app/src/main/java/com/ic/launcher/fragment/clock/Clock12DialFragment.java @@ -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 index 0000000..54e0af4 --- /dev/null +++ b/app/src/main/java/com/ic/launcher/fragment/clock/Clock6DialFragment.java @@ -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 index 63bc6da..0000000 --- a/app/src/main/java/com/ic/launcher/fragment/l02/L02StatusBarFragment.java +++ /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 index d2099d1..0000000 --- a/app/src/main/java/com/ic/launcher/fragment/l02/L02WatchFragment.java +++ /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 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 index 0000000..a580a96 --- /dev/null +++ b/app/src/main/java/com/ic/launcher/listener/ILowPowerCallPhoneListener.java @@ -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 index 0000000..2e9f7ad --- /dev/null +++ b/app/src/main/java/com/ic/launcher/listener/ILowPowerStateListener.java @@ -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 index 0000000..ac5816b --- /dev/null +++ b/app/src/main/java/com/ic/launcher/listener/ISelectDialListener.java @@ -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 index 0000000..d914cac --- /dev/null +++ b/app/src/main/java/com/ic/launcher/mode/AnalogColorModel.java @@ -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 create(@NonNull Class modelClass) { + return (T) new AnalogColorModel(mApplication); + } + } + + public LiveData getObservableHourList() { + PresenterCycle state = getPresenterList(TIME_LIST_INDEX); + if(state != null){ + return ((TimeDatePresenter)state).getObsHourList(); + } + return null; + } +} diff --git a/app/src/main/java/com/ic/launcher/mode/AppListModel.java b/app/src/main/java/com/ic/launcher/mode/AppModel.java similarity index 51% rename from app/src/main/java/com/ic/launcher/mode/AppListModel.java rename to app/src/main/java/com/ic/launcher/mode/AppModel.java index f5e4d14..c7230f5 100644 --- a/app/src/main/java/com/ic/launcher/mode/AppListModel.java +++ b/app/src/main/java/com/ic/launcher/mode/AppModel.java @@ -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> mObsAppInfoList; - private final LiveData mObsAppState; - private final LiveData 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> getObsAppInfoList() { - return mObsAppInfoList; + public void updateAppInfoList() { + if (appListPresenter != null) { + appListPresenter.updateSystemApp(); + } + } - public LiveData getObsAppState() { - return mObsAppState; + public void onStartAppActivity(int pos) { + if (appListPresenter != null) { + appListPresenter.startAppActivity(pos); + } + } - public LiveData getObsActivityError() { - return mObsActivityError; + public LiveData> getObservableAppList() { + if (appListPresenter != null) { + return appListPresenter.getObsAppInfoList(); + } + + return null; } - public void updateAppInfoList() { - appListPresenter.updateSystemApp(); + public LiveData getObservableAppState() { + if (appListPresenter != null) { + return appListPresenter.getObsAppState(); + } + return null; } - public void onStartAppActivity(int pos) { - appListPresenter.startAppActivity(pos); + public LiveData 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 create(@NonNull Class 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 index 0000000..8a56e99 --- /dev/null +++ b/app/src/main/java/com/ic/launcher/mode/BaseModel.java @@ -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 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 getObservableLowPower() { + PresenterCycle state = getPresenterList(BATTERY_LIST_INDEX); + if(state != null){ + return ((BatteryPresenter)state).getObsLowPower(); + } + return null; + } +} diff --git a/app/src/main/java/com/ic/launcher/mode/L02MainModel.java b/app/src/main/java/com/ic/launcher/mode/L02MainModel.java index c5534ab..dfb623b 100644 --- a/app/src/main/java/com/ic/launcher/mode/L02MainModel.java +++ b/app/src/main/java/com/ic/launcher/mode/L02MainModel.java @@ -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 mObsPhoneTypeID; - private final LiveData mObsPhoneSignalID; - private final LiveData mObsPhoneTransportID; - - private final LiveData mObsBatteryValue; - private final LiveData mObsBatteryCharging; - private final LiveData mObsBatteryResID; - - private final LiveData> mObsTime; - private final LiveData mObsYear; - private final LiveData mObsWeek; - - private final LiveData mObsHardwareHeart; - private final LiveData 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 getObsPhoneTypeID() { - return mObsPhoneTypeID; + public LiveData getObservablePhoneType() { + PresenterCycle state = getPresenterList(PHONE_LIST_INDEX); + if(state != null){ + return ((PhoneStatePresenter)state).getPhoneTypeObservable(); + } + return null; } - public LiveData getObsPhoneSignalID() { - return mObsPhoneSignalID; + public LiveData getObservableSignal() { + PresenterCycle state = getPresenterList(PHONE_LIST_INDEX); + if(state != null){ + return ((PhoneStatePresenter)state).getPhoneSignalObservable(); + } + return null; } - public LiveData getObsPhoneTransportID() { - return mObsPhoneTransportID; + public LiveData getObservableTransport() { + PresenterCycle state = getPresenterList(PHONE_LIST_INDEX); + if(state != null){ + return ((PhoneStatePresenter)state).getPhoneTransportObservable(); + } + return null; } - public LiveData getObsBatteryValue() { - return mObsBatteryValue; + public LiveData getObservableBattery() { + PresenterCycle state = getPresenterList(BATTERY_LIST_INDEX); + if(state != null){ + return ((BatteryPresenter)state).getObsBatteryResID(); + } + return null; } - public LiveData getObsBatteryCharging() { - return mObsBatteryCharging; + public LiveData getObservableBatteryCharging() { + PresenterCycle state = getPresenterList(BATTERY_LIST_INDEX); + if(state != null){ + return ((BatteryPresenter)state).getObsBatteryCharging(); + } + return null; } - public LiveData getObsBatteryResID() { - return mObsBatteryResID; + public LiveData getObservableBatteryValue() { + PresenterCycle state = getPresenterList(BATTERY_LIST_INDEX); + if(state != null){ + return ((BatteryPresenter)state).getObsBatteryValue(); + } + return null; } - public LiveData> getObsTime() { - return mObsTime; + public LiveData getObservableHardwareHeart() { + PresenterCycle state = getPresenterList(HARDWARE_LIST_INDEX); + if(state != null){ + return ((HardwarePresenter)state).getObsHardwareHeart(); + } + return null; } - public LiveData getObsYear() { - return mObsYear; + public LiveData getObservableHardwarePed() { + PresenterCycle state = getPresenterList(HARDWARE_LIST_INDEX); + if(state != null){ + return ((HardwarePresenter)state).getObsHardwarePed(); + } + return null; } - public LiveData getObsWeek() { - return mObsWeek; + public LiveData getObservableWeek() { + PresenterCycle state = getPresenterList(TIME_LIST_INDEX); + if(state != null){ + return ((TimeDatePresenter)state).getObsWeek(); + } + return null; } - public LiveData getObsHardwareHeart() { - return mObsHardwareHeart; + public LiveData getObservableYear() { + PresenterCycle state = getPresenterList(TIME_LIST_INDEX); + if(state != null){ + return ((TimeDatePresenter)state).getObsYear(); + } + return null; } - public LiveData getObsHardwarePed() { - return mObsHardwarePed; + public LiveData 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 index 0000000..6002e43 --- /dev/null +++ b/app/src/main/java/com/ic/launcher/mode/LowPowerModel.java @@ -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 getObservableLowPowerValue() { + if (batteryPresenter != null) { + return batteryPresenter.getObsLowPowerValue(); + } + return null; + } + + public LiveData 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 create(@NonNull Class modelClass) { + return (T) new LowPowerModel(mApplication); + } + } +} diff --git a/app/src/main/java/com/ic/launcher/presenter/AppListPresenter.java b/app/src/main/java/com/ic/launcher/presenter/AppListPresenter.java index bdc912c..93a152a 100644 --- a/app/src/main/java/com/ic/launcher/presenter/AppListPresenter.java +++ b/app/src/main/java/com/ic/launcher/presenter/AppListPresenter.java @@ -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> mObsAppInfoList; @@ -24,6 +24,7 @@ public class AppListPresenter { private String mErrorInfo; + public AppListPresenter(Context context) { this.context = context; mObsAppInfoList = new MutableLiveData<>(); diff --git a/app/src/main/java/com/ic/launcher/presenter/BatteryPresenter.java b/app/src/main/java/com/ic/launcher/presenter/BatteryPresenter.java index 4d16b68..23cbc09 100644 --- a/app/src/main/java/com/ic/launcher/presenter/BatteryPresenter.java +++ b/app/src/main/java/com/ic/launcher/presenter/BatteryPresenter.java @@ -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 mObsBatteryValue; private MediatorLiveData mObsBatteryCharging; private MediatorLiveData mObsBatteryResID; + private MediatorLiveData mObsLowPower; + private MediatorLiveData mObsLowPowerValue; public MediatorLiveData getObsBatteryValue() { return mObsBatteryValue; @@ -33,6 +42,28 @@ public class BatteryPresenter { return mObsBatteryResID; } + public MediatorLiveData getObsLowPower() { + return mObsLowPower; + } + + public MediatorLiveData 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); + } + } } diff --git a/app/src/main/java/com/ic/launcher/presenter/HardwarePresenter.java b/app/src/main/java/com/ic/launcher/presenter/HardwarePresenter.java index d1441b0..148ae14 100644 --- a/app/src/main/java/com/ic/launcher/presenter/HardwarePresenter.java +++ b/app/src/main/java/com/ic/launcher/presenter/HardwarePresenter.java @@ -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 mObsHardwareHeart; private MediatorLiveData 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 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) { diff --git a/app/src/main/java/com/ic/launcher/presenter/PhoneStatePresenter.java b/app/src/main/java/com/ic/launcher/presenter/PhoneStatePresenter.java index 8d854d7..896ffba 100644 --- a/app/src/main/java/com/ic/launcher/presenter/PhoneStatePresenter.java +++ b/app/src/main/java/com/ic/launcher/presenter/PhoneStatePresenter.java @@ -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 mObsPhoneTypeID; private MediatorLiveData mObsPhoneSignalID; - public PhoneStatePresenter(Context context) { - mObsPhoneTypeID = new MediatorLiveData<>(); - mObsPhoneSignalID = new MediatorLiveData<>(); - mObsPhoneTransportID = new MediatorLiveData<>(); - - queryState = new QueryPhoneState(context,mObsPhoneTypeID,mObsPhoneSignalID,mObsPhoneTransportID); - } - - public LiveData getPhoneTypeObservable() { - return mObsPhoneTypeID; - } - - public LiveData getPhoneSignalObservable() { - return mObsPhoneSignalID; - } - - public LiveData 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 getPhoneTypeObservable() { + return mObsPhoneTypeID; + } + + public LiveData getPhoneSignalObservable() { + return mObsPhoneSignalID; + } + + public LiveData 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 index 0000000..89cec58 --- /dev/null +++ b/app/src/main/java/com/ic/launcher/presenter/PresenterCycle.java @@ -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() { + } +} diff --git a/app/src/main/java/com/ic/launcher/presenter/QueryPhoneState.java b/app/src/main/java/com/ic/launcher/presenter/QueryPhoneState.java index c5e8320..00d96c3 100644 --- a/app/src/main/java/com/ic/launcher/presenter/QueryPhoneState.java +++ b/app/src/main/java/com/ic/launcher/presenter/QueryPhoneState.java @@ -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]); diff --git a/app/src/main/java/com/ic/launcher/presenter/QueryThread.java b/app/src/main/java/com/ic/launcher/presenter/QueryThread.java index 922dd9b..a90b73a 100644 --- a/app/src/main/java/com/ic/launcher/presenter/QueryThread.java +++ b/app/src/main/java/com/ic/launcher/presenter/QueryThread.java @@ -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(); diff --git a/app/src/main/java/com/ic/launcher/presenter/TimeDatePresenter.java b/app/src/main/java/com/ic/launcher/presenter/TimeDatePresenter.java index f44de06..0d3abd6 100644 --- a/app/src/main/java/com/ic/launcher/presenter/TimeDatePresenter.java +++ b/app/src/main/java/com/ic/launcher/presenter/TimeDatePresenter.java @@ -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> mObsTime; + private MediatorLiveData mObsTime; private MediatorLiveData mObsYear; private MediatorLiveData mObsWeek; + private MediatorLiveData mObsHourList; private Context mContext; - private Calendar mTime; - private boolean mShouldRunTicker = false; - private ArrayList 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> getObsTime() { + public MediatorLiveData getObsTime() { return mObsTime; } @@ -57,18 +114,14 @@ public class TimeDatePresenter { return mObsYear; } - public MediatorLiveData getmObsWeek() { + public MediatorLiveData getObsWeek() { return mObsWeek; } - public void onResumePresenter() { - onTimeChanged(); - mShouldRunTicker = true; + public MediatorLiveData 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 reference; + + public SecondMessage(TimeDatePresenter ref) { + this.reference = new WeakReference(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); + } + } } } diff --git a/app/src/main/java/com/ic/launcher/util/SPUtils.java b/app/src/main/java/com/ic/launcher/util/SPUtils.java index 9cae414..22b92f7 100644 --- a/app/src/main/java/com/ic/launcher/util/SPUtils.java +++ b/app/src/main/java/com/ic/launcher/util/SPUtils.java @@ -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 index 0000000..66d3ba2 --- /dev/null +++ b/app/src/main/java/com/ic/launcher/widget/ClockDrawableView.java @@ -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 index bd8e8b6..0000000 --- a/app/src/main/java/com/ic/launcher/widget/ClockWatchView.java +++ /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()); - } -} diff --git a/app/src/main/java/com/ic/launcher/widget/WidgetTimeImageView.java b/app/src/main/java/com/ic/launcher/widget/WidgetTimeImageView.java index 4a8feca..83b83a8 100644 --- a/app/src/main/java/com/ic/launcher/widget/WidgetTimeImageView.java +++ b/app/src/main/java/com/ic/launcher/widget/WidgetTimeImageView.java @@ -41,17 +41,26 @@ public class WidgetTimeImageView extends RelativeLayout { mImageView[3] = (ImageView) view.findViewById(R.id.time_minute_bit); } - private void updateTime(ArrayList 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 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 index 0000000..0feb6e2 --- /dev/null +++ b/app/src/main/res/layout/activity_select_dial.xml @@ -0,0 +1,8 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_app_list.xml b/app/src/main/res/layout/fragment_app_list.xml index 9def55e..fe75f5b 100644 --- a/app/src/main/res/layout/fragment_app_list.xml +++ b/app/src/main/res/layout/fragment_app_list.xml @@ -13,7 +13,7 @@ + + + + + + + + + \ 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 index 0000000..8f7fa81 --- /dev/null +++ b/app/src/main/res/layout/fragment_clock_6_dial.xml @@ -0,0 +1,30 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_l02_main.xml b/app/src/main/res/layout/fragment_l02_main.xml index c5857e7..ba6d674 100644 --- a/app/src/main/res/layout/fragment_l02_main.xml +++ b/app/src/main/res/layout/fragment_l02_main.xml @@ -1,22 +1,159 @@ - - - + tools:context=".fragment.l02.L02StatusBarFragment"> + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + android:layout_height="match_parent"> + + + + + + + + + + + + + + + + + + + + + + + + + + - \ No newline at end of file + \ 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 index 2ccb81d..0000000 --- a/app/src/main/res/layout/fragment_l02_status_bar.xml +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 index e71fdca..0000000 --- a/app/src/main/res/layout/fragment_l02_watch.xml +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 index 0000000..dce1951 --- /dev/null +++ b/app/src/main/res/layout/fragment_low_power_mode.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 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 index 0000000..bafa4d4 --- /dev/null +++ b/app/src/main/res/layout/fragment_select_clock_dial.xml @@ -0,0 +1,9 @@ + + \ 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 index 0000000..3910c06 --- /dev/null +++ b/app/src/main/res/layout/item_watch_preview.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 index 0000000..1bc9fbd Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/qs_background.png differ diff --git a/app/src/main/res/values/attr.xml b/app/src/main/res/values/attr.xml index a667cf9..a4f7efc 100644 --- a/app/src/main/res/values/attr.xml +++ b/app/src/main/res/values/attr.xml @@ -1,10 +1,9 @@ - - - - - - + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 5aa14fd..d3c6f5a 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -2,4 +2,7 @@ 48dp + + 26dp + 42dp \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c5d1592..83c99c5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -15,6 +15,7 @@ 短信 设置 + 低电量模式 所有人 diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 8d80872..55e31e6 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -59,4 +59,12 @@ false @android:color/transparent + + diff --git a/app/version_code.properties b/app/version_code.properties index faba9c9..66ab9d7 100644 --- a/app/version_code.properties +++ b/app/version_code.properties @@ -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