//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'
}
package="com.ic.launcher"
android:sharedUserId="android.uid.system">
+ <uses-permission android:name="android.permission.SHUTDOWN" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
- <activity android:name=".QrCodeActivity">
+ <activity android:name=".SelectDialActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.VIEW" />
- <category android:name="android.intent.category.LAUNCHER"/>
+
+ <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
+ <activity android:name=".QrCodeActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <action android:name="android.intent.action.VIEW" />
+
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
<activity android:name=".MainActivity">
<intent-filter>
--- /dev/null
+package com.ic.launcher;
+
+import android.content.Context;
+import android.util.SparseArray;
+
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentTransaction;
+
+import com.ic.launcher.fragment.AppListFragment;
+import com.ic.launcher.fragment.L02MainFragment;
+import com.ic.launcher.fragment.LowPowerModeFragment;
+import com.ic.launcher.fragment.clock.Clock12DialFragment;
+import com.ic.launcher.fragment.clock.Clock6DialFragment;
+import com.ic.launcher.mode.L02MainModel;
+import com.ic.launcher.util.SPUtils;
+
+import static com.ic.launcher.configure.l02.L02Icon.CLOCK_INDEX_12;
+import static com.ic.launcher.configure.l02.L02Icon.CLOCK_INDEX_6;
+import static com.ic.launcher.configure.l02.L02Icon.CLOCK_INDEX_L02;
+
+public class FragmentManage {
+
+ private Context mContext;
+
+ private final static int MAIN_FRAGMENT_INDEX = 0;
+ private final static int APP_FRAGMENT_INDEX = 1;
+ private final static int LOW_FRAGMENT_INDEX = 2;
+
+ private SparseArray<Fragment> mAddFt;
+
+ private FragmentManager ftManager;
+
+ FragmentManage(Context context, FragmentManager ftManager) {
+ this.ftManager = ftManager;
+ mAddFt = new SparseArray<>();
+ this.mContext = context;
+ }
+
+ /**
+ * 去Sp中取值,没有 默认为 {@link L02MainFragment} 数字表盘
+ * 可能的值为 {@link Clock6DialFragment} 或者 {@link Clock12DialFragment} 模拟表盘
+ */
+
+ void showCurrMainFragment(boolean finish) {
+ Fragment fragment = getFragmentList(MAIN_FRAGMENT_INDEX);
+ if (fragment == null) {
+ fragment = getCurrMainFragment();
+ addFragmentList(MAIN_FRAGMENT_INDEX, fragment);
+ }
+ addOrShowFragment(finish, fragment);
+ }
+
+ void showAppFragment(boolean finish, int flag) {
+ Fragment fragment = getFragmentList(APP_FRAGMENT_INDEX);
+ if (fragment == null) {
+ fragment = AppListFragment.newInstance(flag);
+ addFragmentList(APP_FRAGMENT_INDEX, fragment);
+ } else {
+ ((AppListFragment) fragment).setMoveEndItem(flag != 1);
+ }
+ addOrShowFragment(finish, fragment);
+ }
+
+ void changeMainClock(boolean finish) {
+ Fragment fragment = getCurrMainFragment();
+ Fragment oldFt = getFragmentList(MAIN_FRAGMENT_INDEX);
+ if ((fragment instanceof L02MainFragment && oldFt instanceof L02MainFragment)
+ || (fragment instanceof Clock6DialFragment && oldFt instanceof Clock6DialFragment)
+ || (fragment instanceof Clock12DialFragment && oldFt instanceof Clock12DialFragment)) {
+ return;
+ }
+
+ replaceMainFragment(finish, fragment);
+ }
+
+ boolean onBackFragment(boolean finish) {
+ if (mAddFt.get(0).isVisible()) {
+ return true;
+ }
+
+ if (mAddFt.get(1).isVisible()) {
+ showCurrMainFragment(finish);
+ return true;
+ }
+
+ return false;
+ }
+
+ void gotoLowPowerMode(boolean finish) {
+
+ Fragment fragment = getFragmentList(LOW_FRAGMENT_INDEX);
+
+ //如果不为空,表示已经处理低电量模式
+ if (fragment != null) {
+ return;
+ }
+
+ fragment = LowPowerModeFragment.newInstance();
+
+
+ replaceLowFragment(finish, fragment);
+ }
+
+ void quitLowPowerMode(boolean finish) {
+
+ Fragment fragment = getFragmentList(LOW_FRAGMENT_INDEX);
+ //如果为空,表示已经不在低电量模式
+ if (fragment == null) {
+ return;
+ }
+
+ Fragment mainFt = getCurrMainFragment();
+
+ replaceMainFragment(finish, mainFt);
+ }
+
+
+ private Fragment getCurrMainFragment() {
+ int main = SPUtils.getClockDialSP(mContext);
+ switch (main) {
+ case CLOCK_INDEX_6:
+ return Clock6DialFragment.newInstance();
+ case CLOCK_INDEX_12:
+ return Clock12DialFragment.newInstance();
+ default:
+ return L02MainFragment.newInstance();
+ }
+ }
+
+ private Fragment getFragmentList(int index) {
+ return mAddFt.get(index);
+ }
+
+ private void addFragmentList(int index, Fragment fragment) {
+ mAddFt.put(index, fragment);
+ }
+
+
+ private void replaceMainFragment(boolean finish, Fragment fragment) {
+ if (finish || fragment == null) {
+ return;
+ }
+
+ FragmentTransaction ft = ftManager.beginTransaction();
+ Fragment dd = mAddFt.get(MAIN_FRAGMENT_INDEX);
+ if(dd != null){
+ ft.remove(mAddFt.get(MAIN_FRAGMENT_INDEX));
+ mAddFt.remove(MAIN_FRAGMENT_INDEX);
+ }
+
+ addFragmentList(MAIN_FRAGMENT_INDEX, fragment);
+
+ ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
+
+ ft.add(R.id.main_content_fl, fragment);
+ ft.commit();
+ }
+
+ private void replaceLowFragment(boolean finish, Fragment fragment) {
+ if (finish || fragment == null) {
+ return;
+ }
+
+ FragmentTransaction ft = ftManager.beginTransaction();
+
+ for (int i = 0; i < mAddFt.size(); i++) {
+ ft.remove(mAddFt.get(i));
+ mAddFt.remove(i);
+ }
+
+ ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
+
+ addFragmentList(LOW_FRAGMENT_INDEX, fragment);
+
+ ft.add(R.id.main_content_fl, fragment);
+ ft.commit();
+ }
+
+ private void addOrShowFragment(boolean finish, Fragment fragment) {
+ if (finish || fragment == null) {
+ return;
+ }
+
+ FragmentTransaction ft = ftManager.beginTransaction();
+
+ for (int i = 0; i < mAddFt.size(); i++) {
+ if (mAddFt.get(i).isAdded()) {
+ ft.hide(mAddFt.get(i));
+ }
+ }
+
+ ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
+
+ if (fragment.isAdded()) {
+ ft.show(fragment);
+ } else {
+ ft.add(R.id.main_content_fl, fragment);
+ }
+
+ ft.commit();
+ }
+}
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);
}
}
package com.ic.launcher;
import androidx.appcompat.app.AppCompatActivity;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentTransaction;
+import android.content.BroadcastReceiver;
+import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.os.Bundle;
-import android.util.SparseArray;
import android.view.KeyEvent;
-import com.ic.launcher.fragment.AppListFragment;
-import com.ic.launcher.fragment.L02MainFragment;
import com.ic.launcher.listener.IChangeMainFragmentListener;
+import com.ic.launcher.listener.ILowPowerStateListener;
import com.ic.launcher.listener.MainClockGestureDetectorImpl;
+import com.ic.launcher.util.IcLog;
import com.ic.launcher.util.ServiceUtil;
import com.ic.launcher.util.SystemUtils;
+
public class MainActivity extends AppCompatActivity implements
MainClockGestureDetectorImpl.OnClockGestureFlingListener,
- IChangeMainFragmentListener {
-
- private static final String SERVICE_PKG_NAME = "com.enqualcomm.support";
-
- private FragmentManager fragmentManager;
+ IChangeMainFragmentListener,
+ ILowPowerStateListener {
- private SparseArray<Fragment> mAddFt;
+ private static final String TAG = "MainActivity";
- private L02MainFragment l02MainFt;
- private AppListFragment appListFt;
+ private static final String SERVICE_PKG_NAME = "com.enqualcomm.support";
+ private boolean isLowPower = false;
+ private FragmentManage ftManage;
+ private boolean isChangeClock=false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
- mAddFt = new SparseArray<>();
- fragmentManager = getSupportFragmentManager();
-
- l02MainFt = L02MainFragment.newInstance();
+ ftManage = new FragmentManage(this,getSupportFragmentManager());
+ ftManage.showCurrMainFragment(isFinishing());
- commitFragment(l02MainFt);
+ registerChangeClockReceiver();
ServiceUtil.startServiceUtil(getApplicationContext(),
- "com.ic.action.WORK_SERVICE", getPackageName());
+ "com.ic.action.WORK_SERVICE", getPackageName());
}
@Override
- public void onDouble() {
- try {
- String cid = SystemUtils.GetCidFromSystem();
- if (cid.startsWith("TESTPROTOCOL")) {
- try {
- // 协议测试
- Intent intent = getPackageManager().getLaunchIntentForPackage(SERVICE_PKG_NAME);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
- startActivity(intent);
- } catch (Exception ignored) {
- }
- }
- } catch (Exception ignored) {
+ protected void onResume() {
+ super.onResume();
+ if(isChangeClock){
+ ftManage.changeMainClock(isFinishing());
+ isChangeClock=false;
}
}
@Override
- public void onDirection(int flag) {
- switch (flag) {
- case 1:
- //左滑
- if (appListFt == null) {
- appListFt = AppListFragment.newInstance(1);
- } else {
- appListFt.setMoveEndItem(false);
- }
- commitFragment(appListFt);
- break;
- case 2:
- //右滑
- if (appListFt == null) {
- appListFt = AppListFragment.newInstance(2);
- } else {
- appListFt.setMoveEndItem(true);
- }
- commitFragment(appListFt);
- break;
- }
+ protected void onDestroy() {
+ super.onDestroy();
+ unRegisterTimeDateReceiver();
}
@Override
- public void onChangeMain() {
- //app列表已滑动到第一个或者第二个,需要切换到主main
- commitFragment(l02MainFt);
+ public void onDouble() {
+ if (isLowPower) return;
+ startTestProtocol();
}
- private void commitFragment(Fragment fragment) {
- if (isFinishing()) {
- return;
- }
-
- FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
-
- for (int i = 0; i < mAddFt.size(); i++) {
- fragmentTransaction.hide(mAddFt.get(i));
- }
+ @Override
+ public void onDirection(int flag) {
+ if (isLowPower) return;
+ ftManage.showAppFragment(isFinishing(), flag);
+ }
- fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
- //fragmentTransaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);
+ @Override
+ public void onChangeMain() {
+ ftManage.showCurrMainFragment(isFinishing());
+ }
- if (fragment.isAdded()) {
- fragmentTransaction.show(fragment);
+ @Override
+ public void onLowChange(boolean state) {
+ if (state) {
+ ftManage.gotoLowPowerMode(isFinishing());
} else {
- putFragmentToArray(fragment);
- fragmentTransaction.add(R.id.main_content_fl, fragment);
+ ftManage.quitLowPowerMode(isFinishing());
}
-
- //fragmentTransaction.commitAllowingStateLoss();
-
- fragmentTransaction.commit();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
// 禁用 KEYCODE_BACK 退出功能
- if (mAddFt.get(0).isVisible()) {
+ if (ftManage.onBackFragment(isFinishing())) {
return true;
}
+ }
+ return super.onKeyDown(keyCode, event);
+ }
- if(mAddFt.get(1).isVisible()){
- commitFragment(l02MainFt);
- return true;
+
+ private void startTestProtocol() {
+ try {
+ String cid = SystemUtils.GetCidFromSystem();
+ if (cid.startsWith("TESTPROTOCOL")) {
+ try {
+ // 协议测试
+ Intent intent = getPackageManager().getLaunchIntentForPackage(SERVICE_PKG_NAME);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ startActivity(intent);
+ } catch (Exception ignored) {
+ }
}
+ } catch (Exception ignored) {
}
- return super.onKeyDown(keyCode, event);
}
- private void putFragmentToArray(Fragment fragment) {
- int flag = 0;
- if (fragment instanceof AppListFragment) {
- flag = 1;
+ private void registerChangeClockReceiver() {
+ IntentFilter filter = new IntentFilter();
+ filter.addAction("com.ic.action.CHANGE_CLOCK");
+ registerReceiver(mIntentReceiver, filter);
+ }
+
+ private void unRegisterTimeDateReceiver() {
+ try {
+ unregisterReceiver(mIntentReceiver);
+ } catch (IllegalArgumentException e) {
+ IcLog.e(TAG, "unRegisterTimeDateReceiver", e);
}
- mAddFt.put(flag, fragment);
}
+
+ private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if ("com.ic.action.CHANGE_CLOCK".equals(action)) {
+ isChangeClock =true;
+ }
+ }
+ };
+
}
--- /dev/null
+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();
+ }
+}
--- /dev/null
+package com.ic.launcher.adapter;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.core.content.ContextCompat;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.ic.launcher.databinding.ItemWatchPreviewBinding;
+import com.ic.launcher.entity.ClockDialEntity;
+import com.ic.launcher.listener.ISelectDialListener;
+
+import static com.ic.launcher.configure.l02.L02Icon.l02ClockDial;
+
+public class WatchPreviewAdapter extends RecyclerView.Adapter<WatchPreviewAdapter.PreviewViewHolder> {
+
+ private Context context;
+ private ISelectDialListener listener;
+
+ public WatchPreviewAdapter(Context context,ISelectDialListener listener){
+ this.context=context;
+ this.listener =listener;
+ }
+
+ @NonNull
+ @Override
+ public PreviewViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ return new PreviewViewHolder(ItemWatchPreviewBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull PreviewViewHolder holder, int position) {
+ holder.bindItem(context,l02ClockDial[position],listener);
+ }
+
+ @Override
+ public int getItemCount() {
+ return l02ClockDial.length;
+ }
+
+ class PreviewViewHolder extends RecyclerView.ViewHolder {
+
+ private ItemWatchPreviewBinding binding = null;
+
+ public PreviewViewHolder(@NonNull ItemWatchPreviewBinding itemView) {
+ super(itemView.getRoot());
+ binding = itemView;
+ }
+
+ public void bindItem(Context context,ClockDialEntity entity,ISelectDialListener listener) {
+ if (binding != null) {
+ binding.setEntity(entity);
+ binding.setOnClick(listener);
+ binding.setPreviewDrawable(ContextCompat.getDrawable(context,entity.getDialPreview()));
+ binding.executePendingBindings();
+ }
+ }
+ }
+
+}
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;
private static final int BACK_COLOUR = Color.parseColor("#000000");
+ /**
+ * 拨号的顺序不能变 在低电量模式下会查找这个列表,然后查找索引为1的拨号,
+ * 如果要修改 请到 {@link LowPowerModeFragment} 中一并修改
+ **/
public static final List<AppInfoEntity> mL02DefaultAppList = new ArrayList<AppInfoEntity>() {
{
//联系人
package com.ic.launcher.configure.l02;
import com.ic.launcher.R;
+import com.ic.launcher.entity.ClockDialEntity;
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),
+ };
}
--- /dev/null
+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;
+ }
+}
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;
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;
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;
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;
@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");
}
}
@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
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());
}
}
- @Override
- public void onPause() {
- super.onPause();
- IcLog.i(TAG, "onPause");
- }
-
public void setMoveEndItem(boolean move) {
if (move) {
mAppRv.scrollToPosition(appAdapter.getAppEndIndex());
}
}
+ 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);
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);
}
}
};
- 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);
}
--- /dev/null
+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;
+ });
+ }
+}
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();
@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]);
+ }
}
--- /dev/null
+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);
+ }
+ }
+ };
+}
--- /dev/null
+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);
+ }
+}
--- /dev/null
+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;
+ }
+
+}
--- /dev/null
+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;
+ }
+
+}
+++ /dev/null
-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);
- }
-}
+++ /dev/null
-package com.ic.launcher.fragment.l02;
-
-
-import android.content.Context;
-import android.os.Bundle;
-
-import androidx.annotation.NonNull;
-import androidx.fragment.app.Fragment;
-
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.ic.launcher.databinding.FragmentL02WatchBinding;
-import com.ic.launcher.util.SPUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class L02WatchFragment extends Fragment {
-
- private static final String TAG = "L02WatchFragment";
-
- private Context mContext;
- private FragmentL02WatchBinding watchBinding;
-
- @Override
- public void onAttach(@NonNull Context context) {
- super.onAttach(context);
- mContext = context;
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater,
- ViewGroup container,
- Bundle savedInstanceState) {
-
- watchBinding = FragmentL02WatchBinding.inflate(inflater, container, false);
- updateHeartValue(String.valueOf(SPUtils.getBloodHeartSP(mContext)));
- updatePedValue("0");
- return watchBinding.getRoot();
- }
-
- @Override
- public void onResume() {
- super.onResume();
- }
-
- @Override
- public void onPause() {
- super.onPause();
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- }
-
- public void updateHeartValue(String value){
- watchBinding.setHeartValue(value);
- }
-
- public void updatePedValue(String value){
- watchBinding.setStepValue(value);
- }
-
- public void updateWeekValue(String value){
- watchBinding.setWatchWeek(value);
- }
-
- public void updateDateValue(String value){
- watchBinding.setWatchDate(value);
- }
-
- public void updateTimeValue(ArrayList<Integer> value){
- watchBinding.setTimeText(value);
- }
-}
--- /dev/null
+package com.ic.launcher.listener;
+
+public interface ILowPowerCallPhoneListener {
+ void onCallPhone();
+}
--- /dev/null
+package com.ic.launcher.listener;
+
+public interface ILowPowerStateListener {
+ void onLowChange(boolean state);
+}
--- /dev/null
+package com.ic.launcher.listener;
+
+import com.ic.launcher.entity.ClockDialEntity;
+
+public interface ISelectDialListener {
+ void onSelectDial(ClockDialEntity entity);
+}
--- /dev/null
+package com.ic.launcher.mode;
+
+import android.app.Application;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.ViewModel;
+import androidx.lifecycle.ViewModelProvider;
+
+import com.ic.launcher.presenter.PresenterCycle;
+import com.ic.launcher.presenter.TimeDatePresenter;
+
+public class AnalogColorModel extends BaseModel{
+
+ AnalogColorModel(@NonNull Application application) {
+ super(application);
+ PresenterCycle state = getPresenterList(TIME_LIST_INDEX);
+ if(state != null){
+ ((TimeDatePresenter)state).setAnalogClock(true);
+ }
+ }
+
+ public static class Factory extends ViewModelProvider.NewInstanceFactory {
+
+ @NonNull
+ private final Application mApplication;
+
+
+ public Factory(@NonNull Application application) {
+ mApplication = application;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ @NonNull
+ public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
+ return (T) new AnalogColorModel(mApplication);
+ }
+ }
+
+ public LiveData<int[]> getObservableHourList() {
+ PresenterCycle state = getPresenterList(TIME_LIST_INDEX);
+ if(state != null){
+ return ((TimeDatePresenter)state).getObsHourList();
+ }
+ return null;
+ }
+}
import java.util.List;
-
-public class AppListModel extends AndroidViewModel {
+public class AppModel extends AndroidViewModel {
private final AppListPresenter appListPresenter;
- private final LiveData<List<AppInfoEntity>> mObsAppInfoList;
- private final LiveData<boolean[]> mObsAppState;
- private final LiveData<String> mObsActivityError;
-
- public AppListModel(@NonNull Application application) {
+ private AppModel(Application application) {
super(application);
- this.appListPresenter = new AppListPresenter(application);
- mObsAppInfoList = appListPresenter.getObsAppInfoList();
+ appListPresenter = new AppListPresenter(application);
- mObsAppState = appListPresenter.getObsAppState();
- mObsActivityError = appListPresenter.getObsActivityError();
}
- public LiveData<List<AppInfoEntity>> getObsAppInfoList() {
- return mObsAppInfoList;
+ public void updateAppInfoList() {
+ if (appListPresenter != null) {
+ appListPresenter.updateSystemApp();
+ }
+
}
- public LiveData<boolean[]> getObsAppState() {
- return mObsAppState;
+ public void onStartAppActivity(int pos) {
+ if (appListPresenter != null) {
+ appListPresenter.startAppActivity(pos);
+ }
+
}
- public LiveData<String> getObsActivityError() {
- return mObsActivityError;
+ public LiveData<List<AppInfoEntity>> getObservableAppList() {
+ if (appListPresenter != null) {
+ return appListPresenter.getObsAppInfoList();
+ }
+
+ return null;
}
- public void updateAppInfoList() {
- appListPresenter.updateSystemApp();
+ public LiveData<boolean[]> getObservableAppState() {
+ if (appListPresenter != null) {
+ return appListPresenter.getObsAppState();
+ }
+ return null;
}
- public void onStartAppActivity(int pos) {
- appListPresenter.startAppActivity(pos);
+ public LiveData<String> getObservableErrorInfo() {
+ if (appListPresenter != null) {
+ return appListPresenter.getObsActivityError();
+ }
+ return null;
}
public static class Factory extends ViewModelProvider.NewInstanceFactory {
@NonNull
private final Application mApplication;
+
public Factory(@NonNull Application application) {
mApplication = application;
}
@Override
@NonNull
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
- return (T) new AppListModel(mApplication);
+ return (T) new AppModel(mApplication);
}
}
}
--- /dev/null
+package com.ic.launcher.mode;
+
+import android.app.Application;
+import android.util.SparseArray;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.AndroidViewModel;
+import androidx.lifecycle.LiveData;
+
+import com.ic.launcher.presenter.BatteryPresenter;
+import com.ic.launcher.presenter.PresenterCycle;
+import com.ic.launcher.presenter.TimeDatePresenter;
+
+public abstract class BaseModel extends AndroidViewModel {
+
+ protected final static int PHONE_LIST_INDEX = 0;
+ protected final static int BATTERY_LIST_INDEX = 1;
+ protected final static int TIME_LIST_INDEX = 2;
+ protected final static int HARDWARE_LIST_INDEX = 3;
+
+ private final SparseArray<PresenterCycle> mPresenter;
+
+ BaseModel(@NonNull Application application) {
+ super(application);
+ mPresenter = new SparseArray<>();
+
+ BatteryPresenter batteryPresenter = new BatteryPresenter(application.getApplicationContext());
+ TimeDatePresenter timeDatePresenter = new TimeDatePresenter(application.getApplicationContext());
+
+ addPresenterList(BATTERY_LIST_INDEX, batteryPresenter);
+ addPresenterList(TIME_LIST_INDEX, timeDatePresenter);
+ }
+
+ PresenterCycle getPresenterList(int index) {
+ return mPresenter.get(index);
+ }
+
+ void addPresenterList(int index, PresenterCycle cycle) {
+ mPresenter.put(index, cycle);
+ }
+
+ public void OnUiCreate() {
+ for (int i = 0; i < mPresenter.size(); i++) {
+ mPresenter.valueAt(i).onPresenterCreate();
+ }
+ }
+
+ public void OnUiResume() {
+ for (int i = 0; i < mPresenter.size(); i++) {
+ mPresenter.valueAt(i).onPresenterResume();
+ }
+ }
+
+ public void OnUiPause() {
+ for (int i = 0; i < mPresenter.size(); i++) {
+ mPresenter.valueAt(i).onPresenterPause();
+ }
+ }
+
+ public void OnUiDestroy() {
+ for (int i = 0; i < mPresenter.size(); i++) {
+ mPresenter.valueAt(i).onPresenterDestroy();
+ }
+ }
+
+ public LiveData<Boolean> getObservableLowPower() {
+ PresenterCycle state = getPresenterList(BATTERY_LIST_INDEX);
+ if(state != null){
+ return ((BatteryPresenter)state).getObsLowPower();
+ }
+ return null;
+ }
+}
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;
import com.ic.launcher.presenter.HardwarePresenter;
import com.ic.launcher.presenter.PhoneStatePresenter;
+import com.ic.launcher.presenter.PresenterCycle;
import com.ic.launcher.presenter.TimeDatePresenter;
-import com.ic.launcher.util.IcLog;
-import java.util.ArrayList;
-public class L02MainModel extends AndroidViewModel {
+public class L02MainModel extends BaseModel {
private static final String TAG = "L02MainModel";
- private final PhoneStatePresenter phonePresenter;
- private final BatteryPresenter batteryPresenter;
- private final TimeDatePresenter timeDatePresenter;
- private final HardwarePresenter hardwarePresenter;
-
- private final LiveData<Integer> mObsPhoneTypeID;
- private final LiveData<Integer> mObsPhoneSignalID;
- private final LiveData<Integer> mObsPhoneTransportID;
-
- private final LiveData<String> mObsBatteryValue;
- private final LiveData<Boolean> mObsBatteryCharging;
- private final LiveData<Integer> mObsBatteryResID;
-
- private final LiveData<ArrayList<Integer>> mObsTime;
- private final LiveData<String> mObsYear;
- private final LiveData<String> mObsWeek;
-
- private final LiveData<String> mObsHardwareHeart;
- private final LiveData<String> mObsHardwarePed;
-
- public L02MainModel(@NonNull Application application) {
+ private L02MainModel(Application application) {
super(application);
- this.phonePresenter = new PhoneStatePresenter(application.getApplicationContext());
- this.batteryPresenter = new BatteryPresenter(application.getApplicationContext());
- this.timeDatePresenter = new TimeDatePresenter(application.getApplicationContext());
- this.hardwarePresenter = new HardwarePresenter(application.getApplicationContext());
-
- mObsPhoneSignalID = phonePresenter.getPhoneSignalObservable();
- mObsPhoneTypeID = phonePresenter.getPhoneTypeObservable();
- mObsPhoneTransportID = phonePresenter.getPhoneTransportObservable();
-
- mObsBatteryCharging = batteryPresenter.getObsBatteryCharging();
- mObsBatteryResID = batteryPresenter.getObsBatteryResID();
- mObsBatteryValue = batteryPresenter.getObsBatteryValue();
+ PhoneStatePresenter phonePresenter = new PhoneStatePresenter(application.getApplicationContext());
+ HardwarePresenter hardwarePresenter = new HardwarePresenter(application.getApplicationContext());
- mObsTime = timeDatePresenter.getObsTime();
- mObsYear = timeDatePresenter.getObsYear();
- mObsWeek = timeDatePresenter.getmObsWeek();
-
- mObsHardwareHeart = hardwarePresenter.getObsHardwareHeart();
- mObsHardwarePed = hardwarePresenter.getObsHardwarePed();
- }
-
- public void onFragmentCreate(){
- IcLog.i(TAG,"onFragmentCreate");
- }
-
- public void onFragmentResume(){
- IcLog.i(TAG,"onFragmentResume");
- hardwarePresenter.sendGetPedBroadcast();
- timeDatePresenter.onResumePresenter();
- phonePresenter.onResumePresenter();
- }
+ addPresenterList(PHONE_LIST_INDEX,phonePresenter);
+ addPresenterList(HARDWARE_LIST_INDEX,hardwarePresenter);
- public void onFragmentPause(){
- IcLog.i(TAG,"onFragmentPause");
- timeDatePresenter.onPausePresenter();
- phonePresenter.onPausePresenter();
+ PresenterCycle state = getPresenterList(TIME_LIST_INDEX);
+ if(state != null){
+ ((TimeDatePresenter)state).setAnalogClock(false);
+ }
}
- public void onFragmentDestroy(){
- IcLog.i(TAG,"onFragmentDestroy");
- batteryPresenter.unRegisterBatteryReceiver();
- hardwarePresenter.unRegisterHardwareReceiver();
- phonePresenter.onDestroyPresenter();
- timeDatePresenter.unRegisterTimeDateReceiver();
- }
public static class Factory extends ViewModelProvider.NewInstanceFactory {
}
}
- public LiveData<Integer> getObsPhoneTypeID() {
- return mObsPhoneTypeID;
+ public LiveData<Integer> getObservablePhoneType() {
+ PresenterCycle state = getPresenterList(PHONE_LIST_INDEX);
+ if(state != null){
+ return ((PhoneStatePresenter)state).getPhoneTypeObservable();
+ }
+ return null;
}
- public LiveData<Integer> getObsPhoneSignalID() {
- return mObsPhoneSignalID;
+ public LiveData<Integer> getObservableSignal() {
+ PresenterCycle state = getPresenterList(PHONE_LIST_INDEX);
+ if(state != null){
+ return ((PhoneStatePresenter)state).getPhoneSignalObservable();
+ }
+ return null;
}
- public LiveData<Integer> getObsPhoneTransportID() {
- return mObsPhoneTransportID;
+ public LiveData<Integer> getObservableTransport() {
+ PresenterCycle state = getPresenterList(PHONE_LIST_INDEX);
+ if(state != null){
+ return ((PhoneStatePresenter)state).getPhoneTransportObservable();
+ }
+ return null;
}
- public LiveData<String> getObsBatteryValue() {
- return mObsBatteryValue;
+ public LiveData<Integer> getObservableBattery() {
+ PresenterCycle state = getPresenterList(BATTERY_LIST_INDEX);
+ if(state != null){
+ return ((BatteryPresenter)state).getObsBatteryResID();
+ }
+ return null;
}
- public LiveData<Boolean> getObsBatteryCharging() {
- return mObsBatteryCharging;
+ public LiveData<Boolean> getObservableBatteryCharging() {
+ PresenterCycle state = getPresenterList(BATTERY_LIST_INDEX);
+ if(state != null){
+ return ((BatteryPresenter)state).getObsBatteryCharging();
+ }
+ return null;
}
- public LiveData<Integer> getObsBatteryResID() {
- return mObsBatteryResID;
+ public LiveData<String> getObservableBatteryValue() {
+ PresenterCycle state = getPresenterList(BATTERY_LIST_INDEX);
+ if(state != null){
+ return ((BatteryPresenter)state).getObsBatteryValue();
+ }
+ return null;
}
- public LiveData<ArrayList<Integer>> getObsTime() {
- return mObsTime;
+ public LiveData<String> getObservableHardwareHeart() {
+ PresenterCycle state = getPresenterList(HARDWARE_LIST_INDEX);
+ if(state != null){
+ return ((HardwarePresenter)state).getObsHardwareHeart();
+ }
+ return null;
}
- public LiveData<String> getObsYear() {
- return mObsYear;
+ public LiveData<String> getObservableHardwarePed() {
+ PresenterCycle state = getPresenterList(HARDWARE_LIST_INDEX);
+ if(state != null){
+ return ((HardwarePresenter)state).getObsHardwarePed();
+ }
+ return null;
}
- public LiveData<String> getObsWeek() {
- return mObsWeek;
+ public LiveData<String> getObservableWeek() {
+ PresenterCycle state = getPresenterList(TIME_LIST_INDEX);
+ if(state != null){
+ return ((TimeDatePresenter)state).getObsWeek();
+ }
+ return null;
}
- public LiveData<String> getObsHardwareHeart() {
- return mObsHardwareHeart;
+ public LiveData<String> getObservableYear() {
+ PresenterCycle state = getPresenterList(TIME_LIST_INDEX);
+ if(state != null){
+ return ((TimeDatePresenter)state).getObsYear();
+ }
+ return null;
}
- public LiveData<String> getObsHardwarePed() {
- return mObsHardwarePed;
+ public LiveData<int[]> getObservableTime() {
+ PresenterCycle state = getPresenterList(TIME_LIST_INDEX);
+ if(state != null){
+ return ((TimeDatePresenter)state).getObsTime();
+ }
+ return null;
}
}
--- /dev/null
+package com.ic.launcher.mode;
+
+import android.app.Application;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.AndroidViewModel;
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.ViewModel;
+import androidx.lifecycle.ViewModelProvider;
+
+import com.ic.launcher.presenter.BatteryPresenter;
+
+public class LowPowerModel extends AndroidViewModel {
+
+ private final BatteryPresenter batteryPresenter;
+
+ private LowPowerModel(Application application) {
+ super(application);
+ batteryPresenter = new BatteryPresenter(application);
+
+ }
+
+ public void OnUiCreate() {
+ if (batteryPresenter != null) {
+ batteryPresenter.onPresenterCreate();
+ }
+ }
+
+ public void OnUiDestroy() {
+ if (batteryPresenter != null) {
+ batteryPresenter.onPresenterDestroy();
+ }
+ }
+
+ public LiveData<String> getObservableLowPowerValue() {
+ if (batteryPresenter != null) {
+ return batteryPresenter.getObsLowPowerValue();
+ }
+ return null;
+ }
+
+ public LiveData<Boolean> getObservableLowPower() {
+ if (batteryPresenter != null) {
+ return batteryPresenter.getObsLowPower();
+ }
+ return null;
+ }
+
+ public static class Factory extends ViewModelProvider.NewInstanceFactory {
+
+ @NonNull
+ private final Application mApplication;
+
+
+ public Factory(@NonNull Application application) {
+ mApplication = application;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ @NonNull
+ public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
+ return (T) new LowPowerModel(mApplication);
+ }
+ }
+}
import java.util.List;
-public class AppListPresenter {
+public class AppListPresenter{
private Context context;
private MutableLiveData<List<AppInfoEntity>> mObsAppInfoList;
private String mErrorInfo;
+
public AppListPresenter(Context context) {
this.context = context;
mObsAppInfoList = new MutableLiveData<>();
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
+import android.telephony.TelephonyManager;
import android.text.TextUtils;
import androidx.lifecycle.MediatorLiveData;
import com.ic.launcher.util.IcLog;
-public class BatteryPresenter {
+public class BatteryPresenter extends PresenterCycle {
private static final String TAG = "BatteryPresenter";
+
+ private static final int LOW_LEVEL = 15;
+ private static final int SHUT_DOWN_LEVEL = 5;
+
private Context mContext;
+ private boolean isLowPowerState = false;
+
private MediatorLiveData<String> mObsBatteryValue;
private MediatorLiveData<Boolean> mObsBatteryCharging;
private MediatorLiveData<Integer> mObsBatteryResID;
+ private MediatorLiveData<Boolean> mObsLowPower;
+ private MediatorLiveData<String> mObsLowPowerValue;
public MediatorLiveData<String> getObsBatteryValue() {
return mObsBatteryValue;
return mObsBatteryResID;
}
+ public MediatorLiveData<Boolean> getObsLowPower() {
+ return mObsLowPower;
+ }
+
+ public MediatorLiveData<String> getObsLowPowerValue() {
+ return mObsLowPowerValue;
+ }
+
+ @Override
+ public void onPresenterCreate() {
+ super.onPresenterCreate();
+ IcLog.i(TAG,"BatteryPresenter onPresenterCreate");
+ registerBatteryReceiver();
+ }
+
+ @Override
+ public void onPresenterDestroy() {
+ super.onPresenterDestroy();
+ IcLog.i(TAG,"BatteryPresenter onPresenterDestroy");
+ unRegisterBatteryReceiver();
+ }
+
public BatteryPresenter(Context context) {
mContext = context;
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);
}
}
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);
}
}
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);
+ }
+ }
}
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";
private MediatorLiveData<String> mObsHardwareHeart;
private MediatorLiveData<String> mObsHardwarePed;
- public HardwarePresenter(Context context) {
+ @Override
+ public void onPresenterCreate() {
+ super.onPresenterCreate();
+ registerHardwareBroadcast();
+ }
- this.mContext = context;
+ @Override
+ public void onPresenterResume() {
+ super.onPresenterResume();
+ sendGetPedBroadcast();
+ }
+ @Override
+ public void onPresenterDestroy() {
+ super.onPresenterDestroy();
+ unRegisterHardwareReceiver();
+ }
+
+ public HardwarePresenter(Context context) {
+ this.mContext = context;
mObsHardwareHeart = new MediatorLiveData<>();
mObsHardwarePed = new MediatorLiveData<>();
-
- registerHardwareBroadcast();
}
public MediatorLiveData<String> getObsHardwareHeart() {
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);
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) {
import androidx.lifecycle.MediatorLiveData;
-public class PhoneStatePresenter {
+public class PhoneStatePresenter extends PresenterCycle {
private static final String TAG = "PhoneStatePresenter";
private QueryPhoneState queryState;
private MediatorLiveData<Integer> mObsPhoneTypeID;
private MediatorLiveData<Integer> mObsPhoneSignalID;
- public PhoneStatePresenter(Context context) {
- mObsPhoneTypeID = new MediatorLiveData<>();
- mObsPhoneSignalID = new MediatorLiveData<>();
- mObsPhoneTransportID = new MediatorLiveData<>();
-
- queryState = new QueryPhoneState(context,mObsPhoneTypeID,mObsPhoneSignalID,mObsPhoneTransportID);
- }
-
- public LiveData<Integer> getPhoneTypeObservable() {
- return mObsPhoneTypeID;
- }
-
- public LiveData<Integer> getPhoneSignalObservable() {
- return mObsPhoneSignalID;
- }
-
- public LiveData<Integer> getPhoneTransportObservable() {
- return mObsPhoneTransportID;
- }
-
- public void onResumePresenter() {
+ @Override
+ public void onPresenterResume() {
+ super.onPresenterResume();
if(mQueryThread == null){
mQueryThread = new Thread(queryState);
mQueryThread.start();
}
}
- public void onPausePresenter() {
+ @Override
+ public void onPresenterPause() {
+ super.onPresenterPause();
if (mQueryThread != null && queryState != null) {
queryState.pauseQueryThread();
}
}
- public void onDestroyPresenter() {
+ @Override
+ public void onPresenterDestroy() {
+ super.onPresenterDestroy();
if (mQueryThread != null) {
mQueryThread.interrupt();
}
mQueryThread = null;
- queryState.destroyPhoneState();
+ if(queryState != null){
+ queryState.destroyPhoneState();
+ }
queryState=null;
}
+
+ public PhoneStatePresenter(Context context) {
+ mObsPhoneTypeID = new MediatorLiveData<>();
+ mObsPhoneSignalID = new MediatorLiveData<>();
+ mObsPhoneTransportID = new MediatorLiveData<>();
+
+ queryState = new QueryPhoneState(context,mObsPhoneTypeID,mObsPhoneSignalID,mObsPhoneTransportID);
+ }
+
+ public LiveData<Integer> getPhoneTypeObservable() {
+ return mObsPhoneTypeID;
+ }
+
+ public LiveData<Integer> getPhoneSignalObservable() {
+ return mObsPhoneSignalID;
+ }
+
+ public LiveData<Integer> getPhoneTransportObservable() {
+ return mObsPhoneTransportID;
+ }
}
--- /dev/null
+package com.ic.launcher.presenter;
+
+public abstract class PresenterCycle {
+
+ public void onPresenterCreate() {
+ }
+
+ public void onPresenterResume() {
+ }
+
+ public void onPresenterPause() {
+ }
+
+ public void onPresenterDestroy() {
+ }
+}
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]);
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;
}
}
+ /****
+ * 此处时间不能乱修改,模拟表盘 秒表也用。所以要修改请{@link TimeDatePresenter} 一起修改
+ */
@Override
public void run() {
super.run();
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.text.format.DateFormat;
+import android.content.pm.PackageManager;
+import android.os.Handler;
+import android.os.Message;
+import android.text.TextUtils;
+import androidx.annotation.NonNull;
import androidx.lifecycle.MediatorLiveData;
import com.ic.launcher.util.IcLog;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.TimeZone;
+import org.threeten.bp.Instant;
+import org.threeten.bp.LocalDateTime;
+import org.threeten.bp.ZoneId;
+import org.threeten.bp.format.DateTimeFormatter;
+import org.threeten.bp.format.TextStyle;
+
+import java.lang.ref.WeakReference;
+import java.util.Locale;
+
import static com.ic.launcher.configure.l02.L02Icon.l02TimeHourImage;
import static com.ic.launcher.configure.l02.L02Icon.l02TimeMinutesImage;
-public class TimeDatePresenter {
+public class TimeDatePresenter extends PresenterCycle {
private static final String TAG = "TimeDatePresenter";
+ private static final DateTimeFormatter MMDD = DateTimeFormatter.ofPattern("MM-dd");
- private static final CharSequence DEFAULT_FORMAT_24_HOUR = "HH:mm";
- private static final CharSequence DEFAULT_FORMAT_MM_DD = "MM-dd";
- private static final CharSequence DEFAULT_FORMAT_EEEEE = "EEEE";
-
- private MediatorLiveData<ArrayList<Integer>> mObsTime;
+ private MediatorLiveData<int[]> mObsTime;
private MediatorLiveData<String> mObsYear;
private MediatorLiveData<String> mObsWeek;
+ private MediatorLiveData<int[]> mObsHourList;
private Context mContext;
- private Calendar mTime;
- private boolean mShouldRunTicker = false;
- private ArrayList<Integer> timeList;
+ private Thread loopThread = null;
+ private LoopSecondThread mLoopSecond = null;
+
+ private boolean mAnalogClock=false;
+ private SecondMessage secondMessage;
+
+ @Override
+ public void onPresenterCreate() {
+ super.onPresenterCreate();
+ registerTimeDateReceiver();
+ }
+
+ @Override
+ public void onPresenterResume() {
+ super.onPresenterResume();
+ //如果获取秒钟的线程没有启动。则启动
+ if (mAnalogClock) {
+ if (loopThread == null || mLoopSecond == null) {
+ mLoopSecond = new LoopSecondThread();
+ loopThread = new Thread(mLoopSecond);
+ loopThread.start();
+ } else {
+ mLoopSecond.resumeQueryThread();
+ }
+ }
+ }
+
+ @Override
+ public void onPresenterPause() {
+ super.onPresenterPause();
+ if (mAnalogClock) {
+ if (mLoopSecond != null) {
+ mLoopSecond.pauseQueryThread();
+ }
+ }
+ }
+
+ @Override
+ public void onPresenterDestroy() {
+ super.onPresenterDestroy();
+ unRegisterTimeDateReceiver();
+
+ if (loopThread != null) {
+ loopThread.interrupt();
+ }
+ }
+
+ public void setAnalogClock(boolean analog) {
+ this.mAnalogClock = analog;
+ }
public TimeDatePresenter(Context context) {
mContext = context;
- timeList = new ArrayList<>();
- createTime(null);
mObsTime = new MediatorLiveData<>();
mObsYear = new MediatorLiveData<>();
mObsWeek = new MediatorLiveData<>();
- registerTimeDateReceiver();
+ mObsHourList = new MediatorLiveData<>();
+
+ secondMessage = new SecondMessage(this);
+
+ analysisDataTimeValue(null);
}
- public MediatorLiveData<ArrayList<Integer>> getObsTime() {
+ public MediatorLiveData<int[]> getObsTime() {
return mObsTime;
}
return mObsYear;
}
- public MediatorLiveData<String> getmObsWeek() {
+ public MediatorLiveData<String> getObsWeek() {
return mObsWeek;
}
- public void onResumePresenter() {
- onTimeChanged();
- mShouldRunTicker = true;
+ public MediatorLiveData<int[]> getObsHourList() {
+ return mObsHourList;
}
- public void onPausePresenter() {
- mShouldRunTicker = false;
- }
private void registerTimeDateReceiver() {
IntentFilter filter = new IntentFilter();
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);
}
}
private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
- if (Intent.ACTION_TIMEZONE_CHANGED.equals(intent.getAction())) {
- final String timeZone = intent.getStringExtra("time-zone");
- createTime(timeZone);
- } else if (!mShouldRunTicker && (Intent.ACTION_TIME_TICK.equals(intent.getAction())
- || Intent.ACTION_TIME_CHANGED.equals(intent.getAction()))) {
- return;
+ String action = intent.getAction();
+ if (TextUtils.isEmpty(action)) return;
+
+ if (Intent.ACTION_TIMEZONE_CHANGED.equals(action)) {
+ analysisDataTimeValue(intent.getStringExtra("time-zone"));
+ } else {
+ analysisDataTimeValue(null);
}
- onTimeChanged();
}
};
- private void createTime(String timeZone) {
- if (timeZone != null) {
- mTime = Calendar.getInstance(TimeZone.getTimeZone(timeZone));
+ private void analysisDataTimeValue(String z) {
+
+ LocalDateTime currDateTime;
+
+ if (!TextUtils.isEmpty(z)) {
+ ZoneId zone = ZoneId.of(z).getRules().getOffset(Instant.now());
+ currDateTime = LocalDateTime.now(zone);
} else {
- mTime = Calendar.getInstance();
+ currDateTime = LocalDateTime.now(ZoneId.systemDefault());
+ }
+
+
+ if (mAnalogClock) {
+ updateAnalogClock(currDateTime);
+ } else {
+ //如果当前是数字表盘
+ computeMainClockTime(currDateTime);
}
}
- private void onTimeChanged() {
- mTime.setTimeInMillis(System.currentTimeMillis());
+ private void computeMainClockTime(LocalDateTime localDateTime) {
- CharSequence time = DateFormat.format(DEFAULT_FORMAT_24_HOUR, mTime);
- CharSequence mmdd = DateFormat.format(DEFAULT_FORMAT_MM_DD, mTime);
- CharSequence week = DateFormat.format(DEFAULT_FORMAT_EEEEE, mTime);
+ mObsYear.setValue(localDateTime.format(MMDD));
- timeList.clear();
+ mObsWeek.setValue(localDateTime.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.getDefault()));
- boolean isHour = true;
+ int hour = localDateTime.getHour();
+ int minute = localDateTime.getMinute();
- for (int i = 0; i < time.length(); i++) {
- if (time.charAt(i) == ':') {
- isHour = false;
- continue;
- }
+ mObsTime.setValue(new int[]{
+ l02TimeHourImage[hour / 10],
+ l02TimeHourImage[hour % 10],
+ l02TimeMinutesImage[minute / 10],
+ l02TimeMinutesImage[minute % 10]});
+ }
- if (isHour) {
- timeList.add(l02TimeHourImage[Character.getNumericValue(time.charAt(i))]);
- } else {
- timeList.add(l02TimeMinutesImage[Character.getNumericValue(time.charAt(i))]);
- }
+ private void updateAnalogClock(LocalDateTime localDateTime) {
+ //模拟表盘
+ mObsHourList.setValue(new int[]{
+ localDateTime.getHour(),
+ localDateTime.getMinute(),
+ localDateTime.getSecond()});
+ }
+
+ private static class SecondMessage extends Handler{
+ private WeakReference<TimeDatePresenter> reference;
+
+ public SecondMessage(TimeDatePresenter ref) {
+ this.reference = new WeakReference<TimeDatePresenter>(ref) ;
}
- mObsTime.setValue(timeList);
- mObsYear.setValue(mmdd.toString());
- mObsWeek.setValue(week.toString());
+ @Override
+ public void dispatchMessage(@NonNull Message msg) {
+ super.dispatchMessage(msg);
+ reference.get().analysisDataTimeValue(null);
+ }
+ }
- IcLog.i(TAG, "time" + time.toString() + " mmdd:" + mmdd.toString() + " week" + week.toString());
+ private class LoopSecondThread extends QueryThread {
+ @Override
+ void onThreadExecute() {
+ if(secondMessage != null){
+ secondMessage.sendEmptyMessage(1);
+ }
+ }
}
}
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);
}
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();
+ }
+ }
}
--- /dev/null
+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();
+ }
+}
+++ /dev/null
-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());
- }
-}
mImageView[3] = (ImageView) view.findViewById(R.id.time_minute_bit);
}
- private void updateTime(ArrayList<Integer> timeRes) {
+ private void updateTime(int hourTen,int hourBit,int minuteTen,int minuteBit) {
- if (timeRes == null || timeRes.size() == 0 || timeRes.size() != oldTimeArray.length) {
- return;
+ if(hourTen != oldTimeArray[0]){
+ mImageView[0].setImageResource(hourTen);
+ oldTimeArray[0]=hourTen;
}
- for (int i = 0; i < timeRes.size(); i++) {
- if (oldTimeArray[i] != timeRes.get(i)) {
- mImageView[i].setImageResource(timeRes.get(i));
- oldTimeArray[i] = timeRes.get(i);
- }
+ if(hourBit != oldTimeArray[1]){
+ mImageView[1].setImageResource(hourBit);
+ oldTimeArray[1]=hourTen;
+ }
+
+ if(minuteTen != oldTimeArray[2]){
+ mImageView[2].setImageResource(minuteTen);
+ oldTimeArray[2]=minuteTen;
+ }
+
+ if(minuteBit != oldTimeArray[3]){
+ mImageView[3].setImageResource(minuteBit);
+ oldTimeArray[3]=minuteBit;
}
if (!isShowColon) {
}
}
- @BindingAdapter(value = {"app:timeImageResId"}, requireAll = false)
- public static void updateTimeImge(WidgetTimeImageView view, ArrayList<Integer> timeRes) {
+ @BindingAdapter(value = {"app:hourTenResId","app:hourBitResId","app:minuteTenResId","app:minuteBitResId"}, requireAll = false)
+ public static void updateTimeImage(WidgetTimeImageView view, int hourTen,int hourBit,int minuteTen,int minuteBit) {
if (view != null) {
- view.updateTime(timeRes);
+ view.updateTime(hourTen,hourBit,minuteTen,minuteBit);
}
}
}
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/select_dial_content_fl"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context=".MainActivity" />
\ No newline at end of file
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/app_indicator_rv"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center_horizontal"
android:overScrollMode="never"
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ tools:context=".fragment.clock.Clock12DialFragment"
+ android:background="@android:color/transparent">
+
+ <ImageView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:src="@mipmap/clock12_dial"/>
+
+ <com.ic.launcher.widget.ClockDrawableView
+ android:id="@+id/clock_12_drawable_view"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ app:mBackgroundClock="@mipmap/clock12_dial"
+ app:mHourHandClock="@mipmap/clock12_hand_hour"
+ app:mMinuteHandClock="@mipmap/clock12_hand_minute"
+ app:mSecondHandClock="@mipmap/clock12_hand_second"
+ android:background="@android:color/transparent"/>
+
+ <ImageView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@mipmap/clock12_hand_cap"
+ android:layout_gravity="center"/>
+
+</FrameLayout>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ tools:context=".fragment.clock.Clock6DialFragment">
+
+ <ImageView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:src="@mipmap/clock6_dial"/>
+
+ <com.ic.launcher.widget.ClockDrawableView
+ android:id="@+id/clock_6_drawable_view"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ app:mBackgroundClock="@mipmap/clock6_dial"
+ app:mHourHandClock="@mipmap/clock6_hand_hour"
+ app:mMinuteHandClock="@mipmap/clock6_hand_minute"
+ app:mSecondHandClock="@mipmap/clock6_hand_second"
+ android:background="@android:color/transparent"/>
+
+ <ImageView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@mipmap/clock6_hand_cap"
+ android:layout_gravity="center"/>
+
+</FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context=".fragment.L02MainFragment"
- android:orientation="vertical">
-
- <fragment
- android:id="@+id/l02_status_fl"
- android:name="com.ic.launcher.fragment.l02.L02StatusBarFragment"
- android:layout_width="match_parent"
- android:layout_height="@dimen/status_bar_height_dm"
- android:layout_marginTop="10dp"/>
+ tools:context=".fragment.l02.L02StatusBarFragment">
+
+ <data>
+
+ <variable
+ name="phoneSignal"
+ type="int" />
+
+ <variable
+ name="phoneNetType"
+ type="int" />
+
+ <variable
+ name="phoneTransport"
+ type="int" />
+
+ <variable
+ name="batteryDrawable"
+ type="int" />
+
+ <variable
+ name="batteryValue"
+ type="String" />
+
+ <variable
+ name="batteryCharge"
+ type="boolean" />
+
+ <variable
+ name="hourTen"
+ type="int" />
+
+ <variable
+ name="hourBit"
+ type="int" />
+
+ <variable
+ name="minuteTen"
+ type="int" />
+
+ <variable
+ name="minuteBit"
+ type="int" />
+
+ <variable
+ name="watchDate"
+ type="String" />
+
+ <variable
+ name="watchWeek"
+ type="String" />
- <fragment
- android:id="@+id/l02_watch_fl"
- android:name="com.ic.launcher.fragment.l02.L02WatchFragment"
+ <variable
+ name="heartValue"
+ type="String" />
+
+ <variable
+ name="stepValue"
+ type="String" />
+ </data>
+
+ <RelativeLayout
android:layout_width="match_parent"
- android:layout_height="match_parent" />
+ android:layout_height="match_parent">
+
+ <RelativeLayout
+ android:id="@+id/main_status"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/status_bar_height_dm"
+ android:layout_marginTop="10dp">
+
+ <com.ic.launcher.widget.WidgetPhoneStateView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="10dp"
+ app:netTypeDrawable="@{phoneNetType}"
+ app:signalDrawable="@{phoneSignal}"
+ app:transportDrawable="@{phoneTransport}" />
+
+ <com.ic.launcher.widget.WidgetBatteryStateView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentEnd="true"
+ android:layout_marginEnd="10dp"
+ app:batteryCharge="@{batteryCharge}"
+ app:batteryDrawable="@{batteryDrawable}"
+ app:batteryValue="@{batteryValue}" />
+ </RelativeLayout>
+
+
+ <com.ic.launcher.widget.WidgetTimeImageView
+ android:id="@+id/l02_time_image"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/main_status"
+ android:layout_centerHorizontal="true"
+ android:layout_marginTop="25dp"
+ app:hourBitResId="@{hourBit}"
+ app:hourTenResId="@{hourTen}"
+ app:minuteBitResId="@{minuteBit}"
+ app:minuteTenResId="@{minuteTen}" />
+
+ <View
+ android:id="@+id/l02_time_sp"
+ android:layout_width="1dp"
+ android:layout_height="80dp"
+ android:layout_below="@id/l02_time_image"
+ android:layout_centerHorizontal="true" />
+
+ <TextView
+ android:id="@+id/l02_watch_data"
+ style="@style/watchDateTextStyle"
+ android:layout_below="@id/l02_time_image"
+ android:layout_marginEnd="8dp"
+ android:layout_toStartOf="@id/l02_time_sp"
+ android:text="@{watchDate}" />
+
+ <TextView
+ style="@style/watchDateTextStyle"
+ android:layout_below="@id/l02_time_image"
+ android:layout_marginStart="8dp"
+ android:layout_toEndOf="@id/l02_time_sp"
+ android:text="@{watchWeek}" />
+
+ <ImageView
+ android:id="@+id/l02_heart_img"
+ style="@style/watchDateIconStyle"
+ android:layout_alignParentStart="true"
+ android:layout_marginStart="40dp"
+ android:src="@mipmap/clockl02_heartrate_icon" />
+
+ <TextView
+ android:id="@+id/l02_heart_value"
+ style="@style/watchDateIconTextStyle"
+ android:layout_marginStart="5dp"
+ android:layout_toEndOf="@id/l02_heart_img"
+ android:text="@{heartValue}" />
+
+ <ImageView
+ android:id="@+id/l02_pedometer_img"
+ style="@style/watchDateIconStyle"
+ android:layout_toEndOf="@id/l02_time_sp"
+ android:src="@mipmap/clockl02_pedometer" />
+
+ <TextView
+ android:id="@+id/l02_pedometer_value"
+ style="@style/watchDateIconTextStyle"
+ android:layout_marginStart="2dp"
+ android:layout_toEndOf="@id/l02_pedometer_img"
+ android:text="@{stepValue}" />
+
+ </RelativeLayout>
-</LinearLayout>
\ No newline at end of file
+</layout>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-
-<layout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- xmlns:tools="http://schemas.android.com/tools"
- tools:context=".fragment.l02.L02StatusBarFragment">
-
- <data>
- <variable
- name="phoneSignal"
- type="int" />
-
- <variable
- name="phoneNetType"
- type="int" />
-
- <variable
- name="phoneTransport"
- type="int" />
-
- <variable
- name="batteryDrawable"
- type="int" />
-
- <variable
- name="batteryValue"
- type="String" />
-
- <variable
- name="batteryCharge"
- type="boolean" />
- </data>
-
- <androidx.constraintlayout.widget.ConstraintLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
-
- <com.ic.launcher.widget.WidgetPhoneStateView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- app:layout_constraintBottom_toBottomOf="parent"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintHorizontal_bias="0.118"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toTopOf="parent"
- app:netTypeDrawable="@{phoneNetType}"
- app:signalDrawable="@{phoneSignal}"
- app:transportDrawable="@{phoneTransport}" />
-
- <com.ic.launcher.widget.WidgetBatteryStateView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- app:batteryCharge="@{batteryCharge}"
- app:batteryDrawable="@{batteryDrawable}"
- app:batteryValue="@{batteryValue}"
- app:layout_constraintBottom_toBottomOf="parent"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintHorizontal_bias="0.938"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toTopOf="parent"/>
-
- </androidx.constraintlayout.widget.ConstraintLayout>
-</layout>
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<layout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- xmlns:tools="http://schemas.android.com/tools"
- tools:context=".fragment.l02.L02WatchFragment">
-
- <data>
-
- <import type="java.util.ArrayList" />
-
- <variable
- name="timeText"
- type="ArrayList<Integer>" />
-
- <variable
- name="watchDate"
- type="String" />
-
- <variable
- name="watchWeek"
- type="String" />
-
- <variable
- name="heartValue"
- type="String" />
-
- <variable
- name="stepValue"
- type="String" />
- </data>
-
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <com.ic.launcher.widget.WidgetTimeImageView
- android:id="@+id/l02_time_image"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerHorizontal="true"
- android:layout_marginTop="25dp"
- app:timeImageResId="@{timeText}"/>
-
- <View
- android:id="@+id/l02_time_sp"
- android:layout_width="1dp"
- android:layout_height="80dp"
- android:layout_below="@id/l02_time_image"
- android:layout_centerHorizontal="true" />
-
- <TextView
- android:id="@+id/l02_watch_data"
- style="@style/watchDateTextStyle"
- android:layout_below="@id/l02_time_image"
- android:layout_marginEnd="8dp"
- android:layout_toStartOf="@id/l02_time_sp"
- android:text="@{watchDate}" />
-
- <TextView
- style="@style/watchDateTextStyle"
- android:layout_below="@id/l02_time_image"
- android:layout_marginStart="8dp"
- android:layout_toEndOf="@id/l02_time_sp"
- android:text="@{watchWeek}" />
-
- <ImageView
- style="@style/watchDateIconStyle"
- android:id="@+id/l02_heart_img"
- android:src="@mipmap/clockl02_heartrate_icon"
- android:layout_alignParentStart="true"
- android:layout_marginStart="40dp" />
-
- <TextView
- style="@style/watchDateIconTextStyle"
- android:id="@+id/l02_heart_value"
- android:text="@{heartValue}"
- android:layout_marginStart="5dp"
- android:layout_toEndOf="@id/l02_heart_img" />
-
- <ImageView
- style="@style/watchDateIconStyle"
- android:id="@+id/l02_pedometer_img"
- android:src="@mipmap/clockl02_pedometer"
- android:layout_toEndOf="@id/l02_time_sp"/>
-
- <TextView
- style="@style/watchDateIconTextStyle"
- android:id="@+id/l02_pedometer_value"
- android:layout_marginStart="2dp"
- android:layout_toEndOf="@id/l02_pedometer_img"
- android:text="@{stepValue}"/>
-
- </RelativeLayout>
-</layout>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools">
+
+ <data>
+ <variable
+ name="lowPowerValue"
+ type="String" />
+
+ <variable
+ name="callPhone"
+ type="com.ic.launcher.listener.ILowPowerCallPhoneListener" />
+
+ </data>
+
+ <RelativeLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@mipmap/qs_background"
+ tools:context=".fragment.LowPowerModeFragment">
+
+ <TextClock
+ android:id="@+id/low_power_time_tv"
+ style="@style/LowPowerTextStyle"
+ android:layout_centerHorizontal="true"
+ android:layout_marginTop="10dp"
+ android:format12Hour="HH:mm"
+ android:includeFontPadding="false"
+ android:textSize="60sp"
+ android:background="@android:color/transparent"/>
+
+ <ImageView
+ android:id="@+id/low_power_battery_iv"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/low_power_time_tv"
+ android:layout_centerHorizontal="true"
+ android:src="@mipmap/low_power_battery"
+ android:background="@android:color/transparent"/>
+
+ <TextView
+ android:id="@+id/battery_level"
+ style="@style/LowPowerTextStyle"
+ android:layout_below="@id/low_power_battery_iv"
+ android:layout_centerHorizontal="true"
+ android:textColor="@android:color/holo_red_dark"
+ android:background="@android:color/transparent"
+ android:text="@{lowPowerValue}"/>
+
+ <TextView
+ android:id="@+id/tips"
+ style="@style/LowPowerTextStyle"
+ android:layout_below="@id/battery_level"
+ android:layout_centerHorizontal="true"
+ android:text="@string/low_power_mode"
+ android:textColor="#FFAE12"
+ android:background="@android:color/transparent"/>
+
+ <ImageView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:layout_centerHorizontal="true"
+ android:layout_marginBottom="20dp"
+ android:src="@mipmap/low_power_dial"
+ android:background="@android:color/transparent"
+ android:onClick="@{()->callPhone.onCallPhone()}"/>
+ </RelativeLayout>
+</layout>
+
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.viewpager2.widget.ViewPager2 xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/select_clock_page"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="#000000"
+ tools:context=".fragment.SelectClockDialFragment"/>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <data>
+
+ <variable
+ name="entity"
+ type="com.ic.launcher.entity.ClockDialEntity" />
+
+ <variable
+ name="previewDrawable"
+ type="android.graphics.drawable.Drawable" />
+
+ <variable
+ name="onClick"
+ type="com.ic.launcher.listener.ISelectDialListener" />
+ </data>
+
+ <ImageView
+ android:id="@+id/preview_iv"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center"
+ android:src="@{previewDrawable}"
+ android:onClick="@{()-> onClick.onSelectDial(entity)}"/>
+
+</layout>
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <declare-styleable name="GalleryRecyclerView">
- <attr name="helper" format="string">
- <enum name="LinearSnapHelper" value="0" />
- <enum name="PagerSnapHelper" value="1" />
- </attr>
-
+ <declare-styleable name="ClockDrawableView">
+ <attr name="mBackgroundClock" format="reference" />
+ <attr name="mHourHandClock" format="reference" />
+ <attr name="mMinuteHandClock" format="reference" />
+ <attr name="mSecondHandClock" format="reference" />
</declare-styleable>
</resources>
\ No newline at end of file
<resources>
<dimen name="status_bar_height_dm">48dp</dimen>
+
+ <dimen name="viewpager_next_item_visible">26dp</dimen>
+ <dimen name="viewpager_current_item_horizontal_margin">42dp</dimen>
</resources>
\ No newline at end of file
<string name="app_name_short_message">短信</string>
<string name="app_name_setting">设置</string>
+ <string name="low_power_mode">低电量模式</string>
<string name="all_group">所有人</string>
<item name="android:includeFontPadding">false</item>
<item name="android:background">@android:color/transparent</item>
</style>
+
+ <style name="LowPowerTextStyle">
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:textSize">36sp</item>
+ <item name="android:textColor">#FFFFFF</item>
+ <item name="android:includeFontPadding">false</item>
+ </style>
</resources>
-#Wed Mar 25 19:58:58 CST 2020
-VERSION_CODE=22
+#Sun Mar 29 18:27:02 CST 2020
+VERSION_CODE=24