diff --git a/app/build.gradle b/app/build.gradle index c06ec3f..a1464c4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,8 @@ android { applicationId "com.uiui.aios" minSdkVersion 24 targetSdkVersion 29 - versionCode 45 - versionName "5.4" + versionCode 51 + versionName "6.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4245787..6070f49 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -22,6 +22,8 @@ + + diff --git a/app/src/main/java/com/uiui/aios/activity/main/MainActivity.java b/app/src/main/java/com/uiui/aios/activity/main/MainActivity.java index 1fc480a..a696cb3 100644 --- a/app/src/main/java/com/uiui/aios/activity/main/MainActivity.java +++ b/app/src/main/java/com/uiui/aios/activity/main/MainActivity.java @@ -31,13 +31,13 @@ import com.google.gson.reflect.TypeToken; import com.uiui.aios.BuildConfig; import com.uiui.aios.R; import com.uiui.aios.base.BaseActivity; +import com.uiui.aios.base.BaseFragmentPagerAdapter; import com.uiui.aios.bean.AlarmItem; import com.uiui.aios.bean.DesktopIcon; import com.uiui.aios.dialog.PasswordDialog; import com.uiui.aios.fragment.AppListFragment; -import com.uiui.aios.fragment.BaseFragmentPagerAdapter; -import com.uiui.aios.fragment.CustomFragment; import com.uiui.aios.fragment.SecondFragment; +import com.uiui.aios.fragment.custom.CustomFragment; import com.uiui.aios.service.NotificationService; import com.uiui.aios.utils.ApkUtils; import com.uiui.aios.utils.AppUsedTimeUtils; @@ -150,31 +150,6 @@ public class MainActivity extends BaseActivity implements MainContact.MainView { if (mFragments.size() > 1) { mViewPager.setCurrentItem(defaultCurrent); } - - mHomeWatcher = new HomeWatcher(this); - mHomeWatcher.setOnHomePressedListener(new HomeWatcher.OnHomePressedListener() { - @Override - public void onHomePressed() { - //按了HOME键 - Log.e(TAG, "onHomePressed: "); - int is_activation = Settings.Global.getInt(getContentResolver(), "uiui_activation", 0); - Log.e(TAG, "onHomePressed: is_activation = " + is_activation); - if (is_activation == 0) { - LauncherUtils.openLauncher3(MainActivity.this); - } else { - if (!LauncherUtils.isDefaultHome(MainActivity.this)) { - LauncherUtils.setDefaultDesktop(MainActivity.this, BuildConfig.APPLICATION_ID, this.getClass().getName()); - } - } - } - - @Override - public void onHomeLongPressed() { - Log.e(TAG, "onHomeLongPressed: "); - //长按HOME键 - } - }); - mHomeWatcher.startWatch(); } private void showPassword() { @@ -314,6 +289,10 @@ public class MainActivity extends BaseActivity implements MainContact.MainView { public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) { return false; + } else if (KeyEvent.KEYCODE_HOME == keyCode) { + Log.e(TAG, "onKeyDown: keyCode = " + keyCode); + //写要执行的动作或者任务 + android.os.Process.killProcess(android.os.Process.myPid()); } return super.onKeyDown(keyCode, event); } @@ -357,7 +336,7 @@ public class MainActivity extends BaseActivity implements MainContact.MainView { gotoNotificationAccessSetting(this); } int is_activation = Settings.Global.getInt(getContentResolver(), "uiui_activation", 0); - Log.e(TAG, "onHomePressed: is_activation = " + is_activation); + Log.e(TAG, "onResume: is_activation = " + is_activation); if (is_activation == 1) { LauncherUtils.setDefaultDesktop(MainActivity.this, BuildConfig.APPLICATION_ID, this.getClass().getName()); } else { @@ -366,6 +345,36 @@ public class MainActivity extends BaseActivity implements MainContact.MainView { addData(); mMainPresenter.sendRunningInfo(); mMainPresenter.getAdminSnSetting(); + addHomeWatcher(); + } + + private void addHomeWatcher() { + if (mHomeWatcher == null) { + mHomeWatcher = new HomeWatcher(this); + } + mHomeWatcher.setOnHomePressedListener(new HomeWatcher.OnHomePressedListener() { + @Override + public void onHomePressed() { + //按了HOME键 + Log.e(TAG, "onHomePressed: "); + int is_activation = Settings.Global.getInt(getContentResolver(), "uiui_activation", 0); + Log.e(TAG, "onHomePressed: is_activation = " + is_activation); + if (is_activation == 0) { + LauncherUtils.openLauncher3(MainActivity.this); + } else { + if (!LauncherUtils.isDefaultHome(MainActivity.this)) { + LauncherUtils.setDefaultDesktop(MainActivity.this, BuildConfig.APPLICATION_ID, this.getClass().getName()); + } + } + } + + @Override + public void onHomeLongPressed() { + Log.e(TAG, "onHomeLongPressed: "); + //长按HOME键 + } + }); + mHomeWatcher.startWatch(); } private static final String ENABLED_NOTIFICATION_LISTENERS = "enabled_notification_listeners"; @@ -421,6 +430,9 @@ public class MainActivity extends BaseActivity implements MainContact.MainView { @Override protected void onPause() { super.onPause(); + if (mHomeWatcher != null) { + mHomeWatcher.stopWatch();// 在销毁时停止监听,不然会报错的。 + } } @Override @@ -436,9 +448,6 @@ public class MainActivity extends BaseActivity implements MainContact.MainView { if (mNewAppReceiver != null) { unregisterReceiver(mNewAppReceiver); } - if (mHomeWatcher != null) { - mHomeWatcher.stopWatch();// 在销毁时停止监听,不然会报错的。 - } } private void registmNewAppReceiver() { diff --git a/app/src/main/java/com/uiui/aios/fragment/BaseFragmentPagerAdapter.java b/app/src/main/java/com/uiui/aios/base/BaseFragmentPagerAdapter.java similarity index 99% rename from app/src/main/java/com/uiui/aios/fragment/BaseFragmentPagerAdapter.java rename to app/src/main/java/com/uiui/aios/base/BaseFragmentPagerAdapter.java index f5f06ca..26c36d3 100644 --- a/app/src/main/java/com/uiui/aios/fragment/BaseFragmentPagerAdapter.java +++ b/app/src/main/java/com/uiui/aios/base/BaseFragmentPagerAdapter.java @@ -1,4 +1,4 @@ -package com.uiui.aios.fragment; +package com.uiui.aios.base; import android.util.SparseArray; diff --git a/app/src/main/java/com/uiui/aios/dialog/CustomDialog.java b/app/src/main/java/com/uiui/aios/dialog/CustomDialog.java new file mode 100644 index 0000000..eeac082 --- /dev/null +++ b/app/src/main/java/com/uiui/aios/dialog/CustomDialog.java @@ -0,0 +1,251 @@ +package com.uiui.aios.dialog; + + +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.appcompat.app.AlertDialog; + +import com.uiui.aios.R; + + +/** + * description:自定义dialog + */ + +public class CustomDialog extends AlertDialog { + /** + * 显示的图片 + */ + private ImageView imageIv; + + /** + * 显示的标题 + */ + private TextView titleTv; + + /** + * 显示的消息 + */ + private TextView messageTv; + + /** + * 确认和取消按钮 + */ + private TextView positiveBn; + private TextView negtiveBn; + + /** + * 按钮之间的分割线 + */ +// private View columnLineView; + + private Context mContext; + + public CustomDialog(Context context) { + super(context, R.style.CustomDialog); + this.mContext = context; + } + + /** + * 都是内容数据 + */ + private String message; + private String title; + private String positive, negtive; + private int imageResId = -1; + + /** + * 底部是否只有一个按钮 + */ + private boolean isSingle = false; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.custom_dialog); + //按空白处不能取消动画 + setCanceledOnTouchOutside(false); + //初始化界面控件 + initView(); + //初始化界面数据 + refreshView(); + //初始化界面控件的事件 + initEvent(); + } + + /** + * 初始化界面的确定和取消监听器 + */ + private void initEvent() { + //设置确定按钮被点击后,向外界提供监听 + positiveBn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (onClickBottomListener != null) { + onClickBottomListener.onPositiveClick(); + } + } + }); + //设置取消按钮被点击后,向外界提供监听 + negtiveBn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (onClickBottomListener != null) { + onClickBottomListener.onNegtiveClick(); + } + } + }); + } + + /** + * 初始化界面控件的显示数据 + */ + private void refreshView() { + //如果用户自定了title和message + if (!TextUtils.isEmpty(title)) { + titleTv.setText(title); + titleTv.setVisibility(View.VISIBLE); + } else { + titleTv.setVisibility(View.GONE); + } + if (!TextUtils.isEmpty(message)) { + messageTv.setText(message); + } + //如果设置按钮的文字 + if (!TextUtils.isEmpty(positive)) { + positiveBn.setText(positive); + } else { + positiveBn.setText("确定"); + } + if (!TextUtils.isEmpty(negtive)) { + negtiveBn.setText(negtive); + } else { + negtiveBn.setText("取消"); + } + + if (imageResId != -1) { + imageIv.setImageResource(imageResId); + imageIv.setVisibility(View.VISIBLE); + } else { + imageIv.setVisibility(View.GONE); + } + /** + * 只显示一个按钮的时候隐藏取消按钮,回掉只执行确定的事件 + */ +// if (isSingle) { +//// columnLineView.setVisibility(View.GONE); +// negtiveBn.setVisibility(View.GONE); +// } else { +// negtiveBn.setVisibility(View.VISIBLE); +//// columnLineView.setVisibility(View.VISIBLE); +// } + } + + @Override + public void show() { + super.show(); + refreshView(); + } + + /** + * 初始化界面控件 + */ + private void initView() { + negtiveBn = findViewById(R.id.negtive); + positiveBn = findViewById(R.id.positive); + titleTv = findViewById(R.id.title); + messageTv = findViewById(R.id.message); + imageIv = findViewById(R.id.image); +// columnLineView = findViewById(R.id.column_line); + } + + /** + * 设置确定取消按钮的回调 + */ + private OnClickBottomListener onClickBottomListener; + + public void setOnClickBottomListener(OnClickBottomListener onClickBottomListener) { + this.onClickBottomListener = onClickBottomListener; + } + + public interface OnClickBottomListener { + /** + * 点击确定按钮事件 + */ + void onPositiveClick(); + + /** + * 点击取消按钮事件 + */ + void onNegtiveClick(); + } + + public String getMessage() { + return message; + } + + public CustomDialog setMessage(String message) { + this.message = message; + return this; + } + + public String getTitle() { + return title; + } + + public CustomDialog setTitle(String title) { + this.title = title; + return this; + } + + public String getPositive() { + return positive; + } + + public CustomDialog setPositive(String positive) { + this.positive = positive; + return this; + } + + public String getNegtive() { + return negtive; + } + + public CustomDialog setNegtive(String negtive) { + this.negtive = negtive; + return this; + } + + public CustomDialog setNegtiveText(String negtive) { + negtiveBn.setText(negtive); + return this; + } + + public int getImageResId() { + return imageResId; + } + + public boolean isSingle() { + return isSingle; + } + + public CustomDialog setSingle(boolean single) { + isSingle = single; + return this; + } + + public CustomDialog setImageResId(int imageResId) { + this.imageResId = imageResId; + return this; + } + + @Override + public void dismiss() { + super.dismiss(); + } +} diff --git a/app/src/main/java/com/uiui/aios/fragment/AppListFragment.java b/app/src/main/java/com/uiui/aios/fragment/AppListFragment.java index a8fcfe6..47be999 100644 --- a/app/src/main/java/com/uiui/aios/fragment/AppListFragment.java +++ b/app/src/main/java/com/uiui/aios/fragment/AppListFragment.java @@ -14,14 +14,17 @@ import android.view.WindowManager; import android.widget.ImageView; import android.widget.TextView; -import androidx.annotation.NonNull; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.fragment.app.Fragment; import com.google.gson.JsonObject; +import com.trello.rxlifecycle4.RxLifecycle; +import com.trello.rxlifecycle4.android.FragmentEvent; import com.uiui.aios.R; +import com.uiui.aios.base.BaseFragment; import com.uiui.aios.bean.BaseResponse; import com.uiui.aios.bean.DesktopIcon; +import com.uiui.aios.dialog.CustomDialog; import com.uiui.aios.dialog.PasswordDialog; import com.uiui.aios.network.NetInterfaceManager; import com.uiui.aios.service.NotificationService; @@ -36,6 +39,7 @@ import com.uiui.aios.view.MyGridLayout; import java.util.ArrayList; import java.util.Arrays; +import io.reactivex.rxjava3.annotations.NonNull; import io.reactivex.rxjava3.core.Observer; import io.reactivex.rxjava3.disposables.Disposable; @@ -44,7 +48,7 @@ import io.reactivex.rxjava3.disposables.Disposable; * Use the {@link AppListFragment#newInstance} factory method to * create an instance of this fragment. */ -public class AppListFragment extends Fragment { +public class AppListFragment extends BaseFragment { // TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER private static final String ARG_PARAM1 = "param1"; @@ -178,7 +182,7 @@ public class AppListFragment extends Fragment { int is_activation = Settings.Global.getInt(mContext.getContentResolver(), "uiui_activation", 0); if (is_activation == 0) { LauncherUtils.openLauncher3(mContext); - }else { + } else { showPassword(); } break; @@ -190,9 +194,74 @@ public class AppListFragment extends Fragment { } } } + + @Override + public void onLongClick(View v, int index) { + DesktopIcon desktopIcon = mDesktopIcons.get(index); + String pkg = desktopIcon.getPackageName(); + Log.e(TAG, "onLongClick: " + pkg); + switch (pkg) { + case "aios.exit": + case "com.uiui.sn": + break; + default: + showHinDialog(pkg, desktopIcon.getLable()); + } + } }); } + private void updateAppDisableStatus(String pkg, String label) { + NetInterfaceManager.getInstance().getUpdateAppIconObservable(pkg, label, 0) + .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, FragmentEvent.DESTROY)) + .subscribe(new Observer() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("updateAppDisableStatus", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse baseResponse) { + Log.e("updateAppDisableStatus", "onNext: " + baseResponse); + if (baseResponse.code == 200) { + ApkUtils.disableApp(mContext, pkg); + } else { + ToastUtil.show("隐藏失败,检查网络连接"); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("updateAppDisableStatus", "onError: "); + onComplete(); + } + + @Override + public void onComplete() { + Log.e("updateAppDisableStatus", "onComplete: "); + } + }); + } + + private void showHinDialog(String pkg, String label) { + CustomDialog customDialog = new CustomDialog(mContext); + customDialog.setTitle("隐藏应用"); + customDialog.setMessage("是否要隐藏:" + label); + customDialog.setOnClickBottomListener(new CustomDialog.OnClickBottomListener() { + @Override + public void onPositiveClick() { + updateAppDisableStatus(pkg, label); + customDialog.dismiss(); + } + + @Override + public void onNegtiveClick() { + customDialog.dismiss(); + } + }); + customDialog.show(); + } + private void showPassword() { PasswordDialog passwordDialog = new PasswordDialog(mContext); passwordDialog.setTitle("退出关怀系统"); diff --git a/app/src/main/java/com/uiui/aios/fragment/custom/CustomContact.java b/app/src/main/java/com/uiui/aios/fragment/custom/CustomContact.java new file mode 100644 index 0000000..2add150 --- /dev/null +++ b/app/src/main/java/com/uiui/aios/fragment/custom/CustomContact.java @@ -0,0 +1,26 @@ +package com.uiui.aios.fragment.custom; + + +import com.uiui.aios.base.BasePresenter; +import com.uiui.aios.base.BaseView; +import com.uiui.aios.bean.AlarmClockData; +import com.uiui.aios.bean.SnInfo; +import com.uiui.aios.bean.UserAvatarInfo; + +import java.util.List; + +public class CustomContact { + public interface Presenter extends BasePresenter { + void getSnIsActivation(); + void getSnInfo(); + void getUserAvatarInfo(); + void getAlarmClock(); + } + + public interface CustomView extends BaseView { + void setSnIsActivation(boolean activation); + void setSnInfo(SnInfo snInfo); + void setUserAvatarInfo(UserAvatarInfo userAvatarInfo); + void setAlarmClock(List clockDataList); + } +} diff --git a/app/src/main/java/com/uiui/aios/fragment/CustomFragment.java b/app/src/main/java/com/uiui/aios/fragment/custom/CustomFragment.java similarity index 90% rename from app/src/main/java/com/uiui/aios/fragment/CustomFragment.java rename to app/src/main/java/com/uiui/aios/fragment/custom/CustomFragment.java index b04f28a..df41dd2 100644 --- a/app/src/main/java/com/uiui/aios/fragment/CustomFragment.java +++ b/app/src/main/java/com/uiui/aios/fragment/custom/CustomFragment.java @@ -1,4 +1,4 @@ -package com.uiui.aios.fragment; +package com.uiui.aios.fragment.custom; import android.app.Activity; import android.app.ActivityManager; @@ -50,10 +50,9 @@ import com.uiui.aios.activity.contact.ContactActivity; import com.uiui.aios.activity.weather.WeatherActivity; import com.uiui.aios.adapter.NotificationAdapter; import com.uiui.aios.adapter.SOSNnmberAdapter; -import com.uiui.aios.alarm.AlarmUtils; +import com.uiui.aios.base.BaseFragment; import com.uiui.aios.bean.AlarmClockData; import com.uiui.aios.bean.AlarmItem; -import com.uiui.aios.bean.BaseResponse; import com.uiui.aios.bean.Contact; import com.uiui.aios.bean.HealthCode; import com.uiui.aios.bean.SnInfo; @@ -73,14 +72,10 @@ import com.uiui.aios.utils.Utils; import java.lang.reflect.Method; import java.lang.reflect.Type; -import java.util.ArrayList; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; -import io.reactivex.rxjava3.annotations.NonNull; -import io.reactivex.rxjava3.core.Observer; -import io.reactivex.rxjava3.disposables.Disposable; /** @@ -88,12 +83,14 @@ import io.reactivex.rxjava3.disposables.Disposable; * Use the {@link CustomFragment#newInstance} factory method to * create an instance of this fragment. */ -public class CustomFragment extends Fragment implements NetworkUtils.OnNetworkStatusChangedListener { +public class CustomFragment extends BaseFragment implements CustomContact.CustomView, NetworkUtils.OnNetworkStatusChangedListener { // @BindView(R.id.cl_alarm) // ConstraintLayout cl_alarm; @BindView(R.id.cl_weather) ConstraintLayout cl_weather; + @BindView(R.id.cl_activation) + ConstraintLayout cl_activation; @BindView(R.id.cl_clean) ConstraintLayout cl_shared_space; @BindView(R.id.cl_sos) @@ -157,6 +154,7 @@ public class CustomFragment extends Fragment implements NetworkUtils.OnNetworkSt private Activity mContext; private ContentResolver mCRv; private CacheHelper mCacheHelper; + private CustomPresenter mCustomPresenter; // TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER @@ -332,6 +330,9 @@ public class CustomFragment extends Fragment implements NetworkUtils.OnNetworkSt // Inflate the layout for this fragment rootView = inflater.inflate(R.layout.fragment_custom, container, false); mContext = (Activity) rootView.getContext(); + mCustomPresenter = new CustomPresenter(mContext); + mCustomPresenter.attachView(this); + mCustomPresenter.setLifecycle(lifecycleSubject); mCacheHelper = new CacheHelper(mContext); mCRv = mContext.getContentResolver(); ButterKnife.bind(this, rootView); @@ -406,6 +407,12 @@ public class CustomFragment extends Fragment implements NetworkUtils.OnNetworkSt startActivity(new Intent(mContext, WeatherActivity.class)); } }); + cl_activation.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + ApkUtils.openApp(mContext, "com.uiui.sn"); + } + }); cl_shared_space.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -513,51 +520,60 @@ public class CustomFragment extends Fragment implements NetworkUtils.OnNetworkSt } private void initData() { - NetInterfaceManager.getInstance().getSnInfo(new NetInterfaceManager.SnInfoCallback() { - @Override - public void setSnInfo(SnInfo snInfo) { - if (snInfo != null) { - if (TextUtils.isEmpty(snInfo.getSn_name())) { -// tv_name.setText("未设置"); - } else { -// tv_name.setText(snInfo.getSn_name()); - } - } else { -// tv_name.setText("未设置"); - } - } - }); - NetInterfaceManager.getInstance().getUserAvatarInfoControl() - .subscribe(new Observer>() { - @Override - public void onSubscribe(@NonNull Disposable d) { - Log.e("getUserAvatarInfoControl", "onSubscribe: "); - } + mCustomPresenter.getSnIsActivation(); - @Override - public void onNext(@NonNull BaseResponse userAvatarInfoBaseResponse) { - Log.e("getUserAvatarInfoControl", "onNext: " + userAvatarInfoBaseResponse); - if (userAvatarInfoBaseResponse.code == 200) { - if (!mContext.isDestroyed()) { -// Glide.with(iv_head).load(userAvatarInfoBaseResponse.data.getAvatar()).into(iv_head); - } - } - } - - @Override - public void onError(@NonNull Throwable e) { - Log.e("getUserAvatarInfoControl", "onError: " + e.getMessage()); - } - - @Override - public void onComplete() { - Log.e("getUserAvatarInfoControl", "onComplete: "); - } - }); initAmap(); // getAlarmClock(); } + @Override + public void setSnIsActivation(boolean activation) { + if (activation) { + cl_weather.setVisibility(View.VISIBLE); + cl_activation.setVisibility(View.GONE); + } else { + cl_weather.setVisibility(View.GONE); + cl_activation.setVisibility(View.VISIBLE); + } + mCustomPresenter.getSnInfo(); + } + + @Override + public void setSnInfo(SnInfo snInfo) { + if (snInfo != null) { + if (TextUtils.isEmpty(snInfo.getSn_name())) { +// tv_name.setText("未设置"); + } else { +// tv_name.setText(snInfo.getSn_name()); + } + } else { +// tv_name.setText("未设置"); + } + mCustomPresenter.getUserAvatarInfo(); + } + + @Override + public void setUserAvatarInfo(UserAvatarInfo userAvatarInfo) { + if (userAvatarInfo != null && userAvatarInfo.getAvatar() != null) { + if (!mContext.isDestroyed()) { +// Glide.with(iv_head).load(userAvatarInfo.getAvatar()).into(iv_head); + } + } + mCustomPresenter.getAlarmClock(); + } + + @Override + public void setAlarmClock(List clockDataList) { + if (clockDataList != null && clockDataList.size() != 0) { + notificationAdapter.setDataList(clockDataList); + rv_noti.setVisibility(View.VISIBLE); + iv_note_nodata.setVisibility(View.GONE); + } else { + rv_noti.setVisibility(View.GONE); + iv_note_nodata.setVisibility(View.VISIBLE); + } + } + @Override public void onStart() { super.onStart(); @@ -574,6 +590,7 @@ public class CustomFragment extends Fragment implements NetworkUtils.OnNetworkSt // setAlarm(); getAlarmClock(); setSosNumber(); + mCustomPresenter.getSnIsActivation(); } private void openScheme(String uri) { @@ -601,7 +618,7 @@ public class CustomFragment extends Fragment implements NetworkUtils.OnNetworkSt return; } - NetInterfaceManager.getInstance().getSnInfo(new NetInterfaceManager.SnInfoCallback() { + NetInterfaceManager.getInstance().getSnInfo(lifecycleSubject, new NetInterfaceManager.SnInfoCallback() { @Override public void setSnInfo(SnInfo snInfo) { if (snInfo == null || TextUtils.isEmpty(snInfo.getMobile())) { @@ -686,33 +703,7 @@ public class CustomFragment extends Fragment implements NetworkUtils.OnNetworkSt } private void getAlarmClock() { - NetInterfaceManager.getInstance().getAlarmClock(new NetInterfaceManager.AlarmClockCallback() { - @Override - public void setAlarmClock(List alarmClockList) { - AlarmClockData alarmClockData = AlarmUtils.getInstance().getRecentAlarmClock(); - List data = new ArrayList<>(); - if (alarmClockData != null) { - data.add(alarmClockData); - notificationAdapter.setDataList(data); - rv_noti.setVisibility(View.VISIBLE); - iv_note_nodata.setVisibility(View.GONE); - } else { - rv_noti.setVisibility(View.GONE); - iv_note_nodata.setVisibility(View.VISIBLE); - } - } - @Override - public void setAlarmClockEmpty() { - rv_noti.setVisibility(View.GONE); - iv_note_nodata.setVisibility(View.VISIBLE); - } - - @Override - public void onError() { - - } - }); } private void showNoData(String title, String msg) { @@ -825,7 +816,10 @@ public class CustomFragment extends Fragment implements NetworkUtils.OnNetworkSt private void killBackgroundApp() { List pkgList = ApkUtils.queryFilterAppList(mContext); for (String pkg : pkgList) { - if (pkg.equalsIgnoreCase(BuildConfig.APPLICATION_ID)) continue; + if (pkg.equalsIgnoreCase(BuildConfig.APPLICATION_ID) + || "com.tencent.mm".equals(pkg)) { + continue; + } killBackgroundProcesses(pkg); } refreshMemory(); @@ -865,6 +859,7 @@ public class CustomFragment extends Fragment implements NetworkUtils.OnNetworkSt @Override public void onDestroy() { super.onDestroy(); + mCustomPresenter.detachView(); NetworkUtils.unregisterNetworkStatusChangedListener(this); if (batteryReceiver != null) { mContext.unregisterReceiver(batteryReceiver); diff --git a/app/src/main/java/com/uiui/aios/fragment/CustomPagerAdapter.java b/app/src/main/java/com/uiui/aios/fragment/custom/CustomPagerAdapter.java similarity index 94% rename from app/src/main/java/com/uiui/aios/fragment/CustomPagerAdapter.java rename to app/src/main/java/com/uiui/aios/fragment/custom/CustomPagerAdapter.java index 173265c..1d64512 100644 --- a/app/src/main/java/com/uiui/aios/fragment/CustomPagerAdapter.java +++ b/app/src/main/java/com/uiui/aios/fragment/custom/CustomPagerAdapter.java @@ -1,4 +1,4 @@ -package com.uiui.aios.fragment; +package com.uiui.aios.fragment.custom; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; diff --git a/app/src/main/java/com/uiui/aios/fragment/custom/CustomPresenter.java b/app/src/main/java/com/uiui/aios/fragment/custom/CustomPresenter.java new file mode 100644 index 0000000..ac5e732 --- /dev/null +++ b/app/src/main/java/com/uiui/aios/fragment/custom/CustomPresenter.java @@ -0,0 +1,162 @@ +package com.uiui.aios.fragment.custom; + +import android.content.Context; +import android.provider.Settings; +import android.util.Log; + +import com.google.gson.JsonObject; +import com.trello.rxlifecycle4.RxLifecycle; +import com.trello.rxlifecycle4.android.FragmentEvent; +import com.uiui.aios.alarm.AlarmUtils; +import com.uiui.aios.bean.AlarmClockData; +import com.uiui.aios.bean.BaseResponse; +import com.uiui.aios.bean.SnInfo; +import com.uiui.aios.bean.UserAvatarInfo; +import com.uiui.aios.network.NetInterfaceManager; +import com.uiui.aios.utils.GsonUtils; + +import java.util.ArrayList; +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; + +public class CustomPresenter implements CustomContact.Presenter { + private static final String TAG = CustomPresenter.class.getSimpleName(); + private Context mContext; + private CustomContact.CustomView mView; + + public CustomPresenter(Context context) { + this.mContext = context; + } + + private BehaviorSubject lifecycle; + + void setLifecycle(BehaviorSubject lifecycle) { + this.lifecycle = lifecycle; + } + + public BehaviorSubject getLifecycle() { + return lifecycle; + } + + @Override + public void attachView(@NonNull CustomContact.CustomView view) { + this.mView = view; + } + + @Override + public void detachView() { + this.mView = null; + } + + @Override + public void getSnIsActivation() { + NetInterfaceManager.getInstance() + .getSnIsActivationObservable() + .compose(RxLifecycle.bindUntilEvent(lifecycle, FragmentEvent.DESTROY)) + .subscribe(new Observer() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("getSnIsActivation", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse baseResponse) { + Log.e("getSnIsActivation", "onNext: " + baseResponse); + if (baseResponse.code == 200) { + JsonObject jsonObject = GsonUtils.getJsonObject(baseResponse.data.toString()); + int is_activation = jsonObject.get("is_activation").getAsInt(); + Settings.Global.putInt(mContext.getContentResolver(), "uiui_activation", is_activation); + mView.setSnIsActivation(is_activation == 1); +// mView.setSnIsActivation(false); + } else { + mView.setSnIsActivation(false); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("getSnIsActivation", "onError: " + e.getMessage()); + int is_activation = Settings.Global.getInt(mContext.getContentResolver(), "uiui_activation", 0); + mView.setSnIsActivation(is_activation == 1); + onComplete(); + } + + @Override + public void onComplete() { + Log.e("getSnIsActivation", "onComplete: "); + } + }); + } + + @Override + public void getSnInfo() { + NetInterfaceManager.getInstance().getSnInfo(getLifecycle(), new NetInterfaceManager.SnInfoCallback() { + @Override + public void setSnInfo(SnInfo snInfo) { + mView.setSnInfo(snInfo); + } + }); + } + + @Override + public void getUserAvatarInfo() { + NetInterfaceManager.getInstance() + .getUserAvatarInfoControl() + .compose(RxLifecycle.bindUntilEvent(getLifecycle(), FragmentEvent.DESTROY)) + .subscribe(new Observer>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("getUserAvatarInfoControl", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse userAvatarInfoBaseResponse) { + Log.e("getUserAvatarInfoControl", "onNext: " + userAvatarInfoBaseResponse); + mView.setUserAvatarInfo(userAvatarInfoBaseResponse.data); + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("getUserAvatarInfoControl", "onError: " + e.getMessage()); + onComplete(); + } + + @Override + public void onComplete() { + Log.e("getUserAvatarInfoControl", "onComplete: "); + } + }); + } + + @Override + public void getAlarmClock() { + NetInterfaceManager.getInstance().getAlarmClock(new NetInterfaceManager.AlarmClockCallback() { + @Override + public void setAlarmClock(List alarmClockList) { + AlarmClockData alarmClockData = AlarmUtils.getInstance().getRecentAlarmClock(); + if (alarmClockData != null) { + List data = new ArrayList<>(); + data.add(alarmClockData); + mView.setAlarmClock(data); + } else { + mView.setAlarmClock(null); + } + } + + @Override + public void setAlarmClockEmpty() { + mView.setAlarmClock(null); + } + + @Override + public void onError() { + + } + }); + } + +} diff --git a/app/src/main/java/com/uiui/aios/network/NetInterfaceManager.java b/app/src/main/java/com/uiui/aios/network/NetInterfaceManager.java index 717f73b..e82121d 100644 --- a/app/src/main/java/com/uiui/aios/network/NetInterfaceManager.java +++ b/app/src/main/java/com/uiui/aios/network/NetInterfaceManager.java @@ -43,7 +43,9 @@ import com.uiui.aios.network.api.SNInfoApi; import com.uiui.aios.network.api.SOSRecordApi; import com.uiui.aios.network.api.SendScreenshotApi; import com.uiui.aios.network.api.Setting; +import com.uiui.aios.network.api.SnIsActivationApi; import com.uiui.aios.network.api.UpdateAlarmClockApi; +import com.uiui.aios.network.api.UpdateAppIconApi; import com.uiui.aios.network.api.UpdateDesktopApi; import com.uiui.aios.network.api.UserInfoControl; import com.uiui.aios.network.interceptor.RepeatRequestInterceptor; @@ -255,6 +257,20 @@ public class NetInterfaceManager { .observeOn(AndroidSchedulers.mainThread()); } + public Observable getSnIsActivationObservable() { + return mRetrofit.create(SnIsActivationApi.class) + .getSnIsActivation(Utils.getSerial()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Observable getUpdateAppIconObservable(String pkg, String label, int type) { + return mRetrofit.create(UpdateAppIconApi.class) + .appIconUpdate(Utils.getSerial(), pkg, type, label) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + public interface onCompleteCallback { void onComplete(); @@ -776,8 +792,9 @@ public class NetInterfaceManager { void setSnInfo(SnInfo snInfo); } - public void getSnInfo(SnInfoCallback callback) { + public void getSnInfo(BehaviorSubject lifecycle, SnInfoCallback callback) { getsnInfoControl() + .compose(RxLifecycle.bindUntilEvent(lifecycle, FragmentEvent.DESTROY)) .subscribe(new Observer>() { @Override public void onSubscribe(@NonNull Disposable d) { diff --git a/app/src/main/java/com/uiui/aios/network/URLAddress.java b/app/src/main/java/com/uiui/aios/network/URLAddress.java index f21b4b6..f801e58 100644 --- a/app/src/main/java/com/uiui/aios/network/URLAddress.java +++ b/app/src/main/java/com/uiui/aios/network/URLAddress.java @@ -2,6 +2,9 @@ package com.uiui.aios.network; public class URLAddress { public static final String ROOT_URL = "https://led.zuoyepad.com/android/"; + + /*获取设备是否激活*/ + public static final String GET_SN_IS_ACTIVATION = "sn/getSnIsActivation"; /*设备信息接口*/ public static final String SNINFO = "sn/getSnInfo"; /*获取用户头像和信息*/ @@ -42,6 +45,8 @@ public class URLAddress { public static final String GET_MAIL_LIST = "Control/getMailList"; /*获取负二屏开关*/ public static final String GET_ADMIN_SN_SETTING = "getAdminSnSetting"; + /*更新app隐藏或者显示状态*/ + public static final String APP_ICON_UPDATE = "Control/appIconUpdate"; diff --git a/app/src/main/java/com/uiui/aios/network/api/SnIsActivationApi.java b/app/src/main/java/com/uiui/aios/network/api/SnIsActivationApi.java new file mode 100644 index 0000000..3790547 --- /dev/null +++ b/app/src/main/java/com/uiui/aios/network/api/SnIsActivationApi.java @@ -0,0 +1,15 @@ +package com.uiui.aios.network.api; + +import com.uiui.aios.bean.BaseResponse; +import com.uiui.aios.network.URLAddress; + +import io.reactivex.rxjava3.core.Observable; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public interface SnIsActivationApi { + @GET(URLAddress.GET_SN_IS_ACTIVATION) + Observable getSnIsActivation( + @Query("sn") String sn + ); +} diff --git a/app/src/main/java/com/uiui/aios/network/api/UpdateAppIconApi.java b/app/src/main/java/com/uiui/aios/network/api/UpdateAppIconApi.java new file mode 100644 index 0000000..53ed84d --- /dev/null +++ b/app/src/main/java/com/uiui/aios/network/api/UpdateAppIconApi.java @@ -0,0 +1,20 @@ +package com.uiui.aios.network.api; + +import com.uiui.aios.bean.BaseResponse; +import com.uiui.aios.network.URLAddress; + +import io.reactivex.rxjava3.core.Observable; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.POST; + +public interface UpdateAppIconApi { + @FormUrlEncoded + @POST(URLAddress.APP_ICON_UPDATE) + Observable appIconUpdate( + @Field("sn") String sn, + @Field("app_package") String app_package, + @Field("type") int type,//类型 1显示 0隐藏 + @Field("app_name") String app_name + ); +} diff --git a/app/src/main/java/com/uiui/aios/utils/ApkUtils.java b/app/src/main/java/com/uiui/aios/utils/ApkUtils.java index d81dd33..eba008f 100644 --- a/app/src/main/java/com/uiui/aios/utils/ApkUtils.java +++ b/app/src/main/java/com/uiui/aios/utils/ApkUtils.java @@ -48,16 +48,17 @@ public class ApkUtils { this.add("org.chromium.browser"); this.add("com.sprd.sprdnote"); this.add("com.android.deskclock"); - this.add("com.alldocube.store"); this.add("com.android.email"); this.add("com.android.calendar"); this.add("com.android.uiuios"); this.add("com.uiui.os"); this.add("com.uiui.health"); - this.add("com.tencent.android.qqdownloader"); this.add("com.uiui.appstore"); +// this.add("com.tencent.android.qqdownloader"); +// this.add("com.alldocube.store"); }}; private static HashSet showPackageName = new HashSet() {{ + this.add("com.uiui.sn"); this.add("com.android.dialer"); this.add("com.android.gallery3d"); this.add("com.android.settings"); @@ -66,10 +67,18 @@ public class ApkUtils { this.add("com.mediatek.camera"); this.add("com.android.mms"); this.add("com.uiui.city"); - this.add("com.alldocube.store"); this.add("com.android.fmradio"); this.add("com.android.documentsui"); this.add("com.android.calculator2"); + this.add("cn.wps.moffice_eng"); + this.add("com.baidu.searchbox.lite"); + this.add("com.ss.android.article.video"); + this.add("com.ss.android.ugc.aweme"); + this.add("com.smile.gifmaker"); + this.add("com.kuaikan.comic"); + this.add("com.jxw.launcher"); + this.add("com.tencent.android.qqdownloader"); + this.add("com.alldocube.store"); }}; private static HashSet allHintPackage = new HashSet() {{ this.add("com.android.uiuios"); @@ -177,6 +186,7 @@ public class ApkUtils { } if (Settings.Global.getInt(context.getContentResolver(), "is_activity", 0) == 0) { applicationInfos.removeIf(applicationInfo -> "com.uiui.city".equals(applicationInfo.packageName)); +// applicationInfos.removeIf(applicationInfo -> "com.uiui.sn".equals(applicationInfo.packageName)); } applicationInfos.sort(new Comparator() { @@ -220,11 +230,20 @@ public class ApkUtils { return desktopIcons; } - private static boolean appIsDisable(Context context, String pkg) { + public static boolean appIsDisable(Context context, String pkg) { PackageManager pm = context.getPackageManager(); return pm.getApplicationEnabledSetting(pkg) == PackageManager.COMPONENT_ENABLED_STATE_DISABLED; } + public static boolean disableApp(Context context, String pkg) { + PackageManager pm = context.getPackageManager(); + try { + pm.setApplicationEnabledSetting(pkg, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0); + return true; + } catch (Exception e) { + return false; + } + } /** * 获取第三方应用 diff --git a/app/src/main/java/com/uiui/aios/view/MyGridLayout.java b/app/src/main/java/com/uiui/aios/view/MyGridLayout.java index bff1a0d..f4a62a4 100644 --- a/app/src/main/java/com/uiui/aios/view/MyGridLayout.java +++ b/app/src/main/java/com/uiui/aios/view/MyGridLayout.java @@ -7,7 +7,6 @@ import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; - import com.uiui.aios.R; import com.uiui.aios.bean.DesktopIcon; @@ -143,6 +142,8 @@ public class MyGridLayout extends ViewGroup { public interface OnItemClickListener { void onItemClick(View v, int index); + + void onLongClick(View v, int index); } private ArrayList applicationInfos; @@ -164,12 +165,18 @@ public class MyGridLayout extends ViewGroup { final int index = i; View view = getChildAt(i); view.setOnClickListener(new View.OnClickListener() { - @Override public void onClick(View v) { click.onItemClick(v, index); } }); + view.setOnLongClickListener(new OnLongClickListener() { + @Override + public boolean onLongClick(View view) { + click.onLongClick(view, index); + return false; + } + }); if (applicationInfos.get(index) == null) { view.setClickable(false); } else { diff --git a/app/src/main/res/drawable-hdpi/com_uiui_sn.png b/app/src/main/res/drawable-hdpi/com_uiui_sn.png index ed8e037..d4d1d10 100644 Binary files a/app/src/main/res/drawable-hdpi/com_uiui_sn.png and b/app/src/main/res/drawable-hdpi/com_uiui_sn.png differ diff --git a/app/src/main/res/drawable-hdpi/home_activation_icon.png b/app/src/main/res/drawable-hdpi/home_activation_icon.png new file mode 100644 index 0000000..62b6183 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/home_activation_icon.png differ diff --git a/app/src/main/res/layout-land/fragment_custom.xml b/app/src/main/res/layout-land/fragment_custom.xml index 6bf77c8..17495d3 100644 --- a/app/src/main/res/layout-land/fragment_custom.xml +++ b/app/src/main/res/layout-land/fragment_custom.xml @@ -25,7 +25,8 @@ android:layout_marginEnd="4dp" android:layout_marginBottom="4dp" android:layout_weight="3" - android:background="@drawable/custom_bg_weather"> + android:background="@drawable/custom_bg_weather" + android:visibility="visible"> @@ -92,6 +93,56 @@ app:layout_constraintTop_toTopOf="@+id/tv_location" /> + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + + android:background="@drawable/custom_bg_weather" + android:visibility="visible"> @@ -93,6 +94,56 @@ app:layout_constraintTop_toBottomOf="@+id/tv_temp" /> + + + + + + + + + + + @@ -149,15 +200,15 @@ - - - - - - - - - + + + + + + + + + @@ -195,10 +246,10 @@ @@ -255,25 +306,25 @@ - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 8d26a1d..af488a4 100644 --- a/build.gradle +++ b/build.gradle @@ -4,10 +4,10 @@ buildscript { repositories { google() - jcenter() - maven { url "https://jitpack.io" } mavenCentral() + maven { url "https://jitpack.io" } maven { url 'http://developer.huawei.com/repo/' } + maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' } } dependencies { classpath 'com.android.tools.build:gradle:3.6.4' @@ -21,10 +21,10 @@ buildscript { allprojects { repositories { google() - jcenter() - maven { url "https://jitpack.io" } mavenCentral() + maven { url "https://jitpack.io" } maven { url 'http://developer.huawei.com/repo/' } + maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' } } gradle.projectsEvaluated { tasks.withType(JavaCompile) {