diff --git a/app/build.gradle b/app/build.gradle index 477f402..38d659d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId "com.uiui.os" minSdkVersion 24 targetSdkVersion 29 - versionCode 7 - versionName "1.6" + versionCode 8 + versionName "1.7" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -149,6 +149,9 @@ dependencies { testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + //glide + implementation 'com.github.bumptech.glide:glide:4.11.0' + annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0' //RxJava // implementation 'io.reactivex.rxjava2:rxjava:2.2.12' // implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' @@ -184,6 +187,8 @@ dependencies { //aria implementation 'com.arialyy.aria:core:3.8.15' annotationProcessor 'com.arialyy.aria:compiler:3.8.15' + //videoplayer + implementation 'cn.jzvd:jiaozivideoplayer:7.7.0' } preBuild { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 47e3266..fcb62b3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -52,7 +52,7 @@ android:enabled="true" android:exported="true" /> diff --git a/app/src/main/java/com/uiui/os/activity/EmergencyActivity.java b/app/src/main/java/com/uiui/os/activity/EmergencyActivity.java index 3cfd656..3a88629 100644 --- a/app/src/main/java/com/uiui/os/activity/EmergencyActivity.java +++ b/app/src/main/java/com/uiui/os/activity/EmergencyActivity.java @@ -4,6 +4,7 @@ import androidx.appcompat.app.AppCompatActivity; import android.app.StatusBarManager; import android.content.BroadcastReceiver; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.net.Uri; @@ -22,6 +23,7 @@ import android.widget.TextView; import com.uiui.os.R; import com.uiui.os.bean.BaseResponse; import com.uiui.os.network.NetInterfaceManager; +import com.uiui.os.receiver.BootReceiver; import com.uiui.os.utils.ToastUtil; import java.util.ArrayList; @@ -57,6 +59,12 @@ public class EmergencyActivity extends AppCompatActivity { super.onCreate(savedInstanceState); setContentView(R.layout.activity_emergency); ButterKnife.bind(this); + + //发送紧急广播 + Intent bootIntent = new Intent(BootReceiver.SOS); + bootIntent.setComponent(new ComponentName("com.uiui.sn", "com.uiui.sn.receiver.BootReceiver")); + sendBroadcast(bootIntent); + Intent intent = getIntent(); // String setting_sos = intent.getStringExtra("setting_sos"); // if (TextUtils.isEmpty(setting_sos)) { @@ -84,23 +92,23 @@ public class EmergencyActivity extends AppCompatActivity { .subscribe(new Observer() { @Override public void onSubscribe(@NonNull Disposable d) { - Log.e("SOSRecord", "onSubscribe: "); + Log.e("SOSRecordApi", "onSubscribe: "); } @Override public void onNext(@NonNull BaseResponse baseResponse) { - Log.e("SOSRecord", "onNext: " + baseResponse); + Log.e("SOSRecordApi", "onNext: " + baseResponse); } @Override public void onError(@NonNull Throwable e) { - Log.e("SOSRecord", "onError: " + e.getMessage()); + Log.e("SOSRecordApi", "onError: " + e.getMessage()); } @Override public void onComplete() { - Log.e("SOSRecord", "onComplete: "); + Log.e("SOSRecordApi", "onComplete: "); } }); needDial = true; diff --git a/app/src/main/java/com/uiui/os/activity/NoticeActivity.java b/app/src/main/java/com/uiui/os/activity/NoticeActivity.java index 5dec510..5c68b26 100644 --- a/app/src/main/java/com/uiui/os/activity/NoticeActivity.java +++ b/app/src/main/java/com/uiui/os/activity/NoticeActivity.java @@ -10,13 +10,19 @@ import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.Button; +import android.widget.ImageView; import android.widget.TextView; import com.blankj.utilcode.util.FileUtils; +import com.bumptech.glide.Glide; import com.uiui.os.R; import com.uiui.os.bean.AlarmClockData; +import com.uiui.os.bean.BaseResponse; +import com.uiui.os.network.NetInterfaceManager; import com.uiui.os.utils.AlarmUtils; +import com.uiui.os.utils.FileUtil; import com.uiui.os.utils.Utils; +import com.uiui.os.view.JzvdStdAssert; import java.io.File; import java.io.FileInputStream; @@ -24,22 +30,33 @@ import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import java.util.function.Predicate; -import java.util.stream.Collectors; import butterknife.BindView; import butterknife.ButterKnife; +import cn.jzvd.Jzvd; +import cn.jzvd.JzvdStd; +import io.reactivex.rxjava3.annotations.NonNull; +import io.reactivex.rxjava3.core.Observer; +import io.reactivex.rxjava3.disposables.Disposable; public class NoticeActivity extends AppCompatActivity { @BindView(R.id.tv_title) TextView tv_title; @BindView(R.id.bt_ok) Button bt_ok; - @BindView(R.id.constraintLayout) - ConstraintLayout constraintLayout; + @BindView(R.id.cl_voice) + ConstraintLayout cl_voice; + @BindView(R.id.cl_vp) + ConstraintLayout cl_vp; + @BindView(R.id.jz_video) + JzvdStdAssert jz_video; + @BindView(R.id.imageView) + ImageView imageView; + private AlarmClockData alarmClockData; int code; private MediaPlayer mediaPlayer; + private String TAG = NoticeActivity.class.getSimpleName(); @Override @@ -63,7 +80,7 @@ public class NoticeActivity extends AppCompatActivity { } private void showData(AlarmClockData alarmClockData) { - tv_title.setText(alarmClockData.getRemarks()); + tv_title.setText(alarmClockData.getTitle()); bt_ok.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -76,14 +93,41 @@ public class NoticeActivity extends AppCompatActivity { data.add(alarm); } AlarmUtils.getInstance().setAlarmString(data); - finish(); + NetInterfaceManager.getInstance() + .getUpdateAlarmObservable(alarmClockData.getId()) + .subscribe(new Observer() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("showData", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse baseResponse) { + Log.e("showData", "onNext: " + baseResponse); + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("showData", "onError: " + e.getMessage()); + onComplete(); + } + + @Override + public void onComplete() { + Log.e("showData", "onComplete: "); + finish(); + } + }); + } }); - String url = alarmClockData.getVoice(); - String md5 = alarmClockData.getVoice_md5(); - if (!TextUtils.isEmpty(url)) { - constraintLayout.setVisibility(View.VISIBLE); - String fileName = Utils.getFileNamefromURL(url); + String voiceUrl = alarmClockData.getVoice(); + String voicemd5 = alarmClockData.getVoice_md5(); + String filePath = alarmClockData.getFile(); + + if (!TextUtils.isEmpty(voiceUrl)) { + cl_voice.setVisibility(View.VISIBLE); + String fileName = Utils.getFileNamefromURL(voiceUrl); File file = new File(Utils.getDownLoadPath(NoticeActivity.this) + fileName); String fileMD5 = FileUtils.getFileMD5ToString(file); // if (!md5.equals(fileMD5)) { @@ -107,8 +151,26 @@ public class NoticeActivity extends AppCompatActivity { } // } } else { - constraintLayout.setVisibility(View.GONE); + cl_voice.setVisibility(View.GONE); } + if (!TextUtils.isEmpty(filePath)) { + cl_vp.setVisibility(View.VISIBLE); + String fileType = FileUtil.getFileType(filePath); + Log.e(TAG, "showData: " + fileType); + if (FileUtil.isPictureFile(fileType)) { + jz_video.setVisibility(View.GONE); + imageView.setVisibility(View.VISIBLE); + Glide.with(NoticeActivity.this).load(filePath).into(imageView); + } else if (FileUtil.isVideoFile(fileType)) { + jz_video.setVisibility(View.VISIBLE); + imageView.setVisibility(View.GONE); + jz_video.setUp(filePath, ""); + jz_video.startVideo(); + } + } else { + cl_vp.setVisibility(View.GONE); + } + } @Override @@ -122,4 +184,18 @@ public class NoticeActivity extends AppCompatActivity { mediaPlayer = null; } } + + @Override + public void onBackPressed() { + if (Jzvd.backPress()) { + return; + } + super.onBackPressed(); + } + + @Override + protected void onPause() { + super.onPause(); + Jzvd.releaseAllVideos(); + } } diff --git a/app/src/main/java/com/uiui/os/activity/main/MainActivity.java b/app/src/main/java/com/uiui/os/activity/main/MainActivity.java index 3bc89f8..0d5c15e 100644 --- a/app/src/main/java/com/uiui/os/activity/main/MainActivity.java +++ b/app/src/main/java/com/uiui/os/activity/main/MainActivity.java @@ -23,20 +23,17 @@ import androidx.viewpager.widget.ViewPager; import com.alarmclock.uiui.IAlarmAidlInterface; import com.google.gson.Gson; -import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; import com.uiui.os.BuildConfig; import com.uiui.os.R; import com.uiui.os.base.BaseActivity; import com.uiui.os.bean.AlarmItem; -import com.uiui.os.bean.BaseResponse; +import com.uiui.os.bean.DesktopIcon; import com.uiui.os.fragment.AppListFragment; import com.uiui.os.fragment.BaseFragmentPagerAdapter; import com.uiui.os.fragment.CustomFragment; -import com.uiui.os.network.NetInterfaceManager; import com.uiui.os.utils.APKUtils; import com.uiui.os.utils.AppUsedTimeUtils; -import com.uiui.os.utils.Utils; import com.uiui.os.view.ScaleCircleNavigator; import net.lucode.hackware.magicindicator.MagicIndicator; @@ -48,22 +45,21 @@ import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; -import io.reactivex.rxjava3.core.Observer; -import io.reactivex.rxjava3.disposables.Disposable; -public class MainActivity extends BaseActivity { - private String TAG = MainActivity.class.getSimpleName(); +public class MainActivity extends BaseActivity implements MainContact.MainView { + private static String TAG = MainActivity.class.getSimpleName(); + private MainPresenter mMainPresenter; @BindView(R.id.viewPager) - ViewPager viewPager; + ViewPager mViewPager; @BindView(R.id.magicIndicator) - MagicIndicator magicIndicator; + MagicIndicator mMagicIndicator; - private FragmentManager fragmentManager; - private FragmentTransaction fragmentTransaction; - private BaseFragmentPagerAdapter adapter; - private List fragments; - private CustomFragment customFragment; + private FragmentManager mFragmentManager; + private FragmentTransaction mFragmentTransaction; + private BaseFragmentPagerAdapter mBaseFragmentPagerAdapter; + private List mFragments; + private CustomFragment mCustomFragment; @Override public int getLayoutId() { @@ -73,13 +69,59 @@ public class MainActivity extends BaseActivity { @Override public void initView() { ButterKnife.bind(this); - fragmentManager = getSupportFragmentManager(); - fragmentTransaction = fragmentManager.beginTransaction(); - fragments = new ArrayList<>(); - adapter = new BaseFragmentPagerAdapter(fragmentManager, fragments); + mMainPresenter = new MainPresenter(this); + mMainPresenter.attachView(this); + mMainPresenter.setLifecycle(lifecycleSubject); + + mFragmentManager = getSupportFragmentManager(); + mFragmentTransaction = mFragmentManager.beginTransaction(); + mFragments = new ArrayList<>(); + mBaseFragmentPagerAdapter = new BaseFragmentPagerAdapter(mFragmentManager, mFragments); // fragmentTransaction.add(R.id.viewPager, appListFragment); // fragmentTransaction.commit(); - customFragment = new CustomFragment(); + mCustomFragment = new CustomFragment(); + mFragments.add(mCustomFragment); + + mMainPresenter.getDesktopLayout(); + ArrayList desktopIcons = APKUtils.queryFilterAppInfo(this); + + int x = 0; + for (int i = 0; i <= desktopIcons.size(); i++) { + if (i != 0 && i % APP_LIST_SIZE == 0) { + AppListFragment appListFragment = new AppListFragment(); + appListFragment.setAppList(new ArrayList<>(desktopIcons.subList(x, i))); + mFragments.add(appListFragment); + x = i; + } else if (i == desktopIcons.size()) { + AppListFragment appListFragment = new AppListFragment(); + mFragments.add(appListFragment); + appListFragment.setAppList(new ArrayList<>(desktopIcons.subList(x, i))); + } + } + + ScaleCircleNavigator scaleCircleNavigator = new ScaleCircleNavigator(this); + scaleCircleNavigator.setCircleCount(mFragments.size()); + scaleCircleNavigator.setNormalCircleColor(Color.DKGRAY); + scaleCircleNavigator.setSelectedCircleColor(Color.LTGRAY); + scaleCircleNavigator.setCircleClickListener(new ScaleCircleNavigator.OnCircleClickListener() { + @Override + public void onClick(int index) { + + } + }); + + mViewPager.setAdapter(mBaseFragmentPagerAdapter); + mMagicIndicator.setNavigator(scaleCircleNavigator); + ViewPagerHelper.bind(mMagicIndicator, mViewPager); + if (mFragments.size() > 1) { + mViewPager.setCurrentItem(1); + } + } + + @Override + public void initData() { + registmNewAppReceiver(); + registerSOSNumberReceiver(); mAlarmServiceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { @@ -97,27 +139,6 @@ public class MainActivity extends BaseActivity { bindAlarmService(); } - private void getAlarmData() { - if (mIAlarmAidlInterface == null) { - bindAlarmService(); - return; - } - try { - String json = mIAlarmAidlInterface.getAlarm(); - Log.e(TAG, "onServiceConnected: " + json); - if ("暂无闹钟".equalsIgnoreCase(json) || TextUtils.isEmpty(json)) { - customFragment.setAlarmItem(null); - return; - } - Type type = new TypeToken>() { - }.getType(); - List alarmItem = new Gson().fromJson(json, type); - customFragment.setAlarmItem(alarmItem); - } catch (RemoteException e) { - e.printStackTrace(); - } - } - private ServiceConnection mAlarmServiceConnection; private IAlarmAidlInterface mIAlarmAidlInterface; @@ -134,48 +155,32 @@ public class MainActivity extends BaseActivity { } } - private final static int APP_LIST_SIZE = 12; - - @Override - public void initData() { - registmNewAppReceiver(); - registerSOSNumberReceiver(); - fragments.add(customFragment); - ArrayList applicationInfoList = APKUtils.queryFilterAppInfo(this); - int x = 0; - for (int i = 0; i <= applicationInfoList.size(); i++) { - if (i != 0 && i % APP_LIST_SIZE == 0) { - AppListFragment appListFragment = new AppListFragment(); - appListFragment.setAppList(new ArrayList<>(applicationInfoList.subList(x, i))); - fragments.add(appListFragment); - x = i; - } else if (i == applicationInfoList.size()) { - AppListFragment appListFragment = new AppListFragment(); - fragments.add(appListFragment); - appListFragment.setAppList(new ArrayList<>(applicationInfoList.subList(x, i))); - } + private void getAlarmData() { + if (mIAlarmAidlInterface == null) { + bindAlarmService(); + return; } - viewPager.setAdapter(adapter); - ScaleCircleNavigator scaleCircleNavigator = new ScaleCircleNavigator(this); - scaleCircleNavigator.setCircleCount(fragments.size()); - scaleCircleNavigator.setNormalCircleColor(Color.DKGRAY); - scaleCircleNavigator.setSelectedCircleColor(Color.LTGRAY); - scaleCircleNavigator.setCircleClickListener(new ScaleCircleNavigator.OnCircleClickListener() { - @Override - public void onClick(int index) { - + try { + String json = mIAlarmAidlInterface.getAlarm(); + Log.e(TAG, "onServiceConnected: " + json); + if ("暂无闹钟".equalsIgnoreCase(json) || TextUtils.isEmpty(json)) { + mCustomFragment.setAlarmItem(null); + return; } - }); - magicIndicator.setNavigator(scaleCircleNavigator); - ViewPagerHelper.bind(magicIndicator, viewPager); - if (fragments.size() > 1) { - viewPager.setCurrentItem(1); + Type type = new TypeToken>() { + }.getType(); + List alarmItem = new Gson().fromJson(json, type); + mCustomFragment.setAlarmItem(alarmItem); + } catch (RemoteException e) { + e.printStackTrace(); } } + private final static int APP_LIST_SIZE = 3 * 4; + private void addData() { List fragmentList = new ArrayList<>(); - ArrayList applicationInfoList = APKUtils.queryFilterAppInfo(this); + ArrayList applicationInfoList = APKUtils.queryFilterAppInfo(this); int x = 0; for (int i = 0; i <= applicationInfoList.size(); i++) { if (i != 0 && i % APP_LIST_SIZE == 0) { @@ -190,13 +195,13 @@ public class MainActivity extends BaseActivity { } } for (int i = 1; i <= fragmentList.size(); i++) { - if (fragments.get(i) != null) { - adapter.replaceFragment(i, fragmentList.get(i - 1)); - fragments.remove(i); - fragments.add(i, fragmentList.get(i - 1)); + if (mFragments.get(i) != null) { + mBaseFragmentPagerAdapter.replaceFragment(i, fragmentList.get(i - 1)); + mFragments.remove(i); + mFragments.add(i, fragmentList.get(i - 1)); } else { - adapter.addFragment(fragmentList.get(i - 1)); - fragments.add(fragmentList.get(i - 1)); + mBaseFragmentPagerAdapter.addFragment(fragmentList.get(i - 1)); + mFragments.add(fragmentList.get(i - 1)); } } } @@ -221,7 +226,7 @@ public class MainActivity extends BaseActivity { default: break; case Intent.ACTION_MAIN: - viewPager.setCurrentItem(1); + mViewPager.setCurrentItem(1); break; } } @@ -231,14 +236,6 @@ public class MainActivity extends BaseActivity { super.onConfigurationChanged(newConfig); } - @Override - protected void onDestroy() { - super.onDestroy(); - if (mNewAppReceiver != null) { - unregisterReceiver(mNewAppReceiver); - } - } - @Override protected void onStart() { super.onStart(); @@ -250,86 +247,13 @@ public class MainActivity extends BaseActivity { @Override protected void onResume() { super.onResume(); - SendRunningApp(MainActivity.this); + mMainPresenter.sendRunningInfo(); } - private void SendRunningApp(Context context) { - AppUsedTimeUtils.getInstance().setAppPackageName(BuildConfig.APPLICATION_ID); - AppUsedTimeUtils.getInstance().setStartTime(System.currentTimeMillis()); - long time = AppUsedTimeUtils.getInstance().getStartTime(); - JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty("app_package", BuildConfig.APPLICATION_ID); - jsonObject.addProperty("version_name", APKUtils.getAPPVersionName(context, BuildConfig.APPLICATION_ID)); - jsonObject.addProperty("start_time", time / 1000); - String jsonString = jsonObject.toString(); - Log.e(TAG, "SendRunningApp: " + jsonString); - NetInterfaceManager.getInstance() - .getRunningAppObservable(jsonString) - .subscribe(new Observer() { - @Override - public void onSubscribe(Disposable d) { - Log.e("SendRunningApp", "onSubscribe: "); - } - - @Override - public void onNext(BaseResponse baseResponse) { - Log.e("SendRunningApp", "onSubscribe: " + baseResponse); - } - - @Override - public void onError(Throwable e) { - Log.e("SendRunningApp", "onError: " + e.getMessage()); - onComplete(); - } - - @Override - public void onComplete() { - Log.e("SendRunningApp", "onComplete: "); - } - }); - } - - @Override protected void onRestart() { super.onRestart(); - AppUsedTimeUtils.getInstance().setEndTime(System.currentTimeMillis()); - String packagename = AppUsedTimeUtils.getInstance().getAppPackageName(); - Log.e(TAG, "onRestart packagename == " + packagename); - if (!TextUtils.isEmpty(packagename)) { - Log.e(TAG, "onRestart: " + APKUtils.getAppNameByPackage(MainActivity.this, packagename)); - Log.e(TAG, "onRestart: " + packagename); - NetInterfaceManager.getInstance().getAppUsageRecordControl() - .sendappUsageRecord(Utils.getSerial(), - APKUtils.getAppNameByPackage(MainActivity.this, packagename), - packagename, - AppUsedTimeUtils.getInstance().getStartTime() / 1000, - AppUsedTimeUtils.getInstance().getEndTime() / 1000) - .subscribe(new Observer() { - @Override - public void onSubscribe(Disposable d) { - Log.e("sendappUsageRecord", "onSubscribe: "); - } - - @Override - public void onNext(BaseResponse baseResponse) { - Log.e("sendappUsageRecord", "onNext: " + baseResponse); - } - - @Override - public void onError(Throwable e) { - Log.e("sendappUsageRecord", "onError: " + e.getMessage()); - onComplete(); - } - - @Override - public void onComplete() { - Log.e("sendappUsageRecord", "onComplete: "); - } - }); - } else { - Log.e("onRestart", "app = null" + packagename); - } + mMainPresenter.sendAPPUsage(); } @Override @@ -343,6 +267,15 @@ public class MainActivity extends BaseActivity { AppUsedTimeUtils.getInstance().setEndTime(System.currentTimeMillis()); } + @Override + protected void onDestroy() { + super.onDestroy(); + mMainPresenter.detachView(); + if (mNewAppReceiver != null) { + unregisterReceiver(mNewAppReceiver); + } + } + private void registmNewAppReceiver() { mNewAppReceiver = new NewAppReceiver(); IntentFilter filter = new IntentFilter(); @@ -386,7 +319,27 @@ public class MainActivity extends BaseActivity { Log.e(TAG, "onReceive: " + intent.getAction()); String setting_sos = intent.getStringExtra("setting_sos"); if (TextUtils.isEmpty(setting_sos)) return; - customFragment.setSosNumber(); + mCustomFragment.setSosNumber(); } } + + @Override + public void getDesktopLayoutFinish() { + + } + + @Override + public void updateDesktopLayoutFinish() { + + } + + @Override + public void sendAPPUsageFinish() { + + } + + @Override + public void sendRunningInfoFinish() { + + } } diff --git a/app/src/main/java/com/uiui/os/activity/main/MainContact.java b/app/src/main/java/com/uiui/os/activity/main/MainContact.java index d30dc75..80ceb75 100644 --- a/app/src/main/java/com/uiui/os/activity/main/MainContact.java +++ b/app/src/main/java/com/uiui/os/activity/main/MainContact.java @@ -2,20 +2,23 @@ package com.uiui.os.activity.main; import com.uiui.os.base.BasePresenter; import com.uiui.os.base.BaseView; -import com.uiui.os.bean.AlarmClockData; - -import java.util.List; public class MainContact { - public interface Presenter extends BasePresenter { - //设置所有信息 - void getAlarmClock(); - + public interface Presenter extends BasePresenter { + /*获取桌面布局*/ + void getDesktopLayout(); + /*更新桌面布局*/ + void updateDesktopLayout(); + /*上传正在运行的APP*/ + void sendAPPUsage(); + /*上传后台运行的APP*/ + void sendRunningInfo(); } public interface MainView extends BaseView { - //获取所有信息 - void setAlarmClock(List dataList); - + void getDesktopLayoutFinish(); + void updateDesktopLayoutFinish(); + void sendAPPUsageFinish(); + void sendRunningInfoFinish(); } } diff --git a/app/src/main/java/com/uiui/os/activity/main/MainPresenter.java b/app/src/main/java/com/uiui/os/activity/main/MainPresenter.java index 5cb52e8..2e1aca5 100644 --- a/app/src/main/java/com/uiui/os/activity/main/MainPresenter.java +++ b/app/src/main/java/com/uiui/os/activity/main/MainPresenter.java @@ -1,36 +1,35 @@ package com.uiui.os.activity.main; import android.content.Context; +import android.text.TextUtils; import android.util.Log; -import com.tencent.mmkv.MMKV; +import com.google.gson.JsonObject; +import com.trello.rxlifecycle4.RxLifecycle; import com.trello.rxlifecycle4.android.ActivityEvent; -import com.uiui.os.bean.AlarmClockData; +import com.uiui.os.BuildConfig; import com.uiui.os.bean.BaseResponse; +import com.uiui.os.bean.NetDesktopIcon; import com.uiui.os.network.NetInterfaceManager; -import com.uiui.os.utils.AlarmUtils; +import com.uiui.os.utils.APKUtils; +import com.uiui.os.utils.AppUsedTimeUtils; +import com.uiui.os.utils.Utils; import java.util.List; +import io.reactivex.rxjava3.annotations.NonNull; import io.reactivex.rxjava3.core.Observer; import io.reactivex.rxjava3.disposables.Disposable; import io.reactivex.rxjava3.subjects.BehaviorSubject; - -/** - * MainActivity和MainService 的 Presenter - * - * @author jgy02 - */ public class MainPresenter implements MainContact.Presenter { private static final String TAG = MainPresenter.class.getSimpleName(); - private static final int OK = 200; private MainContact.MainView mView; private Context mContext; private BehaviorSubject lifecycle; - public void setLifecycle(BehaviorSubject lifecycle) { + void setLifecycle(BehaviorSubject lifecycle) { this.lifecycle = lifecycle; } @@ -38,13 +37,13 @@ public class MainPresenter implements MainContact.Presenter { return lifecycle; } - public MainPresenter(Context context) { + MainPresenter(Context context) { this.mContext = context; Log.e(TAG, "MainPresenter: " + context.getClass()); } @Override - public void attachView(@androidx.annotation.NonNull MainContact.MainView view) { + public void attachView(MainContact.MainView view) { this.mView = view; } @@ -53,37 +52,117 @@ public class MainPresenter implements MainContact.Presenter { this.mView = null; } - @Override - public void getAlarmClock() { - MMKV mmkv = MMKV.defaultMMKV(); - NetInterfaceManager.getInstance().getAlarmClockApiObservable() - .subscribe(new Observer>>() { + public void getDesktopLayout() { + NetInterfaceManager.getInstance().getDesktopLayoutObservable() + .compose(RxLifecycle.bindUntilEvent(lifecycle, ActivityEvent.DESTROY)) + .subscribe(new Observer>>() { @Override - public void onSubscribe(Disposable d) { - Log.e("getAlarmClock", "onSubscribe: "); + public void onSubscribe(@NonNull Disposable d) { + Log.e("getDesktopLayout", "onSubscribe: "); } @Override - public void onNext(BaseResponse> listBaseResponse) { - Log.e("getAlarmClock", "onNext: "+listBaseResponse); - if (listBaseResponse.code == 200) { - List data = listBaseResponse.data; - AlarmUtils.getInstance().setAlarmClockData(data); - } else { - - } + public void onNext(@NonNull BaseResponse> listBaseResponse) { + Log.e("getDesktopLayout", "onNext: " + listBaseResponse); } @Override - public void onError(Throwable e) { - Log.e("getAlarmClock", "onError: " + e.getMessage()); + public void onError(@NonNull Throwable e) { + Log.e("getDesktopLayout", "onError: " + e.getMessage()); onComplete(); } @Override public void onComplete() { - Log.e("getAlarmClock", "onComplete: "); + Log.e("getDesktopLayout", "onComplete: "); + } + }); + } + + @Override + public void updateDesktopLayout() { + + } + + @Override + public void sendAPPUsage() { + AppUsedTimeUtils.getInstance().setEndTime(System.currentTimeMillis()); + String packagename = AppUsedTimeUtils.getInstance().getAppPackageName(); + Log.e(TAG, "onRestart packagename == " + packagename); + if (!TextUtils.isEmpty(packagename)) { + Log.e(TAG, "onRestart: " + APKUtils.getAppNameByPackage(mContext, packagename)); + Log.e(TAG, "onRestart: " + packagename); + NetInterfaceManager.getInstance().getAppUsageRecordControl() + .sendappUsageRecord(Utils.getSerial(), + APKUtils.getAppNameByPackage(mContext, packagename), + packagename, + AppUsedTimeUtils.getInstance().getStartTime() / 1000, + AppUsedTimeUtils.getInstance().getEndTime() / 1000) + .compose(RxLifecycle.bindUntilEvent(lifecycle, ActivityEvent.DESTROY)) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e("sendAPPUsage", "onSubscribe: "); + } + + @Override + public void onNext(BaseResponse baseResponse) { + Log.e("sendAPPUsage", "onNext: " + baseResponse); + } + + @Override + public void onError(Throwable e) { + Log.e("sendAPPUsage", "onError: " + e.getMessage()); + onComplete(); + } + + @Override + public void onComplete() { + Log.e("sendAPPUsage", "onComplete: "); + mView.sendAPPUsageFinish(); + } + }); + } else { + Log.e("onRestart", "app = null" + packagename); + mView.sendAPPUsageFinish(); + } + } + + @Override + public void sendRunningInfo() { + AppUsedTimeUtils.getInstance().setAppPackageName(BuildConfig.APPLICATION_ID); + AppUsedTimeUtils.getInstance().setStartTime(System.currentTimeMillis()); + long time = AppUsedTimeUtils.getInstance().getStartTime(); + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("app_package", BuildConfig.APPLICATION_ID); + jsonObject.addProperty("version_name", APKUtils.getAPPVersionName(mContext, BuildConfig.APPLICATION_ID)); + jsonObject.addProperty("start_time", time / 1000); + String jsonString = jsonObject.toString(); + Log.e(TAG, "sendRunningInfo: " + jsonString); + NetInterfaceManager.getInstance() + .getRunningAppObservable(jsonString) + .compose(RxLifecycle.bindUntilEvent(lifecycle, ActivityEvent.DESTROY)) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e("sendRunningInfo", "onSubscribe: "); + } + + @Override + public void onNext(BaseResponse baseResponse) { + Log.e("sendRunningInfo", "onNext: " + baseResponse); + } + + @Override + public void onError(Throwable e) { + Log.e("sendRunningInfo", "onError: " + e.getMessage()); + onComplete(); + } + + @Override + public void onComplete() { + Log.e("sendRunningInfo", "onComplete: "); } }); } diff --git a/app/src/main/java/com/uiui/os/adapter/APPListAdapter.java b/app/src/main/java/com/uiui/os/adapter/APPListAdapter.java index d80a832..274f3be 100644 --- a/app/src/main/java/com/uiui/os/adapter/APPListAdapter.java +++ b/app/src/main/java/com/uiui/os/adapter/APPListAdapter.java @@ -51,7 +51,7 @@ public class APPListAdapter extends RecyclerView.Adapter holder.root.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - APKUtils.openApp(mContext, info.getPackageName()); + APKUtils.openPackage(mContext, info.getPackageName()); } }); } diff --git a/app/src/main/java/com/uiui/os/adapter/NotificationAdapter.java b/app/src/main/java/com/uiui/os/adapter/NotificationAdapter.java index 705b97b..0667223 100644 --- a/app/src/main/java/com/uiui/os/adapter/NotificationAdapter.java +++ b/app/src/main/java/com/uiui/os/adapter/NotificationAdapter.java @@ -25,7 +25,7 @@ public class NotificationAdapter extends RecyclerView.Adapter { + private final BehaviorSubject lifecycleSubject = BehaviorSubject.create(); + + public BaseFragment() { + super(); + } + + @ContentView + public BaseFragment(@LayoutRes int contentLayoutId) { + super(contentLayoutId); + } + + @Override + @NonNull + @CheckResult + public final Observable lifecycle() { + return lifecycleSubject.hide(); + } + + @Override + @NonNull + @CheckResult + public final LifecycleTransformer bindUntilEvent(@NonNull FragmentEvent event) { + return RxLifecycle.bindUntilEvent(lifecycleSubject, event); + } + + @Override + @NonNull + @CheckResult + public final LifecycleTransformer bindToLifecycle() { + return RxLifecycleAndroid.bindFragment(lifecycleSubject); + } + + @Override + public void onAttach(android.app.Activity activity) { + super.onAttach(activity); + lifecycleSubject.onNext(FragmentEvent.ATTACH); + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + lifecycleSubject.onNext(FragmentEvent.CREATE); + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + lifecycleSubject.onNext(FragmentEvent.CREATE_VIEW); + } + + @Override + public void onStart() { + super.onStart(); + lifecycleSubject.onNext(FragmentEvent.START); + } + + @Override + public void onResume() { + super.onResume(); + lifecycleSubject.onNext(FragmentEvent.RESUME); + } + + @Override + public void onPause() { + lifecycleSubject.onNext(FragmentEvent.PAUSE); + super.onPause(); + } + + @Override + public void onStop() { + lifecycleSubject.onNext(FragmentEvent.STOP); + super.onStop(); + } + + @Override + public void onDestroyView() { + lifecycleSubject.onNext(FragmentEvent.DESTROY_VIEW); + super.onDestroyView(); + } + + @Override + public void onDestroy() { + lifecycleSubject.onNext(FragmentEvent.DESTROY); + super.onDestroy(); + } + + @Override + public void onDetach() { + lifecycleSubject.onNext(FragmentEvent.DETACH); + super.onDetach(); + } +} diff --git a/app/src/main/java/com/uiui/os/bean/AlarmClockData.java b/app/src/main/java/com/uiui/os/bean/AlarmClockData.java index daad1af..1b56d61 100644 --- a/app/src/main/java/com/uiui/os/bean/AlarmClockData.java +++ b/app/src/main/java/com/uiui/os/bean/AlarmClockData.java @@ -14,9 +14,11 @@ public class AlarmClockData implements Serializable { int id; int type; String time; - String remarks; + String title; String voice; String voice_md5; + String file; + boolean finished = false; public int getId() { @@ -43,12 +45,12 @@ public class AlarmClockData implements Serializable { this.time = time; } - public String getRemarks() { - return remarks; + public String getTitle() { + return title; } - public void setRemarks(String remarks) { - this.remarks = remarks; + public void setTitle(String title) { + this.title = title; } public String getVoice() { @@ -67,6 +69,14 @@ public class AlarmClockData implements Serializable { this.voice_md5 = voice_md5; } + public String getFile() { + return file; + } + + public void setFile(String file) { + this.file = file; + } + public boolean isFinished() { return finished; } @@ -81,7 +91,6 @@ public class AlarmClockData implements Serializable { return JsonParser.parseString(new Gson().toJson(this)).getAsJsonObject().toString(); } - @Override public boolean equals(@Nullable Object obj) { if (obj == null) return false; @@ -89,9 +98,10 @@ public class AlarmClockData implements Serializable { if (id != ((AlarmClockData) obj).id) return false; if (type != ((AlarmClockData) obj).type) return false; if (!time.equals(((AlarmClockData) obj).time)) return false; - if (!remarks.equals(((AlarmClockData) obj).remarks)) return false; + if (!title.equals(((AlarmClockData) obj).title)) return false; if (!voice.equals(((AlarmClockData) obj).voice)) return false; if (!voice_md5.equals(((AlarmClockData) obj).voice_md5)) return false; + if (!file.equals(((AlarmClockData) obj).file)) return false; return true; } } diff --git a/app/src/main/java/com/uiui/os/bean/DesktopIcon.java b/app/src/main/java/com/uiui/os/bean/DesktopIcon.java new file mode 100644 index 0000000..c494944 --- /dev/null +++ b/app/src/main/java/com/uiui/os/bean/DesktopIcon.java @@ -0,0 +1,107 @@ +package com.uiui.os.bean; + +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.graphics.drawable.Drawable; +import android.os.Parcel; +import android.os.Parcelable; + +import java.io.Serializable; + +public class DesktopIcon implements Serializable , Parcelable { + private static final long serialVersionUID = 3358230413497783708L; + + String packageName; + Drawable icon; + String lable; + int position; + + private DesktopIcon() { + + } + + private DesktopIcon(Parcel in) { + packageName = in.readStringNoHelper(); + lable = in.readStringNoHelper(); + position = in.readInt(); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeStringNoHelper(packageName); + dest.writeStringNoHelper(lable); + dest.writeInt(position); + } + + @Override + public int describeContents() { + return 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public DesktopIcon createFromParcel(Parcel in) { + return new DesktopIcon(in); + } + + @Override + public DesktopIcon[] newArray(int size) { + return new DesktopIcon[size]; + } + }; + + public String getPackageName() { + return packageName; + } + + public void setPackageName(String packageName) { + this.packageName = packageName; + } + + public Drawable getIcon() { + return icon; + } + + public void setIcon(Drawable icon) { + this.icon = icon; + } + + public String getLable() { + return lable; + } + + public void setLable(String lable) { + this.lable = lable; + } + + public int getPosition() { + return position; + } + + public void setPosition(int position) { + this.position = position; + } + + public static DesktopIcon creatDesktopIcon(Context context, ApplicationInfo applicationInfo) { + PackageManager pm = context.getPackageManager(); + DesktopIcon desktopIcon = new DesktopIcon(); + desktopIcon.setPackageName(applicationInfo.packageName); + desktopIcon.setIcon(applicationInfo.loadIcon(pm)); + desktopIcon.setLable(applicationInfo.loadLabel(pm).toString()); + desktopIcon.setPosition(0); + return desktopIcon; + } + + public static DesktopIcon creatDesktopIcon(Context context, ApplicationInfo applicationInfo, int position) { + PackageManager pm = context.getPackageManager(); + DesktopIcon desktopIcon = new DesktopIcon(); + desktopIcon.setPackageName(applicationInfo.packageName); + desktopIcon.setIcon(applicationInfo.loadIcon(pm)); + desktopIcon.setLable(applicationInfo.loadLabel(pm).toString()); + desktopIcon.setPosition(position); + return desktopIcon; + } + +} diff --git a/app/src/main/java/com/uiui/os/bean/NetDesktopIcon.java b/app/src/main/java/com/uiui/os/bean/NetDesktopIcon.java new file mode 100644 index 0000000..d932cc2 --- /dev/null +++ b/app/src/main/java/com/uiui/os/bean/NetDesktopIcon.java @@ -0,0 +1,57 @@ +package com.uiui.os.bean; + +import android.graphics.Bitmap; + +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; + +public class NetDesktopIcon implements Serializable { + private static final long serialVersionUID = 7070889522236163187L; + int id; + String name; + @SerializedName("package") + String packages; + Bitmap icon; + int num; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPackages() { + return packages; + } + + public void setPackages(String packages) { + this.packages = packages; + } + + public Bitmap getIcon() { + return icon; + } + + public void setIcon(Bitmap icon) { + this.icon = icon; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } +} diff --git a/app/src/main/java/com/uiui/os/fragment/AppListFragment.java b/app/src/main/java/com/uiui/os/fragment/AppListFragment.java index 900ab69..96439f4 100644 --- a/app/src/main/java/com/uiui/os/fragment/AppListFragment.java +++ b/app/src/main/java/com/uiui/os/fragment/AppListFragment.java @@ -20,6 +20,7 @@ import android.widget.TextView; import com.google.gson.JsonObject; import com.uiui.os.R; import com.uiui.os.bean.BaseResponse; +import com.uiui.os.bean.DesktopIcon; import com.uiui.os.network.NetInterfaceManager; import com.uiui.os.utils.APKUtils; import com.uiui.os.utils.BitmapUtils; @@ -48,7 +49,7 @@ public class AppListFragment extends Fragment { private String mParam1; private String mParam2; - private ArrayList applicationInfos; + private ArrayList mDesktopIcons; private MyGridLayout gridLayout; private String TAG = AppListFragment.class.getSimpleName(); @@ -78,7 +79,7 @@ public class AppListFragment extends Fragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState != null) { - applicationInfos = savedInstanceState.getParcelableArrayList("applicationInfos"); + mDesktopIcons = savedInstanceState.getParcelableArrayList("applicationInfos"); } if (getArguments() != null) { mParam1 = getArguments().getString(ARG_PARAM1); @@ -97,8 +98,8 @@ public class AppListFragment extends Fragment { } private void initView() { - if (applicationInfos.size() != 12) { - applicationInfos.addAll(new ArrayList<>(Arrays.asList(new ApplicationInfo[12 - applicationInfos.size()]))); + if (mDesktopIcons.size() != 12) { + mDesktopIcons.addAll(new ArrayList<>(Arrays.asList(new DesktopIcon[12 - mDesktopIcons.size()]))); } gridLayout = rootView.findViewById(R.id.list); if (getActivity().getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { @@ -116,24 +117,24 @@ public class AppListFragment extends Fragment { ImageView iv = view.findViewById(R.id.iv); TextView tv = view.findViewById(R.id.tv); LinearLayout linearLayout = view.findViewById(R.id.btn_booktag); - ApplicationInfo applicationInfo = applicationInfos.get(index); + DesktopIcon desktopIcon = mDesktopIcons.get(index); - if (applicationInfo != null) { - Log.e(TAG, "getView: " + applicationInfo.packageName); - int i = IconUtils.appClassNameList.indexOf(applicationInfo.packageName); + if (desktopIcon != null) { + Log.e(TAG, "getView: " + desktopIcon.getPackageName()); + int i = IconUtils.appClassNameList.indexOf(desktopIcon.getPackageName()); if (i != -1) { - String val = IconUtils.appIconList.get(i); + String val = IconUtils.appIconList2.get(i); int resID = getActivity().getResources().getIdentifier(val, "drawable", "com.uiui.os"); if (resID == 0) { - Log.e(TAG, "getView: not found src : " + applicationInfo.packageName); - iv.setImageDrawable(applicationInfo.loadIcon(pm)); + Log.e(TAG, "getView: not found src : " + desktopIcon.getPackageName()); + iv.setImageDrawable(desktopIcon.getIcon()); } else { iv.setImageDrawable(getActivity().getResources().getDrawable(resID)); } } else { - iv.setImageBitmap(BitmapUtils.getIconBitmap(rootView.getContext(), applicationInfo.loadIcon(pm))); + iv.setImageBitmap(BitmapUtils.getIconBitmap(rootView.getContext(), desktopIcon.getIcon())); } - tv.setText(applicationInfo.loadLabel(pm)); + tv.setText(desktopIcon.getLable()); // linearLayout.setEnabled(true); } else { // linearLayout.setEnabled(false); @@ -145,17 +146,17 @@ public class AppListFragment extends Fragment { @Override public int getCount() { // return applicationInfos == null ? 0 : applicationInfos.size(); - return applicationInfos.size(); + return mDesktopIcons.size(); } }); - gridLayout.setApplicationInfos(applicationInfos); + gridLayout.setApplicationInfos(mDesktopIcons); gridLayout.setOnItemClickListener(new MyGridLayout.OnItemClickListener() { @Override public void onItemClick(View v, int index) { - ApplicationInfo applicationInfo = applicationInfos.get(index); - if (applicationInfo != null) { - APKUtils.openPackage(v.getContext(), applicationInfo.packageName); - AppUsedTimeUtils.getInstance().setAppPackageName(applicationInfo.packageName); + DesktopIcon desktopIcon = mDesktopIcons.get(index); + if (desktopIcon != null) { + APKUtils.openPackage(v.getContext(), desktopIcon.getPackageName()); + AppUsedTimeUtils.getInstance().setAppPackageName(desktopIcon.getPackageName()); AppUsedTimeUtils.getInstance().setStartTime(System.currentTimeMillis()); SendRunningApp(getActivity()); } @@ -198,13 +199,13 @@ public class AppListFragment extends Fragment { }); } - public void setAppList(ArrayList appList) { - this.applicationInfos = appList; + public void setAppList(ArrayList appList) { + this.mDesktopIcons = appList; } @Override public void onSaveInstanceState(@NonNull Bundle outState) { - outState.putParcelableArrayList("applicationInfos", applicationInfos); + outState.putParcelableArrayList("applicationInfos", mDesktopIcons); super.onSaveInstanceState(outState); } } diff --git a/app/src/main/java/com/uiui/os/fragment/CustomFragment.java b/app/src/main/java/com/uiui/os/fragment/CustomFragment.java index 060dd5f..3b1dcc7 100644 --- a/app/src/main/java/com/uiui/os/fragment/CustomFragment.java +++ b/app/src/main/java/com/uiui/os/fragment/CustomFragment.java @@ -113,7 +113,8 @@ public class CustomFragment extends Fragment implements NetworkUtils.OnNetworkSt private String TAG = CustomFragment.class.getSimpleName(); - private int[] mShaderColors = new int[]{0xFFfa3db5, 0xFFF8867E, 0xFFF79F6B, 0xFFF79F6B, 0xFFF79F6B, 0xFFF8867E, 0xFFfa3db5}; + // private int[] mShaderColors = new int[]{0xFFfa3db5, 0xFFF8867E, 0xFFF79F6B, 0xFFF79F6B, 0xFFF79F6B, 0xFFF8867E, 0xFFfa3db5}; + private int[] mShaderColors = new int[]{0xFF3984f6, 0xFF3984f6, 0xFF3984f6, 0xFF3984f6, 0xFF3984f6, 0xFF3984f6, 0xFF3984f6}; private View rootView; private List alarmItemList; private NotificationAdapter notificationAdapter; @@ -466,9 +467,17 @@ public class CustomFragment extends Fragment implements NetworkUtils.OnNetworkSt if (hourly != null && hourly.size() != 0) { WeatherHourlyBean.HourlyBean now = hourly.get(0); String imageName = "he" + now.getIcon(); - int resId = getResources().getIdentifier(imageName, "drawable", getActivity().getPackageName()); - iv_pic.setImageDrawable(getActivity().getDrawable(resId)); - tv_temp.setText(now.getTemp() + "℃"); + Log.e(TAG, "onSuccess: " + imageName); + if (isAdded()){ + int resId = getResources().getIdentifier(imageName, "drawable", getActivity().getPackageName()); + Log.e(TAG, "onSuccess: " + resId); + if (resId == 0) { + iv_pic.setImageDrawable(getActivity().getDrawable(R.drawable.he100)); + } else { + iv_pic.setImageDrawable(getActivity().getDrawable(resId)); + } + tv_temp.setText(now.getTemp() + "℃"); + } } } else { //在此查看返回数据失败的原因 @@ -486,6 +495,7 @@ public class CustomFragment extends Fragment implements NetworkUtils.OnNetworkSt if (pkg.equalsIgnoreCase(BuildConfig.APPLICATION_ID)) continue; killBackgroundProcesses(pkg); } + refreshMemory(); } private void killBackgroundProcesses(String packageName) { @@ -503,7 +513,6 @@ public class CustomFragment extends Fragment implements NetworkUtils.OnNetworkSt Log.e(TAG, "killBackgroundProcesses: " + e.getMessage()); e.printStackTrace(); } - refreshMemory(); } private void refreshMemory() { diff --git a/app/src/main/java/com/uiui/os/iconpostition/IconPositionDBHelper.java b/app/src/main/java/com/uiui/os/iconpostition/IconPositionDBHelper.java new file mode 100644 index 0000000..4ed650a --- /dev/null +++ b/app/src/main/java/com/uiui/os/iconpostition/IconPositionDBHelper.java @@ -0,0 +1,36 @@ +package com.uiui.os.iconpostition; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.os.Environment; + +import java.io.File; + +public class IconPositionDBHelper extends SQLiteOpenHelper { + public static final String DATABASE_NAME = "requestlog.db"; + private static final String DATABASE_FILE_NAME = Environment.getExternalStorageDirectory().getPath() + File.separator + DATABASE_NAME; + private static final int DATABASE_VERSION = 1; + + public IconPositionDBHelper(Context context) { +// super(context, DATABASE_NAME, null, DATABASE_VERSION); + super(context, DATABASE_FILE_NAME, null, DATABASE_VERSION); + } + + @Override + public void onCreate(SQLiteDatabase sqLiteDatabase) { + sqLiteDatabase.execSQL("CREATE TABLE IF NOT EXISTS DesktopIcon (" + + "id integer primary key autoincrement," + + "name text," + + "package text not null," + + "icon blob," + + "position integer UNIQUE" + + ")" + ); + } + + @Override + public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { + + } +} diff --git a/app/src/main/java/com/uiui/os/iconpostition/IconPositionManager.java b/app/src/main/java/com/uiui/os/iconpostition/IconPositionManager.java new file mode 100644 index 0000000..a6721e5 --- /dev/null +++ b/app/src/main/java/com/uiui/os/iconpostition/IconPositionManager.java @@ -0,0 +1,112 @@ +package com.uiui.os.iconpostition; + +import android.annotation.SuppressLint; +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; + +import com.uiui.os.bean.NetDesktopIcon; +import com.uiui.os.utils.APKUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class IconPositionManager { + @SuppressLint("StaticFieldLeak") + private static IconPositionManager sInstance; + private Context mContext; + private IconPositionDBHelper mDBHelper; + + private static final String TABLE_NAME = "DesktopIcon"; + private static String TAG = IconPositionManager.class.getSimpleName(); + + private IconPositionManager(Context context) { + if (context == null) { + throw new RuntimeException("Context is NULL"); + } + mContext = context; + mDBHelper = new IconPositionDBHelper(context); + } + + public static void init(Context context) { + if (sInstance == null) { + sInstance = new IconPositionManager(context); + } + } + + public static IconPositionManager getInstance() { + if (sInstance == null) { + throw new IllegalStateException("You must be init IconPositionManager first"); + } + return sInstance; + } + + public IconPositionDBHelper getDBHelper() { + if (mDBHelper == null) { + mDBHelper = new IconPositionDBHelper(mContext); + } + return mDBHelper; + } + + public void setOnlinePosition(List desktopIconList) { + HashMap hashMap = new HashMap(); + + List dbList = getLogList(); + for (int i = 0; i < dbList.size(); i++) { + NetDesktopIcon icon = dbList.get(i); + if (!APKUtils.isAvailable(mContext, icon.getPackages())) { + dbList.remove(i); + deleteIcon(icon.getPackages()); + } + } + } + + public List getLogList() { + List logBeanList = new ArrayList<>(); + SQLiteDatabase db = mDBHelper.getReadableDatabase(); + String sql = "select * from " + TABLE_NAME; + Cursor cursor = null; + try { + cursor = db.rawQuery(sql, null); + while (cursor.moveToNext()) { + NetDesktopIcon desktopIcon = new NetDesktopIcon(); + desktopIcon.setId(cursor.getInt(cursor.getColumnIndex("id"))); + desktopIcon.setName(cursor.getString(cursor.getColumnIndex("name"))); + desktopIcon.setPackages(cursor.getString(cursor.getColumnIndex("package"))); + desktopIcon.setNum(cursor.getInt(cursor.getColumnIndex("position"))); + desktopIcon.setIcon(IconUtils.Bytes2Bimap(cursor.getBlob(cursor.getColumnIndex("icon")))); + logBeanList.add(desktopIcon); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (cursor != null) { + cursor.close(); + } + db.close(); + } + return logBeanList; + } + + public void updateIcon(NetDesktopIcon netDesktopIcon) { + SQLiteDatabase db = mDBHelper.getWritableDatabase(); + ContentValues values = new ContentValues(); + values.put("name", netDesktopIcon.getName()); + values.put("package", netDesktopIcon.getPackages()); + values.put("position", netDesktopIcon.getNum()); + values.put("icon", IconUtils.getPackageIcon(mContext, netDesktopIcon.getPackages())); + db.update(TABLE_NAME, values, "package=?", new String[]{netDesktopIcon.getPackages()}); + } + + public void deleteIcon(String pkg) { + SQLiteDatabase db = mDBHelper.getWritableDatabase(); + db.delete(TABLE_NAME, "package=?", new String[]{pkg}); + } + + + + +} diff --git a/app/src/main/java/com/uiui/os/iconpostition/IconUtils.java b/app/src/main/java/com/uiui/os/iconpostition/IconUtils.java new file mode 100644 index 0000000..981cde2 --- /dev/null +++ b/app/src/main/java/com/uiui/os/iconpostition/IconUtils.java @@ -0,0 +1,42 @@ +package com.uiui.os.iconpostition; + +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; + +import java.io.ByteArrayOutputStream; + +public class IconUtils { + public static byte[] getPackageIcon(Context context, String pkg) { + PackageManager pm = context.getPackageManager(); + ApplicationInfo applicationInfo = null; + try { + applicationInfo = pm.getApplicationInfo(pkg, PackageManager.GET_META_DATA); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + if (applicationInfo != null) { + Drawable icon = applicationInfo.loadIcon(pm); + Bitmap bitmap = ((BitmapDrawable) icon).getBitmap(); + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); + byte[] bitmapdata = stream.toByteArray(); + return bitmapdata; + } else { + return null; + } + } + + + public static Bitmap Bytes2Bimap(byte[] b) { + if (b.length != 0) { + return BitmapFactory.decodeByteArray(b, 0, b.length); + } else { + return null; + } + } +} diff --git a/app/src/main/java/com/uiui/os/network/NetInterfaceManager.java b/app/src/main/java/com/uiui/os/network/NetInterfaceManager.java index 817a8eb..678cd29 100644 --- a/app/src/main/java/com/uiui/os/network/NetInterfaceManager.java +++ b/app/src/main/java/com/uiui/os/network/NetInterfaceManager.java @@ -6,11 +6,15 @@ import android.util.Log; import com.uiui.os.bean.AlarmClockData; import com.uiui.os.bean.BaseResponse; +import com.uiui.os.bean.NetDesktopIcon; import com.uiui.os.network.api.AlarmClockApi; import com.uiui.os.network.api.AppUsageRecordApi; +import com.uiui.os.network.api.GetDesktopApi; import com.uiui.os.network.api.RunNewApp; -import com.uiui.os.network.api.SOSRecord; +import com.uiui.os.network.api.SOSRecordApi; import com.uiui.os.network.api.SendScreenshotApi; +import com.uiui.os.network.api.UpdateAlarmClockApi; +import com.uiui.os.network.api.UpdateDesktopApi; import com.uiui.os.utils.MD5Util; import com.uiui.os.utils.Utils; @@ -170,12 +174,35 @@ public class NetInterfaceManager { } public Observable getSOSRecordObservable() { - return mRetrofit.create(SOSRecord.class) + return mRetrofit.create(SOSRecordApi.class) .sendSOSRecord(Utils.getSerial()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } + public Observable getUpdateAlarmObservable(int id) { + return mRetrofit.create(UpdateAlarmClockApi.class) + .updateAlarm(Utils.getSerial(), id) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Observable getUpdateDesktopObservable(String jsonArray) { + return mRetrofit.create(UpdateDesktopApi.class) + .updateLayout(Utils.getSerial(), jsonArray) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Observable>> getDesktopLayoutObservable() { + return mRetrofit.create(GetDesktopApi.class) + .getDesktopLayout(Utils.getSerial()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + + public AppUsageRecordApi getAppUsageRecordControl() { return mRetrofit.create(AppUsageRecordApi.class); } diff --git a/app/src/main/java/com/uiui/os/network/URLAddress.java b/app/src/main/java/com/uiui/os/network/URLAddress.java index 446884c..03206e7 100644 --- a/app/src/main/java/com/uiui/os/network/URLAddress.java +++ b/app/src/main/java/com/uiui/os/network/URLAddress.java @@ -2,15 +2,21 @@ package com.uiui.os.network; public class URLAddress { public static final String ROOT_URL = "https://led.aolelearn.cn/android/"; - //获取闹钟 + /*获取闹钟*/ public static final String GET_ALARM_CLOCK = "getAlarmClock"; - //应用使用记录 + /*应用使用记录*/ public static final String APP_USAGE_RECORD = "appUsageRecord"; - //正在运行的应用 + /*正在运行的应用*/ public static final String RUN_NEW_APP = "app/runNewApp"; - //上传截图 + /*上传截图*/ public static final String SEND_SCREENSHOT = "sn/uploadScreenshot"; - //sos记录 + /*sos记录*/ public static final String SOS_RECORD = "sosRecord"; + /*爱心提醒通知成功*/ + public static final String UPDATE_ALARM_CLOCK = "updateAlarmClock"; + /*更新桌面布局*/ + public static final String UPDATE_DESKTOP_LAYOUT = "updateDesktopLayout"; + /*获取桌面布局*/ + public static final String GET_DESKTOP_LAYOUT = "getDesktopLayout"; } diff --git a/app/src/main/java/com/uiui/os/network/api/GetDesktopApi.java b/app/src/main/java/com/uiui/os/network/api/GetDesktopApi.java new file mode 100644 index 0000000..8bb4a21 --- /dev/null +++ b/app/src/main/java/com/uiui/os/network/api/GetDesktopApi.java @@ -0,0 +1,21 @@ +package com.uiui.os.network.api; + +import com.uiui.os.bean.BaseResponse; +import com.uiui.os.bean.NetDesktopIcon; +import com.uiui.os.network.URLAddress; + +import java.util.List; + +import io.reactivex.rxjava3.core.Observable; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +public interface GetDesktopApi { + @GET(URLAddress.GET_DESKTOP_LAYOUT) + Observable>> getDesktopLayout( + @Query("sn") String sn + ); +} diff --git a/app/src/main/java/com/uiui/os/network/api/SOSRecord.java b/app/src/main/java/com/uiui/os/network/api/SOSRecordApi.java similarity index 92% rename from app/src/main/java/com/uiui/os/network/api/SOSRecord.java rename to app/src/main/java/com/uiui/os/network/api/SOSRecordApi.java index bbec2a7..d5a83f9 100644 --- a/app/src/main/java/com/uiui/os/network/api/SOSRecord.java +++ b/app/src/main/java/com/uiui/os/network/api/SOSRecordApi.java @@ -8,7 +8,7 @@ import retrofit2.http.Field; import retrofit2.http.FormUrlEncoded; import retrofit2.http.POST; -public interface SOSRecord { +public interface SOSRecordApi { @FormUrlEncoded @POST(URLAddress.SOS_RECORD) Observable sendSOSRecord( diff --git a/app/src/main/java/com/uiui/os/network/api/UpdateAlarmClockApi.java b/app/src/main/java/com/uiui/os/network/api/UpdateAlarmClockApi.java new file mode 100644 index 0000000..49ba76b --- /dev/null +++ b/app/src/main/java/com/uiui/os/network/api/UpdateAlarmClockApi.java @@ -0,0 +1,18 @@ +package com.uiui.os.network.api; + +import com.uiui.os.bean.BaseResponse; +import com.uiui.os.network.URLAddress; + +import io.reactivex.rxjava3.core.Observable; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.POST; + +public interface UpdateAlarmClockApi { + @FormUrlEncoded + @POST(URLAddress.UPDATE_ALARM_CLOCK) + Observable updateAlarm( + @Field("sn") String sn, + @Field("id") int id + ); +} diff --git a/app/src/main/java/com/uiui/os/network/api/UpdateDesktopApi.java b/app/src/main/java/com/uiui/os/network/api/UpdateDesktopApi.java new file mode 100644 index 0000000..4cd0b8c --- /dev/null +++ b/app/src/main/java/com/uiui/os/network/api/UpdateDesktopApi.java @@ -0,0 +1,18 @@ +package com.uiui.os.network.api; + +import com.uiui.os.bean.BaseResponse; +import com.uiui.os.network.URLAddress; + +import io.reactivex.rxjava3.core.Observable; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.POST; + +public interface UpdateDesktopApi { + @FormUrlEncoded + @POST(URLAddress.UPDATE_DESKTOP_LAYOUT) + Observable updateLayout( + @Field("sn") String sn, + @Field("app") String app + ); +} diff --git a/app/src/main/java/com/uiui/os/receiver/BootReceiver.java b/app/src/main/java/com/uiui/os/receiver/BootReceiver.java index a8412bd..517f160 100644 --- a/app/src/main/java/com/uiui/os/receiver/BootReceiver.java +++ b/app/src/main/java/com/uiui/os/receiver/BootReceiver.java @@ -3,11 +3,10 @@ package com.uiui.os.receiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; -import android.os.SystemClock; import android.text.TextUtils; import android.util.Log; -import com.uiui.os.service.MainService; +import com.uiui.os.service.main.MainService; import java.util.concurrent.TimeUnit; @@ -19,6 +18,7 @@ import io.reactivex.rxjava3.disposables.Disposable; public class BootReceiver extends BroadcastReceiver { private static String TAG = BootReceiver.class.getSimpleName(); public static final String BOOT_COMPLETED = "zuoyeos.action.BOOT_COMPLETED"; + public static final String SOS = "zuoyeos.action.SOS"; static { getLockedState(); diff --git a/app/src/main/java/com/uiui/os/service/main/MainSContact.java b/app/src/main/java/com/uiui/os/service/main/MainSContact.java new file mode 100644 index 0000000..eb6af0c --- /dev/null +++ b/app/src/main/java/com/uiui/os/service/main/MainSContact.java @@ -0,0 +1,19 @@ +package com.uiui.os.service.main; + +import com.uiui.os.base.BasePresenter; +import com.uiui.os.base.BaseView; +import com.uiui.os.bean.AlarmClockData; + +import java.util.List; + +public class MainSContact { + public interface Presenter extends BasePresenter { + //设置所有信息 + void getAlarmClock(); + } + + public interface MainSView extends BaseView { + //获取所有信息 + void setAlarmClock(List dataList); + } +} diff --git a/app/src/main/java/com/uiui/os/service/main/MainSPresenter.java b/app/src/main/java/com/uiui/os/service/main/MainSPresenter.java new file mode 100644 index 0000000..9c0eab8 --- /dev/null +++ b/app/src/main/java/com/uiui/os/service/main/MainSPresenter.java @@ -0,0 +1,90 @@ +package com.uiui.os.service.main; + +import android.content.Context; +import android.util.Log; + +import com.tencent.mmkv.MMKV; +import com.trello.rxlifecycle4.android.ActivityEvent; +import com.uiui.os.bean.AlarmClockData; +import com.uiui.os.bean.BaseResponse; +import com.uiui.os.network.NetInterfaceManager; +import com.uiui.os.utils.AlarmUtils; + +import java.util.List; + +import io.reactivex.rxjava3.core.Observer; +import io.reactivex.rxjava3.disposables.Disposable; +import io.reactivex.rxjava3.subjects.BehaviorSubject; + + +/** + * MainActivity和MainService 的 Presenter + * + * @author jgy02 + */ +public class MainSPresenter implements MainSContact.Presenter { + private static final String TAG = MainSPresenter.class.getSimpleName(); + private static final int OK = 200; + private MainSContact.MainSView mView; + private Context mContext; + + private BehaviorSubject lifecycle; + + public void setLifecycle(BehaviorSubject lifecycle) { + this.lifecycle = lifecycle; + } + + public BehaviorSubject getLifecycle() { + return lifecycle; + } + + public MainSPresenter(Context context) { + this.mContext = context; + Log.e(TAG, "MainSPresenter: " + context.getClass()); + } + + @Override + public void attachView(@androidx.annotation.NonNull MainSContact.MainSView view) { + this.mView = view; + } + + @Override + public void detachView() { + this.mView = null; + } + + + @Override + public void getAlarmClock() { + MMKV mmkv = MMKV.defaultMMKV(); + NetInterfaceManager.getInstance().getAlarmClockApiObservable() + .subscribe(new Observer>>() { + @Override + public void onSubscribe(Disposable d) { + Log.e("getAlarmClock", "onSubscribe: "); + } + + @Override + public void onNext(BaseResponse> listBaseResponse) { + Log.e("getAlarmClock", "onNext: "+listBaseResponse); + if (listBaseResponse.code == 200) { + List data = listBaseResponse.data; + AlarmUtils.getInstance().setAlarmClockData(data); + } else { + + } + } + + @Override + public void onError(Throwable e) { + Log.e("getAlarmClock", "onError: " + e.getMessage()); + onComplete(); + } + + @Override + public void onComplete() { + Log.e("getAlarmClock", "onComplete: "); + } + }); + } +} diff --git a/app/src/main/java/com/uiui/os/service/MainService.java b/app/src/main/java/com/uiui/os/service/main/MainService.java similarity index 97% rename from app/src/main/java/com/uiui/os/service/MainService.java rename to app/src/main/java/com/uiui/os/service/main/MainService.java index 36ef990..4ee16f4 100644 --- a/app/src/main/java/com/uiui/os/service/MainService.java +++ b/app/src/main/java/com/uiui/os/service/main/MainService.java @@ -1,4 +1,4 @@ -package com.uiui.os.service; +package com.uiui.os.service.main; import android.annotation.SuppressLint; import android.content.BroadcastReceiver; @@ -16,8 +16,6 @@ import com.arialyy.aria.core.Aria; import com.arialyy.aria.core.task.DownloadTask; import com.blankj.utilcode.util.NetworkUtils; import com.uiui.os.BuildConfig; -import com.uiui.os.activity.main.MainContact; -import com.uiui.os.activity.main.MainPresenter; import com.uiui.os.activity.NoticeActivity; import com.uiui.os.base.BaseService; import com.uiui.os.bean.AlarmClockData; @@ -48,10 +46,10 @@ import okhttp3.MultipartBody; import okhttp3.RequestBody; -public class MainService extends BaseService implements MainContact.MainView, NetworkUtils.OnNetworkStatusChangedListener { +public class MainService extends BaseService implements MainSContact.MainSView, NetworkUtils.OnNetworkStatusChangedListener { private static final String TAG = MainService.class.getSimpleName(); @SuppressLint("StaticFieldLeak") - public static MainPresenter mPresenter; + public static MainSPresenter mPresenter; public MainService() { @@ -80,7 +78,7 @@ public class MainService extends BaseService implements MainContact.MainView, Ne Log.e(TAG, "onCreate: "); Aria.init(this); Aria.download(this).register(); - mPresenter = new MainPresenter(this); + mPresenter = new MainSPresenter(this); mPresenter.attachView(this); mPresenter.setLifecycle(lifecycleSubject); NetworkUtils.registerNetworkStatusChangedListener(this); diff --git a/app/src/main/java/com/uiui/os/utils/APKUtils.java b/app/src/main/java/com/uiui/os/utils/APKUtils.java index 98e2d2a..34f84ca 100644 --- a/app/src/main/java/com/uiui/os/utils/APKUtils.java +++ b/app/src/main/java/com/uiui/os/utils/APKUtils.java @@ -11,7 +11,9 @@ import android.text.TextUtils; import android.util.Log; import com.uiui.os.BuildConfig; +import com.uiui.os.bean.DesktopIcon; +import java.io.File; import java.text.Collator; import java.util.ArrayList; import java.util.Comparator; @@ -91,7 +93,11 @@ public class APKUtils { return applicationInfos; } - public static ArrayList queryFilterAppInfo(Context context) { + /** + * @param context + * @return + */ + public static ArrayList queryFilterAppInfo(Context context) { PackageManager pm = context.getPackageManager(); // 查询所有已经安装的应用程序 List appInfos = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);// GET_UNINSTALLED_PACKAGES代表已删除,但还有安装目录的 @@ -142,7 +148,11 @@ public class APKUtils { } } }); - return applicationInfos; + ArrayList desktopIcons = new ArrayList<>(); + for (int p = 0; p < applicationInfos.size(); p++) { + desktopIcons.add(DesktopIcon.creatDesktopIcon(context, applicationInfos.get(p), p)); + } + return desktopIcons; } /** @@ -200,6 +210,32 @@ public class APKUtils { } } + public static boolean openPackage(Context context, String packageName) { + Context pkgContext = getPackageContext(context, packageName); + Intent intent = getAppOpenIntentByPackageName(context, packageName); + if (pkgContext != null && intent != null) { + pkgContext.startActivity(intent); + return true; + } + return false; + } + + public static Context getPackageContext(Context context, String packageName) { + Context pkgContext = null; + if (context.getPackageName().equals(packageName)) { + pkgContext = context; + } else { + // 创建第三方应用的上下文环境 + try { + pkgContext = context.createPackageContext(packageName, + Context.CONTEXT_IGNORE_SECURITY + | Context.CONTEXT_INCLUDE_CODE); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + } + return pkgContext; + } public static Intent getAppOpenIntentByPackageName(Context context, String packageName) { //Activity完整名 @@ -226,33 +262,6 @@ public class APKUtils { return intent; } - public static Context getPackageContext(Context context, String packageName) { - Context pkgContext = null; - if (context.getPackageName().equals(packageName)) { - pkgContext = context; - } else { - // 创建第三方应用的上下文环境 - try { - pkgContext = context.createPackageContext(packageName, - Context.CONTEXT_IGNORE_SECURITY - | Context.CONTEXT_INCLUDE_CODE); - } catch (PackageManager.NameNotFoundException e) { - e.printStackTrace(); - } - } - return pkgContext; - } - - public static boolean openPackage(Context context, String packageName) { - Context pkgContext = getPackageContext(context, packageName); - Intent intent = getAppOpenIntentByPackageName(context, packageName); - if (pkgContext != null && intent != null) { - pkgContext.startActivity(intent); - return true; - } - return false; - } - public static String getAPPVersionName(Context context, String packageName) { String versionName = "0"; @@ -280,4 +289,40 @@ public class APKUtils { } return ""; } + + + /** + * 检查手机上是否安装了指定的软件 + */ + public static boolean isAvailable(Context context, String packageName) { + PackageManager packageManager = context.getPackageManager(); + PackageInfo info = null; + try { + info = packageManager.getPackageInfo(packageName, 0); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + return info != null; + } + + /** + * 检查手机上是否安装了指定的软件 + */ + public static boolean isAvailable(Context context, File file) { + return isAvailable(context, getPackageName(context, file.getAbsolutePath())); + } + + /** + * 根据文件路径获取包名 + */ + public static String getPackageName(Context context, String filePath) { + PackageManager packageManager = context.getPackageManager(); + PackageInfo info = packageManager.getPackageArchiveInfo(filePath, PackageManager.GET_ACTIVITIES); + if (info != null) { + ApplicationInfo appInfo = info.applicationInfo; + return appInfo.packageName; //得到安装包名称 + } else { + return ""; + } + } } diff --git a/app/src/main/java/com/uiui/os/utils/AlarmUtils.java b/app/src/main/java/com/uiui/os/utils/AlarmUtils.java index 662a3a1..6f59cf9 100644 --- a/app/src/main/java/com/uiui/os/utils/AlarmUtils.java +++ b/app/src/main/java/com/uiui/os/utils/AlarmUtils.java @@ -5,35 +5,26 @@ import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; -import android.os.Environment; import android.text.TextUtils; import android.util.Log; -import androidx.core.content.ContextCompat; - import com.arialyy.aria.core.Aria; import com.blankj.utilcode.util.FileUtils; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.tencent.mmkv.MMKV; import com.uiui.os.bean.AlarmClockData; -import com.uiui.os.service.MainService; +import com.uiui.os.service.main.MainService; import java.io.File; -import java.io.FileInputStream; import java.lang.reflect.Type; -import java.math.BigInteger; -import java.security.MessageDigest; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.function.Predicate; -import java.util.stream.Collectors; public class AlarmUtils { @SuppressLint("StaticFieldLeak") @@ -135,7 +126,7 @@ public class AlarmUtils { private PendingIntent getPendingIntent(AlarmClockData alarmClock) { Intent intent = new Intent(MainService.ALARMWAKEUP); - intent.putExtra("title", alarmClock.getRemarks()); + intent.putExtra("title", alarmClock.getTitle()); intent.putExtra("id", alarmClock.getId()); PendingIntent startPendingIntent = PendingIntent.getBroadcast(mContext, alarmClock.getId(), intent, PendingIntent.FLAG_CANCEL_CURRENT); return startPendingIntent; @@ -182,7 +173,7 @@ public class AlarmUtils { int type = alarm.getType(); String timeString = alarm.getTime(); long timestamp = getTimestamp(timeString); - String title = alarm.getRemarks(); + String title = alarm.getTitle(); boolean finished = alarm.isFinished(); String url = alarm.getVoice(); String md5 = alarm.getVoice_md5(); diff --git a/app/src/main/java/com/uiui/os/utils/FileUtil.java b/app/src/main/java/com/uiui/os/utils/FileUtil.java new file mode 100644 index 0000000..f2f1306 --- /dev/null +++ b/app/src/main/java/com/uiui/os/utils/FileUtil.java @@ -0,0 +1,54 @@ +package com.uiui.os.utils; + +import android.text.TextUtils; + +import java.util.HashSet; + +public class FileUtil { + public static String getFileType(String url) { + if (url.indexOf("/") == -1) { + return url.substring(url.indexOf("."), url.length()); + } else { + String fileName = url.substring(url.lastIndexOf("/")); + return fileName.substring(fileName.indexOf("."), fileName.length()); + } + } + + private static HashSet videoFormat = new HashSet() {{ + this.add(".mp4"); + this.add(".avi"); + this.add(".nkv"); + this.add(".flv"); + }}; + private static HashSet pictureFormat = new HashSet() {{ + this.add(".png"); + this.add(".jpg"); + this.add(".jpeg"); + this.add(".bmp"); + }}; + + public static boolean isVideoFile(String fileName) { + if (TextUtils.isEmpty(fileName)) { + return false; + } else { + if (!fileName.startsWith(".")) { + return videoFormat.contains(getFileType(fileName)); + } else { + return videoFormat.contains(fileName); + } + } + } + + public static boolean isPictureFile(String fileName) { + if (TextUtils.isEmpty(fileName)) { + return false; + } else { + if (!fileName.startsWith(".")) { + return pictureFormat.contains(getFileType(fileName)); + } else { + return pictureFormat.contains(fileName); + } + } + } + +} diff --git a/app/src/main/java/com/uiui/os/utils/IconUtils.java b/app/src/main/java/com/uiui/os/utils/IconUtils.java index 5737ef0..e071a2e 100644 --- a/app/src/main/java/com/uiui/os/utils/IconUtils.java +++ b/app/src/main/java/com/uiui/os/utils/IconUtils.java @@ -1,43 +1,55 @@ package com.uiui.os.utils; +import android.util.Log; + import java.util.ArrayList; import java.util.List; public class IconUtils { - public static List appClassNameList = new ArrayList() { - { - this.add("com.android.appstore");//应用市场 - this.add("com.android.browser");//浏览器 - this.add("com.android.calculator2");//计算器 - this.add("com.android.calendar");//日历 - this.add("com.android.camera");//相机 - this.add("com.mediatek.camera");//相机 - this.add("com.android.camera2");//相机 - this.add("com.android.contacts");//通讯录 - this.add("com.android.deskclock");//时钟 - this.add("com.android.dialer");//电话 - this.add("com.android.dialer");//电话 - this.add("com.android.gallery3d");//图库 - this.add("com.android.mms");//信息 - this.add("com.android.mms.ui");//信息 - this.add("com.android.messaging");//信息 - this.add("com.android.music");//音乐 - this.add("com.android.providers.downloads.ui");//下载 - this.add("com.android.quicksearchbox");//搜索 - this.add("com.android.settings");//设置 - this.add("com.android.soundrecorder");//录音机 - this.add("com.android.stk.StkMain");//sim卡 - this.add("com.android.stk");//sim卡 - this.add("com.android.vdieo");//视频 - this.add("com.mediatek.filemanager");//文件管理 - this.add("com.android.documentsui");//下载 - this.add("com.mediatek.fmradio");//收音机 - this.add("com.android.fmradio");//收音机 - this.add("com.android.email");//电子邮件 - } - }; + public static List appClassNameList = new ArrayList() {{ + this.add("com.uiui.sn");//设别信息 + this.add("com.uiui.appstore");//应用市场 + this.add("com.uiui.weather");//天气 + this.add("com.android.browser");//浏览器 + this.add("com.uiui.browser");//浏览器 + this.add("com.aoleyun.browser");//浏览器 + this.add("com.android.calculator2");//计算器 + this.add("com.android.calendar");//日历 + this.add("com.android.camera");//相机 + this.add("com.mediatek.camera");//相机 + this.add("com.android.camera2");//相机 + this.add("com.android.contacts");//通讯录 + this.add("com.android.deskclock");//时钟 + this.add("com.android.dialer");//电话 + this.add("com.android.dialer");//电话 + this.add("com.android.gallery3d");//图库 + this.add("com.android.mms");//信息 + this.add("com.android.mms.ui");//信息 + this.add("com.android.messaging");//信息 + this.add("com.android.music");//音乐 + this.add("com.android.providers.downloads.ui");//下载 + this.add("com.android.quicksearchbox");//搜索 + this.add("com.android.settings");//设置 + this.add("com.android.soundrecorder");//录音机 + this.add("com.android.stk.StkMain");//sim卡 + this.add("com.android.stk");//sim卡 + this.add("com.android.vdieo");//视频 + this.add("com.mediatek.filemanager");//文件管理 + this.add("com.android.documentsui");//下载 + this.add("com.mediatek.fmradio");//收音机 + this.add("com.android.fmradio");//收音机 + this.add("com.android.email");//电子邮件 + this.add("com.ss.android.ugc.aweme");//抖音 + this.add("com.ss.android.article.news");//头条 + this.add("com.tencent.mm");//微信 + }}; + public static List appIconList = new ArrayList() {{ + this.add("com_uiui_sn"); this.add("com_android_appstore"); + this.add("com_uiui_weather"); + this.add("com_android_browser"); + this.add("com_android_browser"); this.add("com_android_browser"); this.add("com_android_calculator2"); this.add("com_android_calendar"); @@ -65,5 +77,52 @@ public class IconUtils { this.add("com_mediatek_fmradio"); this.add("com_mediatek_fmradio");//收音机 this.add("com_android_email"); + this.add("com_android_aweme2"); + this.add("com_android_news2"); + this.add("com_tencent_mm2"); }}; + + public static List appIconList2 = new ArrayList() {{ + this.add("com_uiui_sn2"); + this.add("com_android_appstore2"); + this.add("com_uiui_weather2"); + this.add("com_android_browser2"); + this.add("com_android_browser2"); + this.add("com_android_browser2"); + this.add("com_android_calculator2"); + this.add("com_android_calendar"); + this.add("com_android_camera2"); + this.add("com_android_camera2"); + this.add("com_android_camera2"); + this.add("com_android_contacts"); + this.add("com_android_deskclock"); + this.add("com_android_dialer2"); + this.add("com_android_dialer2"); + this.add("com_android_gallery3d_app2"); + this.add("com_android_mms_ui2"); + this.add("com_android_mms_ui2"); + this.add("com_android_mms_ui2"); + this.add("com_android_music"); + this.add("com_android_providers_downloads_ui"); + this.add("com_android_quicksearchbox"); + this.add("com_android_settings2"); + this.add("com_android_soundrecorder"); + this.add("com_android_stk_stkmain"); + this.add("com_android_stk_stkmain"); + this.add("com_android_vdieo"); + this.add("com_mediatek_filemanager"); + this.add("com_mediatek_filemanager"); + this.add("com_mediatek_fmradio"); + this.add("com_mediatek_fmradio");//收音机 + this.add("com_android_email"); + this.add("com_android_aweme2"); + this.add("com_android_news2"); + this.add("com_tencent_mm2"); + }}; + + static { + Log.e("IconUtils", "appClassNameList size: " + appClassNameList.size()); + Log.e("IconUtils", "appIconList size: " + appIconList.size()); + Log.e("IconUtils", "appIconList2 size: " + appIconList2.size()); + } } diff --git a/app/src/main/java/com/uiui/os/view/JzvdStdAssert.java b/app/src/main/java/com/uiui/os/view/JzvdStdAssert.java new file mode 100644 index 0000000..a82e14e --- /dev/null +++ b/app/src/main/java/com/uiui/os/view/JzvdStdAssert.java @@ -0,0 +1,82 @@ +package com.uiui.os.view; + +import android.content.Context; +import android.util.AttributeSet; +import android.util.Log; + +import cn.jzvd.JzvdStd; + + +public class JzvdStdAssert extends JzvdStd { + private onVideoCompletionListener onVideoCompletionListener; + private ScreenOrientationChangeListener changeListener; + private GotoFullScreenListener gotoFullScreenListener; + + public JzvdStdAssert(Context context) { + super(context); + } + + public JzvdStdAssert(Context context, AttributeSet attrs) { + super(context, attrs); + } + + + @Override + public void onPrepared() { + Log.e("onStateChanged", "onPrepared"); + state = STATE_PREPARED; + if (!preloading) { + mediaInterface.start(); + preloading = false; + } + onStatePlaying(); + } + + + @Override + public void onCompletion() { + super.onCompletion(); + onVideoCompletionListener.onVideoComplet(); + Log.e("onStateChanged", "onCompletion"); + } + + public void setOnCompletionListener(onVideoCompletionListener listener) { + this.onVideoCompletionListener = listener; + } + + public void setScreenOrientationChangeListener(ScreenOrientationChangeListener listener) { + this.changeListener = listener; + } + + public void setGotoFullScreenListener(GotoFullScreenListener listener) { + this.gotoFullScreenListener = listener; + } + + @Override + public void gotoNormalScreen() { + super.gotoNormalScreen(); + changeListener.onOrientationChange(); + } + + @Override + public void gotoFullscreen() { + super.gotoFullscreen(); + gotoFullScreenListener.onGotoFullScreen(); + } + + //视频播放完成回调 + public interface onVideoCompletionListener { + void onVideoComplet(); + } + + //退出全屏回调 + public interface ScreenOrientationChangeListener { + void onOrientationChange(); + } + + //进入全屏回调 + public interface GotoFullScreenListener { + void onGotoFullScreen(); + } + +} diff --git a/app/src/main/java/com/uiui/os/view/MyGridLayout.java b/app/src/main/java/com/uiui/os/view/MyGridLayout.java index a05fa73..65379c7 100644 --- a/app/src/main/java/com/uiui/os/view/MyGridLayout.java +++ b/app/src/main/java/com/uiui/os/view/MyGridLayout.java @@ -11,6 +11,7 @@ import android.view.ViewGroup; import com.uiui.os.R; +import com.uiui.os.bean.DesktopIcon; import java.util.ArrayList; @@ -88,8 +89,9 @@ public class MyGridLayout extends ViewGroup { int height = b - t;// 布局区域高度 int width = r - l;// 布局区域宽度 // int rows = count % colums == 0 ? count / colums : count / colums + 1;// 行数 - if (count == 0) + if (count == 0) { return; + } int gridW = (width - margin * (colums + 1)) / colums;// 格子宽度 int gridH = (height - margin * (rows + 1)) / rows;// 格子高度 @@ -99,8 +101,9 @@ public class MyGridLayout extends ViewGroup { for (int i = 0; i < rows; i++) {// 遍历行 for (int j = 0; j < colums; j++) {// 遍历每一行的元素 View child = this.getChildAt(i * colums + j); - if (child == null) + if (child == null) { return; + } // if (j == 0) { left = j * gridW + (j + 1) * margin + margin / 2; // } else { @@ -144,9 +147,9 @@ public class MyGridLayout extends ViewGroup { void onItemClick(View v, int index); } - private ArrayList applicationInfos; + private ArrayList applicationInfos; - public void setApplicationInfos(ArrayList infoArrayList) { + public void setApplicationInfos(ArrayList infoArrayList) { this.applicationInfos = infoArrayList; } @@ -156,8 +159,9 @@ public class MyGridLayout extends ViewGroup { * @param click */ public void setOnItemClickListener(final OnItemClickListener click) { - if (this.adapter == null) + if (this.adapter == null) { return; + } for (int i = 0; i < adapter.getCount(); i++) { final int index = i; View view = getChildAt(i); @@ -170,7 +174,9 @@ public class MyGridLayout extends ViewGroup { }); if (applicationInfos.get(index) == null) { view.setClickable(false); - } else view.setClickable(true); + } else { + view.setClickable(true); + } } } } diff --git a/app/src/main/res/drawable-hdpi/charging.png b/app/src/main/res/drawable-hdpi/charging.png deleted file mode 100644 index dace756..0000000 Binary files a/app/src/main/res/drawable-hdpi/charging.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/charging_icon.png b/app/src/main/res/drawable-hdpi/charging_icon.png new file mode 100644 index 0000000..18533e7 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/charging_icon.png differ diff --git a/app/src/main/res/drawable-hdpi/sos_icon.png b/app/src/main/res/drawable-hdpi/sos_icon.png index b3b2e9e..540aced 100644 Binary files a/app/src/main/res/drawable-hdpi/sos_icon.png and b/app/src/main/res/drawable-hdpi/sos_icon.png differ diff --git a/app/src/main/res/drawable-hdpi/systemapp_icon.png b/app/src/main/res/drawable-hdpi/systemapp_icon.png index d1bb3ba..4e403d5 100644 Binary files a/app/src/main/res/drawable-hdpi/systemapp_icon.png and b/app/src/main/res/drawable-hdpi/systemapp_icon.png differ diff --git a/app/src/main/res/drawable-hdpi/wallpaper.png b/app/src/main/res/drawable-hdpi/wallpaper.png new file mode 100644 index 0000000..69167b4 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/wallpaper.png differ diff --git a/app/src/main/res/drawable-hdpi/wifi_icon.png b/app/src/main/res/drawable-hdpi/wifi_icon.png index 1126193..cc62e04 100644 Binary files a/app/src/main/res/drawable-hdpi/wifi_icon.png and b/app/src/main/res/drawable-hdpi/wifi_icon.png differ diff --git a/app/src/main/res/drawable-xhdpi/com_android_appstore2.png b/app/src/main/res/drawable-xhdpi/com_android_appstore2.png new file mode 100644 index 0000000..78caed9 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/com_android_appstore2.png differ diff --git a/app/src/main/res/drawable-xhdpi/com_android_aweme2.png b/app/src/main/res/drawable-xhdpi/com_android_aweme2.png new file mode 100644 index 0000000..0b82a44 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/com_android_aweme2.png differ diff --git a/app/src/main/res/drawable-xhdpi/com_android_browser2.png b/app/src/main/res/drawable-xhdpi/com_android_browser2.png new file mode 100644 index 0000000..323d3ef Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/com_android_browser2.png differ diff --git a/app/src/main/res/drawable-xhdpi/com_android_camera2.png b/app/src/main/res/drawable-xhdpi/com_android_camera2.png new file mode 100644 index 0000000..787e8a4 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/com_android_camera2.png differ diff --git a/app/src/main/res/drawable-xhdpi/com_android_dialer2.png b/app/src/main/res/drawable-xhdpi/com_android_dialer2.png new file mode 100644 index 0000000..d80b7cd Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/com_android_dialer2.png differ diff --git a/app/src/main/res/drawable-xhdpi/com_android_gallery3d_app2.png b/app/src/main/res/drawable-xhdpi/com_android_gallery3d_app2.png new file mode 100644 index 0000000..e56a505 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/com_android_gallery3d_app2.png differ diff --git a/app/src/main/res/drawable-xhdpi/com_android_mms_ui2.png b/app/src/main/res/drawable-xhdpi/com_android_mms_ui2.png new file mode 100644 index 0000000..c62fec1 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/com_android_mms_ui2.png differ diff --git a/app/src/main/res/drawable-xhdpi/com_android_news2.png b/app/src/main/res/drawable-xhdpi/com_android_news2.png new file mode 100644 index 0000000..bef60f1 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/com_android_news2.png differ diff --git a/app/src/main/res/drawable-xhdpi/com_android_settings2.png b/app/src/main/res/drawable-xhdpi/com_android_settings2.png new file mode 100644 index 0000000..10cb0b8 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/com_android_settings2.png differ diff --git a/app/src/main/res/drawable-xhdpi/com_tencent_mm2.png b/app/src/main/res/drawable-xhdpi/com_tencent_mm2.png new file mode 100644 index 0000000..d67b701 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/com_tencent_mm2.png differ diff --git a/app/src/main/res/drawable-xhdpi/com_uiui_sn2.png b/app/src/main/res/drawable-xhdpi/com_uiui_sn2.png new file mode 100644 index 0000000..ac506a9 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/com_uiui_sn2.png differ diff --git a/app/src/main/res/drawable-xhdpi/com_uiui_weather2.png b/app/src/main/res/drawable-xhdpi/com_uiui_weather2.png new file mode 100644 index 0000000..c64d302 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/com_uiui_weather2.png differ diff --git a/app/src/main/res/drawable-xhdpi/weather2.png b/app/src/main/res/drawable-xhdpi/weather2.png new file mode 100644 index 0000000..f5ebf6d Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/weather2.png differ diff --git a/app/src/main/res/drawable/actions_item_selector.xml b/app/src/main/res/drawable/actions_item_selector.xml index cb90c4f..df26a4a 100644 --- a/app/src/main/res/drawable/actions_item_selector.xml +++ b/app/src/main/res/drawable/actions_item_selector.xml @@ -2,7 +2,7 @@ - + diff --git a/app/src/main/res/layout-land/fragment_custom.xml b/app/src/main/res/layout-land/fragment_custom.xml index a5dcf93..542f591 100644 --- a/app/src/main/res/layout-land/fragment_custom.xml +++ b/app/src/main/res/layout-land/fragment_custom.xml @@ -45,7 +45,7 @@ android:layout_marginTop="8dp" android:text="天气预报" android:textColor="@color/black" - android:textSize="15sp" + android:textSize="20sp" android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -93,7 +93,7 @@ android:layout_marginTop="8dp" android:text="爱心守护" android:textColor="@color/black" - android:textSize="15sp" + android:textSize="20sp" android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -136,15 +136,15 @@ android:layout_marginTop="8dp" android:text="紧急呼叫" android:textColor="@color/black" - android:textSize="15sp" + android:textSize="20sp" android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -233,7 +233,7 @@ android:layout_marginTop="8dp" android:text="设备状态" android:textColor="@color/black" - android:textSize="15sp" + android:textSize="20sp" android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -253,12 +253,12 @@ @@ -287,9 +287,11 @@ @@ -341,7 +342,7 @@ android:layout_marginTop="8dp" android:text="一键加速" android:textColor="@color/black" - android:textSize="15sp" + android:textSize="20sp" android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -362,15 +363,15 @@ android:layout_marginTop="8dp" android:text="系统应用" android:textColor="@color/black" - android:textSize="15sp" + android:textSize="20sp" android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + android:textColor="@color/white" + android:textSize="17sp" /> \ No newline at end of file diff --git a/app/src/main/res/layout-port/fragment_custom.xml b/app/src/main/res/layout-port/fragment_custom.xml index d645e01..18ddbfa 100644 --- a/app/src/main/res/layout-port/fragment_custom.xml +++ b/app/src/main/res/layout-port/fragment_custom.xml @@ -47,7 +47,7 @@ android:layout_marginTop="8dp" android:text="天气预报" android:textColor="@color/black" - android:textSize="15sp" + android:textSize="20sp" android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -92,7 +92,7 @@ android:layout_marginTop="8dp" android:text="爱心守护" android:textColor="@color/black" - android:textSize="15sp" + android:textSize="20sp" android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -142,15 +142,15 @@ android:layout_marginTop="8dp" android:text="紧急呼叫" android:textColor="@color/black" - android:textSize="15sp" + android:textSize="20sp" android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -237,7 +237,7 @@ android:layout_marginTop="8dp" android:text="设备状态" android:textColor="@color/black" - android:textSize="15sp" + android:textSize="20sp" android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -257,12 +257,12 @@ @@ -291,10 +291,12 @@ @@ -344,7 +346,7 @@ android:layout_marginTop="8dp" android:text="一键加速" android:textColor="@color/black" - android:textSize="15sp" + android:textSize="20sp" android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -372,15 +374,15 @@ android:layout_marginTop="8dp" android:text="系统应用" android:textColor="@color/black" - android:textSize="15sp" + android:textSize="20sp" android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + android:textColor="@color/white" + android:textSize="17sp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_notice.xml b/app/src/main/res/layout/activity_notice.xml index 4bd0e11..e6f89ac 100644 --- a/app/src/main/res/layout/activity_notice.xml +++ b/app/src/main/res/layout/activity_notice.xml @@ -6,28 +6,26 @@ android:layout_height="match_parent" tools:context=".activity.NoticeActivity"> + - @@ -36,8 +34,8 @@ android:layout_width="wrap_content" android:layout_height="match_parent" android:text="30秒" - android:textSize="30sp" android:textColor="@color/white" + android:textSize="30sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -51,18 +49,38 @@ app:layout_constraintTop_toTopOf="parent" /> + + + + + + + +