version:3.4.6

fix:
update:样式修改
This commit is contained in:
2025-11-11 16:13:35 +08:00
parent 42a38cc6d9
commit f7ee1df00a
38 changed files with 1665 additions and 548 deletions

View File

@@ -41,12 +41,25 @@ android {
// 还可以添加 'x86', 'x86_64', 'mips', 'mips64' // 还可以添加 'x86', 'x86_64', 'mips', 'mips64'
} }
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
javaCompileOptions { javaCompileOptions {
annotationProcessorOptions { annotationProcessorOptions {
includeCompileClasspath true includeCompileClasspath true
} }
} }
lintOptions {
checkReleaseBuilds false
}
dataBinding {
enabled true
}
manifestPlaceholders = [ manifestPlaceholders = [
XG_ACCESS_ID : "1500031216", XG_ACCESS_ID : "1500031216",
XG_ACCESS_KEY: "A1HBG2922B9Z", XG_ACCESS_KEY: "A1HBG2922B9Z",
@@ -55,15 +68,6 @@ android {
buildConfigField "String", "WEBSOCKET_URL", '"wss://as.fuyingy.com:3018"' buildConfigField "String", "WEBSOCKET_URL", '"wss://as.fuyingy.com:3018"'
} }
lintOptions {
checkReleaseBuilds false
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
//多版本 //多版本
productFlavors { productFlavors {
// beta { // beta {
@@ -74,8 +78,8 @@ android {
official { official {
flavorDimensions "default" flavorDimensions "default"
versionCode 85 versionCode 86
versionName "3.4.5" versionName "3.4.6"
} }
} }
@@ -505,12 +509,6 @@ dependencies {
androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
//BindView
implementation 'com.jakewharton:butterknife:10.2.3'
// If you are using Kotlin, replace annotationProcessor with kapt.
// annotationProcessor rootProject.ext.dependencies["butterknife-compiler"]
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3'
//okhttp //okhttp
implementation 'com.squareup.okhttp3:okhttp:4.10.0' implementation 'com.squareup.okhttp3:okhttp:4.10.0'
//Retrofit //Retrofit

View File

@@ -107,7 +107,7 @@
<activity <activity
android:name=".activity.main.MainActivity" android:name=".activity.main.MainActivity"
android:launchMode="singleTask" android:launchMode="singleTask"
android:screenOrientation="portrait"> android:screenOrientation="landscape">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
@@ -117,7 +117,7 @@
<activity <activity
android:name=".activity.SplashActivity" android:name=".activity.SplashActivity"
android:launchMode="singleTask" android:launchMode="singleTask"
android:screenOrientation="portrait" /> android:screenOrientation="landscape" />
<service <service
android:name=".service.ControlPanelService" android:name=".service.ControlPanelService"

View File

@@ -1,34 +0,0 @@
package com.fuying.sn.activity.main;
import android.graphics.Bitmap;
import com.fuying.sn.base.BasePresenter;
import com.fuying.sn.base.BaseView;
import com.fuying.sn.bean.BaseResponse;
import com.fuying.sn.bean.SnInfo;
public class MainAContact {
interface Presenter extends BasePresenter<MainView> {
/*获取设备信息*/
void getSnInfo();
/*获取二维码*/
void getQRCode();
//获取所有app包名
void getAllApp();
/*检查更新*/
void checkUpdate();
/*检查扶小鹰App更新*/
void checkFXYUpdate();
/*获取所有全局更新*/
void getOverallApp();
}
public interface MainView extends BaseView {
void setSnInfo(BaseResponse<SnInfo> response);
void setQRCode(Bitmap bitmap);
void getAllAppFinish();
void checkUpdateFinish();
void checkFXYUpdateFinish();
void setOverallApp();
}
}

View File

@@ -18,8 +18,6 @@ import android.view.Gravity;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.View; import android.view.View;
import android.view.WindowManager; import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
@@ -27,15 +25,17 @@ import androidx.fragment.app.FragmentManager;
import com.blankj.utilcode.util.NetworkUtils; import com.blankj.utilcode.util.NetworkUtils;
import com.fuying.sn.BuildConfig; import com.fuying.sn.BuildConfig;
import com.fuying.sn.R; import com.fuying.sn.R;
import com.fuying.sn.base.BaseActivity; import com.fuying.sn.base.mvvm.BaseMvvmActivity;
import com.fuying.sn.bean.AppInfo; import com.fuying.sn.bean.AppInfo;
import com.fuying.sn.bean.BaseResponse; import com.fuying.sn.bean.BaseResponse;
import com.fuying.sn.bean.SnInfo; import com.fuying.sn.bean.SnInfo;
import com.fuying.sn.config.CommonConfig; import com.fuying.sn.config.CommonConfig;
import com.fuying.sn.databinding.ActivityMainBinding;
import com.fuying.sn.dialog.UserDebugDialog; import com.fuying.sn.dialog.UserDebugDialog;
import com.fuying.sn.fragment.AppletQRCodeFragment; import com.fuying.sn.fragment.AppletQRCodeFragment;
import com.fuying.sn.fragment.BaseFragmentPagerAdapter; import com.fuying.sn.fragment.BaseFragmentPagerAdapter;
import com.fuying.sn.fragment.QRCodeFragment; import com.fuying.sn.fragment.QRCodeFragment;
import com.fuying.sn.fragment.dialog.RestartFragment;
import com.fuying.sn.gson.GsonUtils; import com.fuying.sn.gson.GsonUtils;
import com.fuying.sn.manager.ControlManager; import com.fuying.sn.manager.ControlManager;
import com.fuying.sn.manager.DeviceManager; import com.fuying.sn.manager.DeviceManager;
@@ -54,40 +54,20 @@ import com.fuying.sn.utils.Utils;
import com.trello.rxlifecycle4.RxLifecycle; import com.trello.rxlifecycle4.RxLifecycle;
import com.trello.rxlifecycle4.android.ActivityEvent; import com.trello.rxlifecycle4.android.ActivityEvent;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import io.reactivex.rxjava3.annotations.NonNull; import io.reactivex.rxjava3.annotations.NonNull;
import io.reactivex.rxjava3.core.Observer; import io.reactivex.rxjava3.core.Observer;
import io.reactivex.rxjava3.disposables.Disposable; import io.reactivex.rxjava3.disposables.Disposable;
public class MainActivity extends BaseActivity implements MainAContact.MainView, NetworkUtils.OnNetworkStatusChangedListener { public class MainActivity extends BaseMvvmActivity<MainViewModel, ActivityMainBinding> implements NetworkUtils.OnNetworkStatusChangedListener {
private static final String TAG = "MainActivity"; private static final String TAG = "MainActivity";
@BindView(R.id.tv_exit) @Override
TextView tv_exit; public boolean setNightMode() {
@BindView(R.id.tv_title) return true;
TextView tv_title; }
@BindView(R.id.tv_customversion)
TextView tv_customversion;
@BindView(R.id.tv_sn)
TextView tv_sn;
@BindView(R.id.tv_version)
TextView tv_version;
@BindView(R.id.qr_code)
ImageView qr_code;
@BindView(R.id.iv_appqrcode)
ImageView iv_appqrcode;
@BindView(R.id.iv_exit)
ImageView iv_exit;
@BindView(R.id.tv_update)
TextView tv_update;
private MainAPresenter mPresenter;
@Override @Override
public void onDisconnected() { public void onDisconnected() {
@@ -97,8 +77,7 @@ public class MainActivity extends BaseActivity implements MainAContact.MainView,
@Override @Override
public void onConnected(NetworkUtils.NetworkType networkType) { public void onConnected(NetworkUtils.NetworkType networkType) {
Log.e(TAG, "onConnected: "); Log.e(TAG, "onConnected: ");
timeMillis = System.currentTimeMillis(); mViewModel.getSnInfo();
mPresenter.getSnInfo();
} }
@Override @Override
@@ -106,16 +85,19 @@ public class MainActivity extends BaseActivity implements MainAContact.MainView,
return R.layout.activity_main; return R.layout.activity_main;
} }
@Override
protected void initDataBinding() {
mViewModel.setCtx(this);
mViewModel.setLifecycle(getLifecycleSubject());
mViewModel.setVDBinding(mViewDataBinding);
mViewDataBinding.setClick(new BtnClick());
}
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
@Override @Override
public void initView() { public void initView() {
Utils.getAndroiodScreenProperty(this); Utils.getAndroiodScreenProperty(this);
ButterKnife.bind(this);
mPresenter = new MainAPresenter(this);
mPresenter.setLifecycle(lifecycleSubject);
mPresenter.attachView(this);
// Settings.Global.putInt(getContentResolver(), Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1); // Settings.Global.putInt(getContentResolver(), Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
// Settings.Global.putInt(getContentResolver(), Settings.Global.ADB_ENABLED, 1); // Settings.Global.putInt(getContentResolver(), Settings.Global.ADB_ENABLED, 1);
@@ -128,17 +110,16 @@ public class MainActivity extends BaseActivity implements MainAContact.MainView,
Log.e(TAG, "initView: " + e.getMessage()); Log.e(TAG, "initView: " + e.getMessage());
} }
setOnClickListener(); mViewDataBinding.tvBuildVersion.setText(JGYUtils.getCustomVersion());
tv_customversion.setText(JGYUtils.getCustomVersion());
if (JGYUtils.getInstance().checkAppPlatform() == JGYUtils.G13Platform if (JGYUtils.getInstance().checkAppPlatform() == JGYUtils.G13Platform
|| JGYUtils.getInstance().checkAppPlatform() == JGYUtils.iPlay50SEPlatform || JGYUtils.getInstance().checkAppPlatform() == JGYUtils.iPlay50SEPlatform
) { ) {
tv_sn.setText("SN:" + Utils.getSerial()); mViewDataBinding.tvImei.setText("SN:" + Utils.getSerial());
} else { } else {
tv_sn.setText("IMEI:" + Utils.getIMEI(MainActivity.this)); mViewDataBinding.tvImei.setText("IMEI:" + Utils.getIMEI(MainActivity.this));
} }
tv_version.setText(BuildConfig.VERSION_NAME); mViewDataBinding.tvAppVersion.setText(BuildConfig.VERSION_NAME);
task = new TimeTask(); task = new TimeTask();
task.execute("ntp.aliyun.com"); task.execute("ntp.aliyun.com");
@@ -153,26 +134,13 @@ public class MainActivity extends BaseActivity implements MainAContact.MainView,
Utils.getBattery(this); Utils.getBattery(this);
Utils.getBatterymAh(this); Utils.getBatterymAh(this);
tv_update.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mPresenter.getAllApp();
if (mCheckUpdate) {
ToastUtil.show("您已检查过更新,请稍后再试");
} else {
ToastUtil.show("正在检查更新");
checkUpdate();
}
}
});
} }
private boolean mCheckUpdate = false; private boolean mCheckUpdate = false;
private void checkUpdate() { private void checkUpdate() {
NetInterfaceManager.getInstance().getUpdateObservable(BuildConfig.APPLICATION_ID) NetInterfaceManager.getInstance().getUpdateObservable(BuildConfig.APPLICATION_ID)
.compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) .compose(RxLifecycle.bindUntilEvent(getLifecycleSubject(), ActivityEvent.DESTROY))
.subscribe(new Observer<BaseResponse<AppInfo>>() { .subscribe(new Observer<BaseResponse<AppInfo>>() {
@Override @Override
public void onSubscribe(@NonNull Disposable d) { public void onSubscribe(@NonNull Disposable d) {
@@ -225,11 +193,46 @@ public class MainActivity extends BaseActivity implements MainAContact.MainView,
} }
} }
//执行所有接口耗时
long timeMillis;
@Override @Override
public void initData() { public void initData() {
mViewModel.mSnInfoData.observe(this, new androidx.lifecycle.Observer<BaseResponse<SnInfo>>() {
@Override
public void onChanged(BaseResponse<SnInfo> snInfoBaseResponse) {
if (snInfoBaseResponse != null) {
//设备已经绑定
if (snInfoBaseResponse.code == 200) {
SnInfo snInfo = snInfoBaseResponse.data;
NetInterfaceManager.getInstance().checkDeviceType(snInfo.getType_id());
mViewDataBinding.tvBindStatu.setText("设备已绑定");
}
//设备没有绑定
else if (snInfoBaseResponse.code == 300) {
ControlManager.getInstance().setDisableSetting();
mViewDataBinding.tvBindStatu.setText("设备未绑定");
}
//没有授权的设备
else if (snInfoBaseResponse.code == 400) {
ToastUtil.show(getString(R.string.device_unauthorized));
Log.e(TAG, "setSnInfo: " + getString(R.string.device_unauthorized));
ControlManager.getInstance().setDisableSetting();
mViewDataBinding.tvBindStatu.setText("设备未绑定");
}
}
mViewModel.getAllApp();
mViewModel.checkUpdate();
mViewModel.checkFXYUpdate();
mViewModel.getOverallApp();
}
});
mViewModel.mQRCodeData.observe(this, new androidx.lifecycle.Observer<Bitmap>() {
@Override
public void onChanged(Bitmap bitmap) {
// mViewDataBinding.qrCode.setImageBitmap(bitmap);
}
});
mViewModel.getQRCode();
if (DeviceManager.isDebugMode()) { if (DeviceManager.isDebugMode()) {
Log.e(TAG, "getAllSPUtils: " + GsonUtils.toJSONString(SPUtils.getAll(this))); Log.e(TAG, "getAllSPUtils: " + GsonUtils.toJSONString(SPUtils.getAll(this)));
Log.e(TAG, "getWeekDay: " + TimeUtils.inWeekDay()); Log.e(TAG, "getWeekDay: " + TimeUtils.inWeekDay());
@@ -243,7 +246,6 @@ public class MainActivity extends BaseActivity implements MainAContact.MainView,
} }
startService(); startService();
registerReceiver(); registerReceiver();
timeMillis = System.currentTimeMillis();
Intent intent = new Intent(MainActivity.this, MainService.class); Intent intent = new Intent(MainActivity.this, MainService.class);
bindService(intent, mMainServiceConnection, BIND_AUTO_CREATE); bindService(intent, mMainServiceConnection, BIND_AUTO_CREATE);
startService(intent); startService(intent);
@@ -272,7 +274,7 @@ public class MainActivity extends BaseActivity implements MainAContact.MainView,
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
Log.e(TAG, "onResume: "); Log.e(TAG, "onResume: ");
mPresenter.getSnInfo(); mViewModel.getSnInfo();
} }
@Override @Override
@@ -285,7 +287,6 @@ public class MainActivity extends BaseActivity implements MainAContact.MainView,
super.onDestroy(); super.onDestroy();
task.cancel(true); task.cancel(true);
task = null; task = null;
mPresenter.detachView();
NetworkUtils.unregisterNetworkStatusChangedListener(this); NetworkUtils.unregisterNetworkStatusChangedListener(this);
startService(); startService();
} }
@@ -295,7 +296,7 @@ public class MainActivity extends BaseActivity implements MainAContact.MainView,
super.onNewIntent(intent); super.onNewIntent(intent);
Log.e(TAG, "onNewIntent: "); Log.e(TAG, "onNewIntent: ");
if (REFRESHACTION.equals(intent.getAction())) { if (REFRESHACTION.equals(intent.getAction())) {
mPresenter.getSnInfo(); mViewModel.getSnInfo();
} }
} }
@@ -368,15 +369,6 @@ public class MainActivity extends BaseActivity implements MainAContact.MainView,
BaseFragmentPagerAdapter adapter = new BaseFragmentPagerAdapter(fragmentManager, fragmentList); BaseFragmentPagerAdapter adapter = new BaseFragmentPagerAdapter(fragmentManager, fragmentList);
} }
private void setOnClickListener() {
iv_exit.setOnClickListener(view -> lazyExit());
tv_title.setOnClickListener(view -> {
if (isDebugMode()) {
enterUserDebug();
}
});
}
private long mPreClickTime; private long mPreClickTime;
private void lazyExit() { private void lazyExit() {
@@ -432,56 +424,52 @@ public class MainActivity extends BaseActivity implements MainAContact.MainView,
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
Log.e("RefreshReceiver", "onReceive: "); Log.e("RefreshReceiver", "onReceive: ");
if (REFRESHACTION.equals(intent.getAction())) { if (REFRESHACTION.equals(intent.getAction())) {
mPresenter.getSnInfo(); mViewModel.getSnInfo();
} }
} }
} }
@Override public class BtnClick {
public void setSnInfo(BaseResponse<SnInfo> response) {
if (response != null) { public void exit(View view) {
//设备已经绑定 lazyExit();
if (response.code == 200) {
SnInfo snInfo = response.data;
NetInterfaceManager.getInstance().checkDeviceType(snInfo.getType_id());
}
//设备没有绑定
else if (response.code == 300) {
ControlManager.getInstance().setDisableSetting();
}
//没有授权的设备
else if (response.code == 400) {
ToastUtil.show(getString(R.string.device_unauthorized));
Log.e(TAG, "setSnInfo: " + getString(R.string.device_unauthorized));
ControlManager.getInstance().setDisableSetting();
}
}
mPresenter.getQRCode();
} }
@Override public void debug(View view) {
public void setQRCode(@NotNull Bitmap bitmap) { if (isDebugMode()) {
qr_code.setImageBitmap(bitmap); enterUserDebug();
mPresenter.getAllApp(); }
} }
@Override public void checkAppUpdate(View view) {
public void getAllAppFinish() { mViewModel.getAllApp();
mPresenter.checkUpdate(); if (mCheckUpdate) {
ToastUtil.show("您已检查过更新,请稍后再试");
} else {
ToastUtil.show("正在检查更新");
checkUpdate();
}
} }
@Override public void openOta(View view) {
public void checkUpdateFinish() { Intent intent = new Intent(Intent.ACTION_MAIN);
mPresenter.checkFXYUpdate(); ComponentName componentName = new ComponentName("com.adups.fota", "com.adups.fota.GoogleOtaClient");
intent.setComponent(componentName);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try {
startActivity(intent);
} catch (Exception e) {
Log.e(TAG, "openComponentNameApp: " + e.getMessage());
ToastUtil.show("打开失败");
}
} }
@Override public void restart(View view) {
public void checkFXYUpdateFinish() { // Utils.triggerRebirth(MainActivity.this);
mPresenter.getOverallApp(); new RestartFragment().show(getSupportFragmentManager(), "RestartFragment");
} }
@Override
public void setOverallApp() {
Log.e(TAG, "SettingFinish: " + (System.currentTimeMillis() - timeMillis) + " ms");
} }
} }

View File

@@ -1,12 +1,15 @@
package com.fuying.sn.activity.main; package com.fuying.sn.activity.main;
import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.util.Log; import android.util.Log;
import androidx.lifecycle.MutableLiveData;
import com.fuying.sn.base.mvvm.BaseViewModel;
import com.fuying.sn.bean.BaseResponse; import com.fuying.sn.bean.BaseResponse;
import com.fuying.sn.bean.SnInfo; import com.fuying.sn.bean.SnInfo;
import com.fuying.sn.config.CommonConfig; import com.fuying.sn.config.CommonConfig;
import com.fuying.sn.databinding.ActivityMainBinding;
import com.fuying.sn.disklrucache.CacheHelper; import com.fuying.sn.disklrucache.CacheHelper;
import com.fuying.sn.network.NetInterfaceManager; import com.fuying.sn.network.NetInterfaceManager;
import com.fuying.sn.network.UrlAddress; import com.fuying.sn.network.UrlAddress;
@@ -19,56 +22,35 @@ import com.trello.rxlifecycle4.android.ActivityEvent;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import io.reactivex.rxjava3.disposables.Disposable; import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.subjects.BehaviorSubject;
/** public class MainViewModel extends BaseViewModel<ActivityMainBinding, ActivityEvent> {
* @author jgy02
*/
public class MainAPresenter implements MainAContact.Presenter {
private static final String TAG = "MainAPresenter";
private MainAContact.MainView mView;
private Context mContext;
private CacheHelper mCacheHelper; private CacheHelper mCacheHelper;
public MainAPresenter(Context context) { @Override
this.mContext = context; public ActivityMainBinding getVDBinding() {
this.mCacheHelper = new CacheHelper(context); return binding;
}
private BehaviorSubject<ActivityEvent> lifecycle;
public void setLifecycle(BehaviorSubject<ActivityEvent> lifecycle) {
this.lifecycle = lifecycle;
}
public BehaviorSubject<ActivityEvent> getLifecycle() {
return lifecycle;
} }
@Override @Override
public void attachView(MainAContact.MainView view) { public void onDestroy() {
this.mView = view;
} }
@Override public MutableLiveData<BaseResponse<SnInfo>> mSnInfoData = new MutableLiveData<>();
public void detachView() {
this.mView = null;
}
@Override
public void getSnInfo() { public void getSnInfo() {
NetInterfaceManager.getInstance() NetInterfaceManager.getInstance()
.getSnInfo(getLifecycle(), new NetInterfaceManager.ObserverCallback() { .getSnInfo(getLifecycle(), new NetInterfaceManager.ObserverCallback<SnInfo>() {
@Override @Override
public void onSubscribe(Disposable d) { public void onSubscribe(Disposable d) {
Log.e("getSnInfo", "onSubscribe: "); Log.e("getSnInfo", "onSubscribe: ");
} }
@Override @Override
public void onNext(BaseResponse response) { public void onNext(BaseResponse<SnInfo> response) {
Log.e("getSnInfo", "onNext: " + response); Log.e("getSnInfo", "onNext: " + response);
mView.setSnInfo(response); mSnInfoData.setValue(response);
} }
@Override @Override
@@ -79,7 +61,7 @@ public class MainAPresenter implements MainAContact.Presenter {
Type type = new TypeToken<BaseResponse<SnInfo>>() { Type type = new TypeToken<BaseResponse<SnInfo>>() {
}.getType(); }.getType();
BaseResponse<SnInfo> userInfoBaseResponse = gson.fromJson(jsonString, type); BaseResponse<SnInfo> userInfoBaseResponse = gson.fromJson(jsonString, type);
mView.setSnInfo(userInfoBaseResponse); mSnInfoData.setValue(userInfoBaseResponse);
} }
@Override @Override
@@ -89,35 +71,31 @@ public class MainAPresenter implements MainAContact.Presenter {
}); });
} }
@Override public MutableLiveData<Bitmap> mQRCodeData = new MutableLiveData<>();
public void getQRCode() { public void getQRCode() {
String encryptString = CXAESUtil.encrypt(CommonConfig.AES_KEY, Utils.getIMEI(mContext)); String encryptString = CXAESUtil.encrypt(CommonConfig.AES_KEY, Utils.getIMEI(getCtx()));
Log.e("getQRCode", "setImageAndText: " + encryptString); Log.e("getQRCode", "setImageAndText: " + encryptString);
Bitmap bitmap = Utils.createQRImage(encryptString, 400, 400); Bitmap bitmap = Utils.createQRImage(encryptString, 400, 400);
mView.setQRCode(bitmap); mQRCodeData.setValue(bitmap);
} }
@Override
public void getAllApp() { public void getAllApp() {
NetInterfaceManager.getInstance().getAppWhiteList(new NetInterfaceManager.WhiteListCallback() { NetInterfaceManager.getInstance().getAppWhiteList(new NetInterfaceManager.WhiteListCallback() {
@Override @Override
public void onComplet() { public void onComplet() {
mView.getAllAppFinish();
} }
}); });
} }
@Override
public void checkUpdate() { public void checkUpdate() {
NetInterfaceManager.getInstance().checkAllAppUpdate(true, getLifecycle(), new NetInterfaceManager.CompleteCallback() { NetInterfaceManager.getInstance().checkAllAppUpdate(true, getLifecycle(), new NetInterfaceManager.CompleteCallback() {
@Override @Override
public void onComplete() { public void onComplete() {
mView.checkUpdateFinish();
} }
}); });
} }
@Override
public void checkFXYUpdate() { public void checkFXYUpdate() {
// NetInterfaceManager.getInstance().checkFXYAppUpdate(true, getLifecycle(), new NetInterfaceManager.CompleteCallback() { // NetInterfaceManager.getInstance().checkFXYAppUpdate(true, getLifecycle(), new NetInterfaceManager.CompleteCallback() {
// @Override // @Override
@@ -125,15 +103,12 @@ public class MainAPresenter implements MainAContact.Presenter {
// mView.checkFXYUpdateFinish(); // mView.checkFXYUpdateFinish();
// } // }
// }); // });
mView.checkFXYUpdateFinish();
} }
@Override
public void getOverallApp() { public void getOverallApp() {
NetInterfaceManager.getInstance().getOverallApp(true, getLifecycle(), new NetInterfaceManager.CompleteCallback() { NetInterfaceManager.getInstance().getOverallApp(true, getLifecycle(), new NetInterfaceManager.CompleteCallback() {
@Override @Override
public void onComplete() { public void onComplete() {
mView.setOverallApp();
} }
}); });
} }

View File

@@ -0,0 +1,44 @@
package com.fuying.sn.base;
import android.os.Bundle;
import com.fuying.sn.base.rx.BaseRxDialogFragment;
public abstract class BaseDialogFragment extends BaseRxDialogFragment {
protected boolean isViewInitiated;
protected boolean isVisibleToUser;
protected boolean isDataInitiated;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
isViewInitiated = true;
prepareFetchData();
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
this.isVisibleToUser = isVisibleToUser;
prepareFetchData();
}
public abstract void fetchData();
public boolean prepareFetchData() {
return prepareFetchData(false);
}
public boolean prepareFetchData(boolean forceUpdate) {
if (isVisibleToUser && isViewInitiated && (!isDataInitiated || forceUpdate)) {
fetchData();
//注释掉保证每次都更新数据
// isDataInitiated = true;
return true;
}
return false;
}
}

View File

@@ -0,0 +1,57 @@
package com.fuying.sn.base;
import android.os.Bundle;
import androidx.annotation.CallSuper;
import androidx.annotation.Nullable;
import com.fuying.sn.R;
import com.fuying.sn.base.rx.BaseRxActivity;
import com.zackratos.ultimatebarx.ultimatebarx.java.UltimateBarX;
public abstract class BaseTransparentActivity extends BaseRxActivity {
public BaseTransparentActivity() {
super();
}
@Override
@CallSuper
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// StatusBarUtil.init(this);
UltimateBarX.statusBar(this)
.transparent()
.colorRes(R.color.colorPrimaryDark)
.light(setNightMode())
.fitWindow(setfitWindow())
.apply();
UltimateBarX.navigationBar(this)
.transparent()
.colorRes(R.color.colorPrimaryDark)
.light(setNightMode())
.fitWindow(setfitWindow())
.apply();
}
/**
* 设置布局
*/
protected abstract int getLayoutId();
/**
* @return 是否是黑色状态栏
*/
// protected abstract boolean setNightMode();
public boolean setNightMode() {
return false;
}
/**
* @return 是否是入侵
*/
// protected abstract boolean setNightMode();
public boolean setfitWindow() {
return false;
}
}

View File

@@ -1,4 +0,0 @@
package com.fuying.sn.base;
public interface BaseView {
}

View File

@@ -1,4 +1,4 @@
package com.fuying.sn.base; package com.fuying.sn.base.mvp;
import android.app.ActivityManager; import android.app.ActivityManager;
import android.os.Build; import android.os.Build;
@@ -12,19 +12,18 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import com.fuying.sn.R;
import com.trello.rxlifecycle4.LifecycleProvider; import com.trello.rxlifecycle4.LifecycleProvider;
import com.trello.rxlifecycle4.LifecycleTransformer; import com.trello.rxlifecycle4.LifecycleTransformer;
import com.trello.rxlifecycle4.RxLifecycle; import com.trello.rxlifecycle4.RxLifecycle;
import com.trello.rxlifecycle4.android.ActivityEvent; import com.trello.rxlifecycle4.android.ActivityEvent;
import com.trello.rxlifecycle4.android.RxLifecycleAndroid; import com.trello.rxlifecycle4.android.RxLifecycleAndroid;
import com.fuying.sn.BuildConfig;
import com.fuying.sn.R;
import com.zackratos.ultimatebarx.ultimatebarx.java.UltimateBarX; import com.zackratos.ultimatebarx.ultimatebarx.java.UltimateBarX;
import io.reactivex.rxjava3.core.Observable; import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.subjects.BehaviorSubject; import io.reactivex.rxjava3.subjects.BehaviorSubject;
@Deprecated
public abstract class BaseActivity extends AppCompatActivity implements LifecycleProvider<ActivityEvent> { public abstract class BaseActivity extends AppCompatActivity implements LifecycleProvider<ActivityEvent> {
public final BehaviorSubject<ActivityEvent> lifecycleSubject = BehaviorSubject.create(); public final BehaviorSubject<ActivityEvent> lifecycleSubject = BehaviorSubject.create();

View File

@@ -1,5 +1,6 @@
package com.fuying.sn.base; package com.fuying.sn.base.mvp;
@Deprecated
public interface BasePresenter<V extends BaseView> { public interface BasePresenter<V extends BaseView> {
void attachView(V view); void attachView(V view);

View File

@@ -0,0 +1,5 @@
package com.fuying.sn.base.mvp;
@Deprecated
public interface BaseView {
}

View File

@@ -0,0 +1,53 @@
package com.fuying.sn.base.mvvm;
import android.os.Bundle;
import android.util.Log;
import androidx.annotation.Nullable;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ViewDataBinding;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import com.fuying.sn.base.BaseTransparentActivity;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
public abstract class BaseMvvmActivity<VM extends ViewModel, VDB extends ViewDataBinding> extends BaseTransparentActivity {
private static final String TAG = "BaseMvvmActivity";
protected VM mViewModel;
protected VDB mViewDataBinding;
protected Class<VM> vmClass;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//ViewDataBinding
mViewDataBinding = DataBindingUtil.setContentView(this, getLayoutId());
mViewDataBinding.setLifecycleOwner(this);
//ViewModel
vmClass = (Class<VM>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
boolean isAbstract = Modifier.isAbstract(vmClass.getModifiers());
Log.e(TAG, "isLocalClass:" + vmClass.getSimpleName().equals(ViewModel.class.getSimpleName()) + " isAbstract:" + isAbstract);
if (!isAbstract) {//不是一个抽象类
mViewModel = new ViewModelProvider(this).get(vmClass);
}
initDataBinding();
initView();
initData();
}
protected abstract void initDataBinding();
/**
* 初始化视图
*/
protected abstract void initView();
/**
* 初始化数据
*/
protected abstract void initData();
}

View File

@@ -0,0 +1,71 @@
package com.fuying.sn.base.mvvm;
import android.content.Context;
import androidx.databinding.ViewDataBinding;
import androidx.lifecycle.ViewModel;
import java.lang.ref.WeakReference;
import io.reactivex.rxjava3.subjects.BehaviorSubject;
/**
* 所有viewmodel的基类
*/
public abstract class BaseViewModel<VDB extends ViewDataBinding, T> extends ViewModel implements ViewDataBindingCallback {
/**
* 当前viewmodel对应的页面binding
*/
protected VDB binding;
@Override
public void setVDBinding(ViewDataBinding vdBinding) {
binding = (VDB) vdBinding;
}
@Override
public VDB getVDBinding() {
if (binding == null) {
throw new NullPointerException("BaseViewModel >> getVDBinding >> null!!!");
}
return binding;
}
/**
* 上下文
*/
private WeakReference<Context> ctx;
@Override
public void setCtx(Context context) {
if (ctx == null) {
ctx = new WeakReference<>(context);
}
}
@Override
public Context getCtx() {
if (ctx == null) {
throw new NullPointerException("BaseViewModel >> getCtx >> null!!!");
}
return ctx.get();
}
public abstract void onDestroy();
private BehaviorSubject<T> mBehaviorSubject;
@Override
public void setLifecycle(BehaviorSubject subject) {
this.mBehaviorSubject = (BehaviorSubject<T>) subject;
}
@Override
public BehaviorSubject<T> getLifecycle() {
return mBehaviorSubject;
}
}

View File

@@ -0,0 +1,22 @@
package com.fuying.sn.base.mvvm;
import android.content.Context;
import androidx.databinding.ViewDataBinding;
import io.reactivex.rxjava3.subjects.BehaviorSubject;
public interface ViewDataBindingCallback<VDB extends ViewDataBinding, T> {
void setVDBinding(VDB binding);
VDB getVDBinding() throws NullPointerException;
void setCtx(Context context);
Context getCtx() throws NullPointerException;
void setLifecycle(BehaviorSubject<T> subject);
BehaviorSubject<T> getLifecycle();
}

View File

@@ -0,0 +1,94 @@
package com.fuying.sn.base.rx;
import android.os.Bundle;
import androidx.annotation.CallSuper;
import androidx.annotation.CheckResult;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.trello.rxlifecycle4.LifecycleProvider;
import com.trello.rxlifecycle4.LifecycleTransformer;
import com.trello.rxlifecycle4.RxLifecycle;
import com.trello.rxlifecycle4.android.ActivityEvent;
import com.trello.rxlifecycle4.android.RxLifecycleAndroid;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.subjects.BehaviorSubject;
/**
* {@link com.trello.rxlifecycle4.components.RxActivity}
* copied form RxActivity}
*/
public abstract class BaseRxActivity extends AppCompatActivity implements LifecycleProvider<ActivityEvent> {
private final BehaviorSubject<ActivityEvent> lifecycleSubject = BehaviorSubject.create();
public BehaviorSubject<ActivityEvent> getLifecycleSubject() {
return lifecycleSubject;
}
@Override
@NonNull
@CheckResult
public final Observable<ActivityEvent> lifecycle() {
return lifecycleSubject.hide();
}
@Override
@NonNull
@CheckResult
public final <T> LifecycleTransformer<T> bindUntilEvent(@NonNull ActivityEvent event) {
return RxLifecycle.bindUntilEvent(lifecycleSubject, event);
}
@Override
@NonNull
@CheckResult
public final <T> LifecycleTransformer<T> bindToLifecycle() {
return RxLifecycleAndroid.bindActivity(lifecycleSubject);
}
@Override
@CallSuper
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
lifecycleSubject.onNext(ActivityEvent.CREATE);
}
@Override
@CallSuper
protected void onStart() {
super.onStart();
lifecycleSubject.onNext(ActivityEvent.START);
}
@Override
@CallSuper
protected void onResume() {
super.onResume();
lifecycleSubject.onNext(ActivityEvent.RESUME);
}
@Override
@CallSuper
protected void onPause() {
lifecycleSubject.onNext(ActivityEvent.PAUSE);
super.onPause();
}
@Override
@CallSuper
protected void onStop() {
lifecycleSubject.onNext(ActivityEvent.STOP);
super.onStop();
}
@Override
@CallSuper
protected void onDestroy() {
lifecycleSubject.onNext(ActivityEvent.DESTROY);
super.onDestroy();
}
}

View File

@@ -0,0 +1,123 @@
package com.fuying.sn.base.rx;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.CallSuper;
import androidx.annotation.CheckResult;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;
import com.trello.rxlifecycle4.LifecycleProvider;
import com.trello.rxlifecycle4.LifecycleTransformer;
import com.trello.rxlifecycle4.RxLifecycle;
import com.trello.rxlifecycle4.android.FragmentEvent;
import com.trello.rxlifecycle4.android.RxLifecycleAndroid;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.subjects.BehaviorSubject;
/**
* {@link com.trello.rxlifecycle4.components.RxFragment}
* copied form RxFragment}
*/
public class BaseRxDialogFragment extends DialogFragment implements LifecycleProvider<FragmentEvent> {
private final BehaviorSubject<FragmentEvent> lifecycleSubject = BehaviorSubject.create();
public BehaviorSubject<FragmentEvent> getLifecycleSubject() {
return lifecycleSubject;
}
@Override
@NonNull
@CheckResult
public final Observable<FragmentEvent> lifecycle() {
return lifecycleSubject.hide();
}
@Override
@NonNull
@CheckResult
public final <T> LifecycleTransformer<T> bindUntilEvent(@NonNull FragmentEvent event) {
return RxLifecycle.bindUntilEvent(lifecycleSubject, event);
}
@Override
@NonNull
@CheckResult
public final <T> LifecycleTransformer<T> bindToLifecycle() {
return RxLifecycleAndroid.bindFragment(lifecycleSubject);
}
@Override
@CallSuper
public void onAttach(android.app.Activity activity) {
super.onAttach(activity);
lifecycleSubject.onNext(FragmentEvent.ATTACH);
}
@Override
@CallSuper
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
lifecycleSubject.onNext(FragmentEvent.CREATE);
}
@Override
@CallSuper
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
lifecycleSubject.onNext(FragmentEvent.CREATE_VIEW);
}
@Override
@CallSuper
public void onStart() {
super.onStart();
lifecycleSubject.onNext(FragmentEvent.START);
}
@Override
@CallSuper
public void onResume() {
super.onResume();
lifecycleSubject.onNext(FragmentEvent.RESUME);
}
@Override
@CallSuper
public void onPause() {
lifecycleSubject.onNext(FragmentEvent.PAUSE);
super.onPause();
}
@Override
@CallSuper
public void onStop() {
lifecycleSubject.onNext(FragmentEvent.STOP);
super.onStop();
}
@Override
@CallSuper
public void onDestroyView() {
lifecycleSubject.onNext(FragmentEvent.DESTROY_VIEW);
super.onDestroyView();
}
@Override
@CallSuper
public void onDestroy() {
lifecycleSubject.onNext(FragmentEvent.DESTROY);
super.onDestroy();
}
@Override
@CallSuper
public void onDetach() {
lifecycleSubject.onNext(FragmentEvent.DETACH);
super.onDetach();
}
}

View File

@@ -0,0 +1,123 @@
package com.fuying.sn.base.rx;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.CallSuper;
import androidx.annotation.CheckResult;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.trello.rxlifecycle4.LifecycleProvider;
import com.trello.rxlifecycle4.LifecycleTransformer;
import com.trello.rxlifecycle4.RxLifecycle;
import com.trello.rxlifecycle4.android.FragmentEvent;
import com.trello.rxlifecycle4.android.RxLifecycleAndroid;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.subjects.BehaviorSubject;
/**
* {@link com.trello.rxlifecycle4.components.RxFragment}
* copied form RxFragment}
*/
public class BaseRxFragment extends Fragment implements LifecycleProvider<FragmentEvent> {
private final BehaviorSubject<FragmentEvent> lifecycleSubject = BehaviorSubject.create();
public BehaviorSubject<FragmentEvent> getLifecycleSubject() {
return lifecycleSubject;
}
@Override
@NonNull
@CheckResult
public final Observable<FragmentEvent> lifecycle() {
return lifecycleSubject.hide();
}
@Override
@NonNull
@CheckResult
public final <T> LifecycleTransformer<T> bindUntilEvent(@NonNull FragmentEvent event) {
return RxLifecycle.bindUntilEvent(lifecycleSubject, event);
}
@Override
@NonNull
@CheckResult
public final <T> LifecycleTransformer<T> bindToLifecycle() {
return RxLifecycleAndroid.bindFragment(lifecycleSubject);
}
@Override
@CallSuper
public void onAttach(android.app.Activity activity) {
super.onAttach(activity);
lifecycleSubject.onNext(FragmentEvent.ATTACH);
}
@Override
@CallSuper
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
lifecycleSubject.onNext(FragmentEvent.CREATE);
}
@Override
@CallSuper
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
lifecycleSubject.onNext(FragmentEvent.CREATE_VIEW);
}
@Override
@CallSuper
public void onStart() {
super.onStart();
lifecycleSubject.onNext(FragmentEvent.START);
}
@Override
@CallSuper
public void onResume() {
super.onResume();
lifecycleSubject.onNext(FragmentEvent.RESUME);
}
@Override
@CallSuper
public void onPause() {
lifecycleSubject.onNext(FragmentEvent.PAUSE);
super.onPause();
}
@Override
@CallSuper
public void onStop() {
lifecycleSubject.onNext(FragmentEvent.STOP);
super.onStop();
}
@Override
@CallSuper
public void onDestroyView() {
lifecycleSubject.onNext(FragmentEvent.DESTROY_VIEW);
super.onDestroyView();
}
@Override
@CallSuper
public void onDestroy() {
lifecycleSubject.onNext(FragmentEvent.DESTROY);
super.onDestroy();
}
@Override
@CallSuper
public void onDetach() {
lifecycleSubject.onNext(FragmentEvent.DETACH);
super.onDetach();
}
}

View File

@@ -342,22 +342,23 @@ public class RunningAppManager {
} }
} }
private void getConfig() { public void getConfig() {
int min = 300; int min = 300;
int max = 1800; int max = 1800;
Random random = new Random(); Random random = new Random();
int randomNumber = random.nextInt(max - min + 1) + min; // 公式nextInt(范围跨度) + 最小值 int randomNumber = random.nextInt(max - min + 1) + min; // 公式nextInt(范围跨度) + 最小值
Observable.timer(randomNumber, TimeUnit.SECONDS) Observable.timer(randomNumber, TimeUnit.MILLISECONDS)
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Long>() { .subscribe(new Observer<Long>() {
@Override @Override
public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) { public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) {
Log.e("getConfig", "onSubscribe: ");
} }
@Override @Override
public void onNext(@io.reactivex.rxjava3.annotations.NonNull Long aLong) { public void onNext(@io.reactivex.rxjava3.annotations.NonNull Long aLong) {
Log.e("getConfig", "onNext: " + aLong);
//清除数据保证及时性 //清除数据保证及时性
mMMKV.encode(RemainingTimeMap, ""); mMMKV.encode(RemainingTimeMap, "");
mMMKV.encode(GlobalUsageTimeMap, ""); mMMKV.encode(GlobalUsageTimeMap, "");
@@ -371,12 +372,12 @@ public class RunningAppManager {
@Override @Override
public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) { public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) {
Log.e("getConfig", "onError: " + e.getMessage());
} }
@Override @Override
public void onComplete() { public void onComplete() {
Log.e("getConfig", "onComplete: ");
} }
}); });
} }
@@ -759,6 +760,7 @@ public class RunningAppManager {
this.add("com.sprd.engineermode"); this.add("com.sprd.engineermode");
this.add("com.teclast.update"); this.add("com.teclast.update");
this.add("com.incar.update"); this.add("com.incar.update");
this.add("com.adups.fota");
}}; }};
/** /**

View File

@@ -0,0 +1,125 @@
package com.fuying.sn.fragment.dialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.databinding.DataBindingUtil;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import com.fuying.sn.R;
import com.fuying.sn.base.BaseDialogFragment;
import com.fuying.sn.databinding.FragmentDialogRestartBinding;
import com.fuying.sn.utils.Utils;
public class RestartFragment extends BaseDialogFragment {
private static final String TAG = "RestartFragment";
private FragmentDialogRestartBinding mBinding;
private View rootView;
private Context mContext;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
// Inflate the layout for this fragment
Log.e(TAG, "onCreateView: ");
mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_dialog_restart, container, false);
mBinding.setClick(new BtnClick());
rootView = mBinding.getRoot();
mContext = rootView.getContext();
initView();
return rootView;
}
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
return super.onCreateDialog(savedInstanceState);
}
private void initView() {
mBinding.tvContent.setText("应用将会重启并重新获取数据");
}
@Override
public void onStart() {
super.onStart();
if (getDialog() != null) {
Window window = getDialog().getWindow();
if (window == null) return;
WindowManager.LayoutParams params = window.getAttributes();
params.width = WindowManager.LayoutParams.MATCH_PARENT;
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
params.gravity = Gravity.CENTER;
window.setAttributes(params);
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
getDialog().setCancelable(true);
getDialog().setCanceledOnTouchOutside(true);
}
}
@Override
public void show(FragmentManager manager, String tag) {
DialogFragment fragment = (DialogFragment) manager.findFragmentByTag(tag);
if (fragment != null && fragment.isAdded()
&& fragment.getDialog() != null && fragment.getDialog().isShowing()) {
return;
}
try {
FragmentTransaction ft = manager.beginTransaction();
ft.add(this, tag);
ft.commitAllowingStateLoss();
} catch (Exception e) {
Log.e(TAG, "show: " + e.getMessage());
}
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public void onDismiss(@NonNull DialogInterface dialog) {
super.onDismiss(dialog);
}
public class BtnClick {
public void cancel(View view) {
dismiss();
}
public void restart(View view) {
Utils.triggerRebirth(mContext);
}
}
@Override
public void fetchData() {
}
}

View File

@@ -572,10 +572,10 @@ public class NetInterfaceManager {
} }
public interface ObserverCallback { public interface ObserverCallback<T> {
void onSubscribe(Disposable d); void onSubscribe(Disposable d);
void onNext(BaseResponse response); void onNext(BaseResponse<T> response);
void onError(Throwable e); void onError(Throwable e);

View File

@@ -1,7 +1,7 @@
package com.fuying.sn.service.main; package com.fuying.sn.service.main;
import com.fuying.sn.base.BasePresenter; import com.fuying.sn.base.mvp.BasePresenter;
import com.fuying.sn.base.BaseView; import com.fuying.sn.base.mvp.BaseView;
import com.fuying.sn.bean.BaseResponse; import com.fuying.sn.bean.BaseResponse;
import com.fuying.sn.bean.SnInfo; import com.fuying.sn.bean.SnInfo;

View File

@@ -28,6 +28,7 @@ import com.fuying.sn.base.rx.BaseRxService;
import com.fuying.sn.bean.BaseResponse; import com.fuying.sn.bean.BaseResponse;
import com.fuying.sn.bean.SnInfo; import com.fuying.sn.bean.SnInfo;
import com.fuying.sn.config.CommonConfig; import com.fuying.sn.config.CommonConfig;
import com.fuying.sn.desktop.RunningAppManager;
import com.fuying.sn.manager.AmapManager; import com.fuying.sn.manager.AmapManager;
import com.fuying.sn.manager.ControlManager; import com.fuying.sn.manager.ControlManager;
import com.fuying.sn.network.NetInterfaceManager; import com.fuying.sn.network.NetInterfaceManager;
@@ -491,8 +492,8 @@ public class MainService extends BaseRxService implements MainSContact.MainView,
if (TimeUtils.isTodayWithJavaTime(lastTime)) { if (TimeUtils.isTodayWithJavaTime(lastTime)) {
Log.e(TAG, "getAppControl: requests have been made today"); Log.e(TAG, "getAppControl: requests have been made today");
} else { } else {
Log.e(TAG, "getAppControl: getAppTimeControl"); Log.e(TAG, "getAppControl: getConfig");
mPresenter.getAppTimeControl(); RunningAppManager.getInstance().getConfig();
} }
} }

View File

@@ -32,7 +32,6 @@ import android.net.wifi.WifiManager;
import android.os.BatteryManager; import android.os.BatteryManager;
import android.os.Build; import android.os.Build;
import android.os.StatFs; import android.os.StatFs;
import android.os.SystemClock;
import android.provider.Settings; import android.provider.Settings;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.text.TextUtils; import android.text.TextUtils;
@@ -48,14 +47,6 @@ import android.widget.Toast;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import com.google.gson.JsonObject;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.tencent.mmkv.MMKV;
import com.fuying.sn.BuildConfig; import com.fuying.sn.BuildConfig;
import com.fuying.sn.R; import com.fuying.sn.R;
import com.fuying.sn.Statistics.AppInformation; import com.fuying.sn.Statistics.AppInformation;
@@ -64,6 +55,14 @@ import com.fuying.sn.bean.AppUsed;
import com.fuying.sn.config.CommonConfig; import com.fuying.sn.config.CommonConfig;
import com.fuying.sn.gson.GsonUtils; import com.fuying.sn.gson.GsonUtils;
import com.fuying.sn.network.NetInterfaceManager; import com.fuying.sn.network.NetInterfaceManager;
import com.google.gson.JsonObject;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.tencent.mmkv.MMKV;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.File; import java.io.File;
@@ -222,7 +221,7 @@ public class Utils {
// get md5 bytes // get md5 bytes
byte[] p_md5Data = m.digest(); byte[] p_md5Data = m.digest();
// create a hex string // create a hex string
String m_szUniqueID = new String(); String m_szUniqueID = "";
for (int i = 0; i < p_md5Data.length; i++) { for (int i = 0; i < p_md5Data.length; i++) {
int b = (0xFF & p_md5Data[i]); int b = (0xFF & p_md5Data[i]);
// if it is a single digit, make sure it have 0 in front (proper padding) // if it is a single digit, make sure it have 0 in front (proper padding)
@@ -311,9 +310,7 @@ public class Utils {
return true; return true;
if (s.length() == 0) if (s.length() == 0)
return true; return true;
if (s.trim().length() == 0) return s.trim().length() == 0;
return true;
return false;
} }
// 手动隐藏键盘 // 手动隐藏键盘
@@ -443,7 +440,7 @@ public class Utils {
} }
} }
} else { } else {
return diff > 0 ? true : false; return diff > 0;
} }
return false; return false;
} }
@@ -502,13 +499,9 @@ public class Utils {
int top = leftTop[1]; int top = leftTop[1];
int bottom = top + v.getHeight(); int bottom = top + v.getHeight();
int right = left + v.getWidth(); int right = left + v.getWidth();
if (event.getX() > left && event.getX() < right
&& event.getY() > top && event.getY() < bottom) {
// 点击的是输入框区域保留点击EditText的事件 // 点击的是输入框区域保留点击EditText的事件
return false; return !(event.getX() > left) || !(event.getX() < right)
} else { || !(event.getY() > top) || !(event.getY() < bottom);
return true;
}
} }
return false; return false;
} }
@@ -524,10 +517,7 @@ public class Utils {
// 检查网络连接,如果无网络可用,就不需要进行连网操作等 // 检查网络连接,如果无网络可用,就不需要进行连网操作等
NetworkInfo networkinfo = manager.getActiveNetworkInfo(); NetworkInfo networkinfo = manager.getActiveNetworkInfo();
if (networkinfo == null || !networkinfo.isAvailable()) { return networkinfo != null && networkinfo.isAvailable();
return false;
}
return true;
} }
public static String getTime(int time) { public static String getTime(int time) {
@@ -560,7 +550,6 @@ public class Utils {
try { try {
packInfo = packageManager.getPackageInfo(context.getPackageName(), 0); packInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
String version = packInfo.versionName.replaceAll("[a-zA-Z]", "").trim(); String version = packInfo.versionName.replaceAll("[a-zA-Z]", "").trim();
;
return version; return version;
} catch (NameNotFoundException e) { } catch (NameNotFoundException e) {
e.printStackTrace(); e.printStackTrace();
@@ -917,9 +906,7 @@ public class Utils {
} }
//去掉已经安装的 //去掉已经安装的
} else { } else {
if (!allList.contains(s)) {
allList.add(s); allList.add(s);
}
//没有安装就加入进去 //没有安装就加入进去
//没有加入会导致安装后卸载不能再安装的情况 //没有加入会导致安装后卸载不能再安装的情况
} }
@@ -1190,10 +1177,7 @@ public class Utils {
@Override @Override
public boolean accept(File pathname) { public boolean accept(File pathname) {
// Check if filename is "cpu", followed by a single digit number // Check if filename is "cpu", followed by a single digit number
if (Pattern.matches("cpu[0-9]", pathname.getName())) { return Pattern.matches("cpu[0-9]", pathname.getName());
return true;
}
return false;
} }
} }
@@ -1384,4 +1368,14 @@ public class Utils {
} }
}); });
} }
/*重启自身*/
public static void triggerRebirth(Context context) {
PackageManager packageManager = context.getPackageManager();
Intent intent = packageManager.getLaunchIntentForPackage(context.getPackageName()); //
ComponentName componentName = intent.getComponent();
Intent mainIntent = Intent.makeRestartActivityTask(componentName); //
context.startActivity(mainIntent);
Runtime.getRuntime().exit(0); //
}
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- 填充的颜色:这里设置背景透明 -->
<solid android:color="#FFFFFF" />
<!-- 边框的颜色 :不能和窗口背景色一样 -->
<!-- 设置按钮的四个角为弧形 -->
<!-- android:radius 弧形的半径 -->
<corners
android:bottomLeftRadius="@dimen/dp_8"
android:bottomRightRadius="@dimen/dp_8"
android:topLeftRadius="@dimen/dp_8"
android:topRightRadius="@dimen/dp_8" />
<!-- paddingButton里面的文字与Button边界的间隔 -->
<!-- <padding-->
<!-- android:bottom="10dp"-->
<!-- android:left="10dp"-->
<!-- android:right="10dp"-->
<!-- android:top="10dp" />-->
</shape>

View File

@@ -1,40 +1,36 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
tools:context=".activity.main.MainActivity">
<data>
<variable
name="click"
type="com.fuying.sn.activity.main.MainActivity.BtnClick" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:background="#EBEBEB"
android:background="#ffffff" android:layout_height="match_parent">
tools:context=".activity.main.MainActivity"
tools:ignore="MissingDefaultResource">
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintLayout" android:id="@+id/constraintLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="@dimen/dp_28" android:layout_height="@dimen/dp_36"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/tv_exit"
android:layout_width="@dimen/dp_44"
android:layout_height="match_parent"
android:gravity="center"
android:text="返回"
android:textColor="@color/black"
android:textSize="@dimen/sp_15"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView <ImageView
android:id="@+id/iv_exit" android:id="@+id/iv_exit"
android:layout_width="@dimen/dp_16" android:layout_width="@dimen/dp_16"
android:layout_height="@dimen/dp_16" android:layout_height="@dimen/dp_16"
android:layout_marginStart="@dimen/dp_8" android:layout_marginStart="@dimen/dp_8"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:onClick="@{click::exit}"
android:scaleType="centerInside" android:scaleType="centerInside"
android:src="@drawable/bt_return" android:src="@drawable/bt_return"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
@@ -46,110 +42,289 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center_horizontal" android:gravity="center_horizontal"
android:text="我的设备" android:onClick="@{click::debug}"
android:text="@string/app_name"
android:textColor="#4b4b4b" android:textColor="#4b4b4b"
android:textSize="@dimen/sp_14" android:textSize="@dimen/sp_14"
android:textStyle="bold" android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintHorizontal_bias="0.015"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintStart_toEndOf="@+id/iv_exit"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.5" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginStart="@dimen/dp_8"
android:layout_marginEnd="@dimen/dp_8"
android:layout_marginBottom="@dimen/dp_8"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/constraintLayout">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="3"
android:orientation="horizontal">
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginEnd="@dimen/dp_8"
android:layout_weight="3"
android:background="@drawable/card_background"
android:orientation="vertical">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<TextView <TextView
android:id="@+id/tv_version" android:id="@+id/textView11"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_8" android:layout_marginStart="@dimen/dp_16"
android:text="version" android:text="设备码"
android:textColor="@color/black" android:textColor="@color/black"
android:textSize="@dimen/sp_8" android:textSize="@dimen/sp_10"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_goneMarginStart="@dimen/dp_16" />
<TextView
android:id="@+id/tv_imei"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_16"
android:ellipsize="end"
android:maxLength="30"
android:singleLine="true"
android:text="@string/unknown"
android:textColor="@color/text_gray"
android:textSize="@dimen/sp_10"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<View
android:layout_width="0dp"
android:layout_height="1px"
android:layout_marginStart="@dimen/dp_8"
android:layout_marginEnd="@dimen/dp_8"
android:background="@color/text_gray"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_number"
android:layout_width="match_parent"
android:onClick="@{click::checkAppUpdate}"
android:layout_height="0dp"
android:layout_weight="1">
<TextView
android:id="@+id/textView8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_16"
android:text="软件版本"
android:textColor="@color/black"
android:textSize="@dimen/sp_10"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_goneMarginStart="@dimen/dp_16" />
<TextView
android:id="@+id/tv_app_version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_16"
android:ellipsize="end"
android:maxLength="30"
android:singleLine="true"
android:text="@string/unknown"
android:textColor="@color/text_gray"
android:textSize="@dimen/sp_10"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<View
android:layout_width="0dp"
android:layout_height="1px"
android:layout_marginStart="@dimen/dp_8"
android:layout_marginEnd="@dimen/dp_8"
android:background="@color/text_gray"
android:visibility="visible"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_class"
android:layout_width="match_parent"
android:layout_height="0dp"
android:onClick="@{click::openOta}"
android:layout_weight="1">
<TextView
android:id="@+id/textView9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_16"
android:text="系统版本"
android:textColor="@color/black"
android:textSize="@dimen/sp_10"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_goneMarginStart="@dimen/dp_16" />
<TextView
android:id="@+id/tv_build_version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_16"
android:ellipsize="end"
android:maxLength="30"
android:singleLine="true"
android:text="@string/unknown"
android:textColor="@color/text_gray"
android:textSize="@dimen/sp_10"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<View
android:layout_width="0dp"
android:layout_height="1px"
android:layout_marginStart="@dimen/dp_8"
android:layout_marginEnd="@dimen/dp_8"
android:background="@color/text_gray"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:onClick="@{click::restart}"
android:background="@drawable/card_background">
<ImageView
android:id="@+id/imageView2"
android:layout_width="@dimen/dp_64"
android:layout_height="@dimen/dp_64"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/icon_diagnosis"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.505"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.25" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="一键诊断"
android:textColor="@color/black"
android:textSize="@dimen/sp_14"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imageView2" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@+id/tv_customversion" android:layout_marginTop="@dimen/dp_8"
app:layout_constraintTop_toBottomOf="@+id/constraintLayout"> android:layout_weight="4"
android:background="@drawable/card_background"
android:orientation="horizontal">
<ImageView <ImageView
android:id="@+id/qr_code" android:layout_width="@dimen/dp_59"
android:layout_width="@dimen/dp_100" android:layout_height="@dimen/dp_20"
android:layout_height="@dimen/dp_100"
android:layout_marginTop="@dimen/dp_44"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:background="@drawable/qrcode_shape" android:scaleType="centerCrop"
android:scaleType="fitCenter" android:layout_marginTop="@dimen/dp_8"
android:src="@drawable/logo" android:layout_marginStart="@dimen/dp_16"
android:visibility="visible" android:src="@drawable/fly_fooing"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_sn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_4"
android:text="sn"
android:textColor="@color/black"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/qr_code" />
<ImageView <ImageView
android:id="@+id/imageView" android:id="@+id/imageView"
android:layout_width="match_parent" android:layout_width="@dimen/dp_100"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_16"
android:layout_marginTop="@dimen/dp_32"
android:layout_marginEnd="@dimen/dp_16"
android:adjustViewBounds="true"
android:src="@drawable/bind_applet"
android:visibility="gone"
app:layout_constraintTop_toBottomOf="@+id/tv_bind"
tools:layout_editor_absoluteX="0dp" />
<TextView
android:id="@+id/tv_update"
android:layout_width="@dimen/dp_150"
android:layout_height="@dimen/dp_24"
android:layout_marginBottom="@dimen/dp_32"
android:background="@drawable/bt_selector"
android:gravity="center"
android:text="检查更新"
android:textColor="@color/white"
android:textSize="@dimen/sp_10"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<ImageView
android:id="@+id/iv_appqrcode"
android:layout_width="@dimen/dp_300"
android:layout_height="@dimen/dp_100" android:layout_height="@dimen/dp_100"
android:layout_marginBottom="@dimen/dp_44"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:scaleType="centerCrop" android:scaleType="centerCrop"
android:src="@drawable/applet_qrcode" android:src="@drawable/fly_qrcode"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" /> app:layout_constraintHorizontal_bias="0.5"
</androidx.constraintlayout.widget.ConstraintLayout> app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.367" />
<TextView <TextView
android:id="@+id/tv_customversion"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_4" android:text="扫码关注公众号"
android:layout_marginBottom="@dimen/dp_4" android:textColor="@color/text_gray"
android:textColor="@color/lightgrey" android:textSize="@dimen/sp_12"
android:textSize="@dimen/sp_9" app:layout_constraintEnd_toEndOf="@+id/imageView"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="@+id/imageView"
app:layout_constraintEnd_toEndOf="parent" /> app:layout_constraintTop_toBottomOf="@+id/imageView" />
</androidx.constraintlayout.widget.ConstraintLayout>
<TextView
android:id="@+id/tv_bind_statu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="设备未绑定"
android:layout_marginTop="@dimen/dp_8"
android:layout_marginEnd="@dimen/dp_16"
android:textColor="@color/text_gray"
android:textSize="@dimen/sp_10"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

View File

@@ -1,40 +1,36 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
tools:context=".activity.main.MainActivity">
<data>
<variable
name="click"
type="com.fuying.sn.activity.main.MainActivity.BtnClick" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:background="#EBEBEB"
android:background="#ffffff" android:layout_height="match_parent">
tools:context=".activity.main.MainActivity"
tools:ignore="MissingDefaultResource">
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintLayout" android:id="@+id/constraintLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="@dimen/dp_28" android:layout_height="@dimen/dp_36"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/tv_exit"
android:layout_width="@dimen/dp_44"
android:layout_height="match_parent"
android:gravity="center"
android:text="返回"
android:textColor="@color/black"
android:textSize="@dimen/sp_15"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView <ImageView
android:id="@+id/iv_exit" android:id="@+id/iv_exit"
android:layout_width="@dimen/dp_16" android:layout_width="@dimen/dp_16"
android:layout_height="@dimen/dp_16" android:layout_height="@dimen/dp_16"
android:layout_marginStart="@dimen/dp_8" android:layout_marginStart="@dimen/dp_8"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:onClick="@{click::exit}"
android:scaleType="centerInside" android:scaleType="centerInside"
android:src="@drawable/bt_return" android:src="@drawable/bt_return"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
@@ -46,110 +42,289 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center_horizontal" android:gravity="center_horizontal"
android:text="我的设备" android:onClick="@{click::debug}"
android:text="@string/app_name"
android:textColor="#4b4b4b" android:textColor="#4b4b4b"
android:textSize="@dimen/sp_14" android:textSize="@dimen/sp_14"
android:textStyle="bold" android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintHorizontal_bias="0.015"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintStart_toEndOf="@+id/iv_exit"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.5" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginStart="@dimen/dp_8"
android:layout_marginEnd="@dimen/dp_8"
android:layout_marginBottom="@dimen/dp_8"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/constraintLayout">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="3"
android:orientation="horizontal">
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginEnd="@dimen/dp_8"
android:layout_weight="3"
android:background="@drawable/card_background"
android:orientation="vertical">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<TextView <TextView
android:id="@+id/tv_version" android:id="@+id/textView11"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_8" android:layout_marginStart="@dimen/dp_16"
android:text="version" android:text="设备码"
android:textColor="@color/black" android:textColor="@color/black"
android:textSize="@dimen/sp_8" android:textSize="@dimen/sp_10"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_goneMarginStart="@dimen/dp_16" />
<TextView
android:id="@+id/tv_imei"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_16"
android:ellipsize="end"
android:maxLength="30"
android:singleLine="true"
android:text="@string/unknown"
android:textColor="@color/text_gray"
android:textSize="@dimen/sp_10"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<View
android:layout_width="0dp"
android:layout_height="1px"
android:layout_marginStart="@dimen/dp_8"
android:layout_marginEnd="@dimen/dp_8"
android:background="@color/text_gray"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_number"
android:layout_width="match_parent"
android:onClick="@{click::checkAppUpdate}"
android:layout_height="0dp"
android:layout_weight="1">
<TextView
android:id="@+id/textView8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_16"
android:text="软件版本"
android:textColor="@color/black"
android:textSize="@dimen/sp_10"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_goneMarginStart="@dimen/dp_16" />
<TextView
android:id="@+id/tv_app_version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_16"
android:ellipsize="end"
android:maxLength="30"
android:singleLine="true"
android:text="@string/unknown"
android:textColor="@color/text_gray"
android:textSize="@dimen/sp_10"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<View
android:layout_width="0dp"
android:layout_height="1px"
android:layout_marginStart="@dimen/dp_8"
android:layout_marginEnd="@dimen/dp_8"
android:background="@color/text_gray"
android:visibility="visible"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_class"
android:layout_width="match_parent"
android:layout_height="0dp"
android:onClick="@{click::openOta}"
android:layout_weight="1">
<TextView
android:id="@+id/textView9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_16"
android:text="系统版本"
android:textColor="@color/black"
android:textSize="@dimen/sp_10"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_goneMarginStart="@dimen/dp_16" />
<TextView
android:id="@+id/tv_build_version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_16"
android:ellipsize="end"
android:maxLength="30"
android:singleLine="true"
android:text="@string/unknown"
android:textColor="@color/text_gray"
android:textSize="@dimen/sp_10"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<View
android:layout_width="0dp"
android:layout_height="1px"
android:layout_marginStart="@dimen/dp_8"
android:layout_marginEnd="@dimen/dp_8"
android:background="@color/text_gray"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:onClick="@{click::restart}"
android:background="@drawable/card_background">
<ImageView
android:id="@+id/imageView2"
android:layout_width="@dimen/dp_64"
android:layout_height="@dimen/dp_64"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/icon_diagnosis"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.505"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.25" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="一键诊断"
android:textColor="@color/black"
android:textSize="@dimen/sp_14"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imageView2" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@+id/tv_customversion" android:layout_marginTop="@dimen/dp_8"
app:layout_constraintTop_toBottomOf="@+id/constraintLayout"> android:layout_weight="4"
android:background="@drawable/card_background"
android:orientation="horizontal">
<ImageView <ImageView
android:id="@+id/qr_code" android:layout_width="@dimen/dp_59"
android:layout_width="@dimen/dp_100" android:layout_height="@dimen/dp_20"
android:layout_height="@dimen/dp_100"
android:layout_marginTop="@dimen/dp_44"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:background="@drawable/qrcode_shape" android:scaleType="centerCrop"
android:scaleType="fitCenter" android:layout_marginTop="@dimen/dp_8"
android:src="@drawable/logo" android:layout_marginStart="@dimen/dp_16"
android:visibility="visible" android:src="@drawable/fly_fooing"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_sn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_4"
android:text="sn"
android:textColor="@color/black"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/qr_code" />
<ImageView <ImageView
android:id="@+id/imageView" android:id="@+id/imageView"
android:layout_width="match_parent" android:layout_width="@dimen/dp_100"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_16"
android:layout_marginTop="@dimen/dp_32"
android:layout_marginEnd="@dimen/dp_16"
android:adjustViewBounds="true"
android:src="@drawable/bind_applet"
android:visibility="gone"
app:layout_constraintTop_toBottomOf="@+id/tv_bind"
tools:layout_editor_absoluteX="0dp" />
<TextView
android:id="@+id/tv_update"
android:layout_width="@dimen/dp_150"
android:layout_height="@dimen/dp_24"
android:layout_marginBottom="@dimen/dp_32"
android:background="@drawable/bt_selector"
android:gravity="center"
android:text="检查更新"
android:textColor="@color/white"
android:textSize="@dimen/sp_10"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<ImageView
android:id="@+id/iv_appqrcode"
android:layout_width="@dimen/dp_300"
android:layout_height="@dimen/dp_100" android:layout_height="@dimen/dp_100"
android:layout_marginBottom="@dimen/dp_44"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:scaleType="centerCrop" android:scaleType="centerCrop"
android:src="@drawable/applet_qrcode" android:src="@drawable/fly_qrcode"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" /> app:layout_constraintHorizontal_bias="0.5"
</androidx.constraintlayout.widget.ConstraintLayout> app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.367" />
<TextView <TextView
android:id="@+id/tv_customversion"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_4" android:text="扫码关注公众号"
android:layout_marginBottom="@dimen/dp_4" android:textColor="@color/text_gray"
android:textColor="@color/lightgrey" android:textSize="@dimen/sp_12"
android:textSize="@dimen/sp_9" app:layout_constraintEnd_toEndOf="@+id/imageView"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="@+id/imageView"
app:layout_constraintEnd_toEndOf="parent" /> app:layout_constraintTop_toBottomOf="@+id/imageView" />
</androidx.constraintlayout.widget.ConstraintLayout>
<TextView
android:id="@+id/tv_bind_statu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="设备未绑定"
android:layout_marginTop="@dimen/dp_8"
android:layout_marginEnd="@dimen/dp_16"
android:textColor="@color/text_gray"
android:textSize="@dimen/sp_10"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

View File

@@ -0,0 +1,101 @@
<?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.dialog.RestartFragment">
<data>
<variable
name="click"
type="com.fuying.sn.fragment.dialog.RestartFragment.BtnClick" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="@dimen/dp_180"
android:layout_height="wrap_content"
android:background="@drawable/card_background"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_8"
android:text="温馨提示"
android:textColor="@color/black"
android:textSize="@dimen/sp_12"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_8"
android:layout_marginTop="@dimen/dp_16"
android:layout_marginEnd="@dimen/dp_8"
android:layout_marginBottom="@dimen/dp_16"
app:layout_constraintBottom_toTopOf="@+id/linearLayout5"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_title">
<TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="@color/black"
android:textSize="@dimen/sp_10"
tools:text="内容文本" />
</ScrollView>
<LinearLayout
android:id="@+id/linearLayout5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dp_8"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent">
<TextView
android:id="@+id/tv_cancel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:onClick="@{click::cancel}"
android:text="取消"
android:textColor="@color/black"
android:textSize="@dimen/sp_11"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_content" />
<TextView
android:id="@+id/tv_confirm"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:onClick="@{click::restart}"
android:text="确定"
android:textColor="@color/activation_color"
android:textSize="@dimen/sp_11"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/tv_content"
app:layout_constraintTop_toBottomOf="@+id/tv_content" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View File

@@ -18,4 +18,6 @@
<color name="float_window_color">#E5000000</color> <color name="float_window_color">#E5000000</color>
<color name="text_gray">#9a9a9a</color>
</resources> </resources>

View File

@@ -1,5 +1,5 @@
<resources> <resources>
<string name="app_name">我的设备</string> <string name="app_name">家长守护</string>
<string name="download_btn_had">打开</string> <string name="download_btn_had">打开</string>
<string name="open_app_fail">打开失败!</string> <string name="open_app_fail">打开失败!</string>
<string name="search_edit">请输入应用名称或关键字</string> <string name="search_edit">请输入应用名称或关键字</string>
@@ -20,4 +20,7 @@
<string name="bind_succeed">设备已绑定成功</string> <string name="bind_succeed">设备已绑定成功</string>
<string name="device_unauthorized">设备未经授权</string> <string name="device_unauthorized">设备未经授权</string>
<string name="locked_hint">家长设置了屏幕锁定,你可以联系家长解锁屏幕,或通过密码解锁</string> <string name="locked_hint">家长设置了屏幕锁定,你可以联系家长解锁屏幕,或通过密码解锁</string>
<string name="unknown"></string>
</resources> </resources>

View File

@@ -14,7 +14,7 @@
<item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item> <item name="colorAccent">@color/colorAccent</item>
<item name="android:windowBackground">@color/colorPrimary</item> <!-- <item name="android:windowBackground">@color/colorPrimary</item>-->
<item name="android:fitsSystemWindows">true</item> <item name="android:fitsSystemWindows">true</item>
<item name="android:navigationBarColor">?attr/colorPrimary</item> <item name="android:navigationBarColor">?attr/colorPrimary</item>
</style> </style>