From 14860a6dd16660f9fd7d22654d79f7d28c04afea Mon Sep 17 00:00:00 2001
From: Fanhuitong <981964879@qq.com>
Date: Thu, 8 Jun 2023 10:07:46 +0800
Subject: [PATCH] =?UTF-8?q?version:1.4.3=20fix:=20update:=E5=A2=9E?=
=?UTF-8?q?=E5=8A=A0=E6=B7=BB=E5=8A=A0=E5=BA=94=E7=94=A8=EF=BC=8C=E5=AE=9E?=
=?UTF-8?q?=E6=97=B6=E6=9B=B4=E6=96=B0=E4=BF=A1=E6=81=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/build.gradle | 4 +-
app/src/main/AndroidManifest.xml | 16 +-
.../uiui/zyos/activity/AddIconActivity.java | 81 ++++++
.../com/uiui/zyos/activity/ExitActivity.java | 4 +-
.../uiui/zyos/activity/PasswordActivity.java | 181 +++++++++++++
.../zyos/activity/more/MoreAppActivity.java | 9 +-
.../zyos/activity/more/MorePresenter.java | 11 +-
.../com/uiui/zyos/adapter/AddAppAdapter.java | 123 +++++++++
.../com/uiui/zyos/adapter/AppAdapter.java | 26 +-
.../com/uiui/zyos/base/BaseApplication.java | 2 +
.../uiui/zyos/fragment/user/UserFragment.java | 1 +
.../zyos/fragment/user/UserPresenter.java | 12 +-
.../com/uiui/zyos/manager/AppManager.java | 255 ++++++++++++++++++
.../java/com/uiui/zyos/utils/ApkUtils.java | 6 +-
app/src/main/res/drawable-hdpi/icon_add.png | Bin 0 -> 2036 bytes
.../main/res/drawable-hdpi/icon_selected.png | Bin 0 -> 2014 bytes
.../main/res/drawable-hdpi/icon_unselect.png | Bin 0 -> 1916 bytes
app/src/main/res/layout/activity_add_icon.xml | 66 +++++
.../{layout-land => layout}/activity_exit.xml | 0
.../activity_passwd.xml} | 2 +-
app/src/main/res/layout/item_add_app.xml | 56 ++++
21 files changed, 829 insertions(+), 26 deletions(-)
create mode 100644 app/src/main/java/com/uiui/zyos/activity/AddIconActivity.java
create mode 100644 app/src/main/java/com/uiui/zyos/activity/PasswordActivity.java
create mode 100644 app/src/main/java/com/uiui/zyos/adapter/AddAppAdapter.java
create mode 100644 app/src/main/java/com/uiui/zyos/manager/AppManager.java
create mode 100644 app/src/main/res/drawable-hdpi/icon_add.png
create mode 100644 app/src/main/res/drawable-hdpi/icon_selected.png
create mode 100644 app/src/main/res/drawable-hdpi/icon_unselect.png
create mode 100644 app/src/main/res/layout/activity_add_icon.xml
rename app/src/main/res/{layout-land => layout}/activity_exit.xml (100%)
rename app/src/main/res/{layout-port/activity_exit.xml => layout/activity_passwd.xml} (99%)
create mode 100644 app/src/main/res/layout/item_add_app.xml
diff --git a/app/build.gradle b/app/build.gradle
index 57383ac..85e80b6 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -17,8 +17,8 @@ android {
minSdkVersion 24
targetSdkVersion 29
- versionCode 31
- versionName "1.3.9"
+ versionCode 35
+ versionName "1.4.3"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index c5fe1da..59db435 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -90,12 +90,23 @@
android:excludeFromRecents="true"
android:screenOrientation="portrait"
android:theme="@style/activity_styles" />
+
+
+ android:launchMode="singleTask"
+ android:screenOrientation="userLandscape" />
-
-
+
stringIntegerHashMap = new HashMap<>();
+ WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
+ DisplayMetrics dm = new DisplayMetrics();
+ wm.getDefaultDisplay().getRealMetrics(dm);
+ float density = dm.density; // 屏幕密度(0.75 / 1.0 / 1.5)
+ stringIntegerHashMap.put(RecyclerViewSpacesItemDecoration.TOP_DECORATION, (int) (density * 1));//top间距
+ stringIntegerHashMap.put(RecyclerViewSpacesItemDecoration.BOTTOM_DECORATION, (int) (density * 1));//底部间距
+ stringIntegerHashMap.put(RecyclerViewSpacesItemDecoration.LEFT_DECORATION, (int) (density * 20));//左间距
+ stringIntegerHashMap.put(RecyclerViewSpacesItemDecoration.RIGHT_DECORATION, (int) (density * 20));//右间距
+ recyclerView.addItemDecoration(new RecyclerViewSpacesItemDecoration(stringIntegerHashMap));
+ mAddAppAdapter = new AddAppAdapter();
+ recyclerView.setAdapter(mAddAppAdapter);
+ }
+
+ @Override
+ public void initData() {
+ ArrayList desktopIcons = AppManager.getInstance().getAllAppList();
+ mAddAppAdapter.setDesktopIcons(desktopIcons);
+ Set appList = AppManager.getInstance().getFilterAppset();
+ mAddAppAdapter.setPackageSet(appList);
+
+ tv_appsize.setText(String.format(getString(R.string.app_size), desktopIcons.size()));
+
+ }
+
+
+}
diff --git a/app/src/main/java/com/uiui/zyos/activity/ExitActivity.java b/app/src/main/java/com/uiui/zyos/activity/ExitActivity.java
index fcd655e..fc78a13 100644
--- a/app/src/main/java/com/uiui/zyos/activity/ExitActivity.java
+++ b/app/src/main/java/com/uiui/zyos/activity/ExitActivity.java
@@ -142,7 +142,7 @@ public class ExitActivity extends BaseActivity {
return;
}
Log.e(TAG, "inputComplete: " + content);
- String password = Settings.Global.getString(getContentResolver(), CommonConfig.DEFAULT_PASSWORD);
+ String password = Settings.Global.getString(getContentResolver(), CommonConfig.LOCK_SCREEN_PASSWORD);
if ((!TextUtils.isEmpty(content) && !TextUtils.isEmpty(password))) {
if (password.equals(content)) {
exitDesktop();
@@ -187,7 +187,7 @@ public class ExitActivity extends BaseActivity {
String oldText = codeView.getEditText().getText().toString();
Log.e(TAG, "add: " + oldText);
codeView.getEditText().setText(text);
- soundPool.play(soundId, 1, 1, 0, 0, 1);
+// soundPool.play(soundId, 1, 1, 0, 0, 1);
}
private void exitDesktop() {
diff --git a/app/src/main/java/com/uiui/zyos/activity/PasswordActivity.java b/app/src/main/java/com/uiui/zyos/activity/PasswordActivity.java
new file mode 100644
index 0000000..cf84160
--- /dev/null
+++ b/app/src/main/java/com/uiui/zyos/activity/PasswordActivity.java
@@ -0,0 +1,181 @@
+package com.uiui.zyos.activity;
+
+import android.content.Context;
+import android.content.Intent;
+import android.media.AudioAttributes;
+import android.media.SoundPool;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Handler;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.view.WindowManager;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import androidx.annotation.Nullable;
+
+import com.tuo.customview.VerificationCodeView;
+import com.uiui.zyos.R;
+import com.uiui.zyos.base.BaseActivity;
+import com.uiui.zyos.config.CommonConfig;
+import com.uiui.zyos.manager.RemoteManager;
+import com.uiui.zyos.utils.ApkUtils;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+
+public class PasswordActivity extends BaseActivity {
+
+ private static final String TAG = PasswordActivity.class.getSimpleName();
+
+ @BindView(R.id.bt_0)
+ TextView bt0;
+ @BindView(R.id.bt_1)
+ TextView bt1;
+ @BindView(R.id.bt_2)
+ TextView bt2;
+ @BindView(R.id.bt_3)
+ TextView bt3;
+ @BindView(R.id.bt_4)
+ TextView bt4;
+ @BindView(R.id.bt_5)
+ TextView bt5;
+ @BindView(R.id.bt_6)
+ TextView bt6;
+ @BindView(R.id.bt_7)
+ TextView bt7;
+ @BindView(R.id.bt_8)
+ TextView bt8;
+ @BindView(R.id.bt_9)
+ TextView bt9;
+ @BindView(R.id.bt_del)
+ TextView bt_del;
+ @BindView(R.id.bt_confirm)
+ TextView bt_confirm;
+
+ @BindView(R.id.textView)
+ TextView textView;
+ @BindView(R.id.tv_hint)
+ TextView tv_hint;
+ @BindView(R.id.ll_keyboard)
+ LinearLayout ll_keyboard;
+ @BindView(R.id.icv)
+ VerificationCodeView codeView;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
+ }
+
+ @Override
+ public int getLayoutId() {
+ return R.layout.activity_passwd;
+ }
+
+ @Override
+ public void initView() {
+ ButterKnife.bind(this);
+ InputMethodManager imm = (InputMethodManager) PasswordActivity.this.getSystemService(Context.INPUT_METHOD_SERVICE);
+ imm.hideSoftInputFromWindow(codeView.getWindowToken(), 0);
+ codeView.getEditText().setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ ll_keyboard.setVisibility(View.VISIBLE);
+ }
+ });
+ codeView.setInputCompleteListener(new VerificationCodeView.InputCompleteListener() {
+ @Override
+ public void inputComplete() {
+ checkPasswd();
+ }
+
+ @Override
+ public void deleteContent() {
+
+ }
+ });
+
+ bt_del.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ tv_hint.setText("");
+ codeView.clearInputContent();
+ }
+ });
+ bt_confirm.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ checkPasswd();
+ }
+ });
+
+ bt0.setOnClickListener(view1 -> add(codeView, "0"));
+ bt1.setOnClickListener(view1 -> add(codeView, "1"));
+ bt2.setOnClickListener(view1 -> add(codeView, "2"));
+ bt3.setOnClickListener(view1 -> add(codeView, "3"));
+ bt4.setOnClickListener(view1 -> add(codeView, "4"));
+ bt5.setOnClickListener(view1 -> add(codeView, "5"));
+ bt6.setOnClickListener(view1 -> add(codeView, "6"));
+ bt7.setOnClickListener(view1 -> add(codeView, "7"));
+ bt8.setOnClickListener(view1 -> add(codeView, "8"));
+ bt9.setOnClickListener(view1 -> add(codeView, "9"));
+ }
+
+ private void checkPasswd() {
+ String content = codeView.getInputContent();
+ if (TextUtils.isEmpty(content) || content.length() != 6) {
+ return;
+ }
+ Log.e(TAG, "inputComplete: " + content);
+ String password = Settings.Global.getString(getContentResolver(), CommonConfig.LOCK_SCREEN_PASSWORD);
+ if ((!TextUtils.isEmpty(content) && !TextUtils.isEmpty(password))) {
+ if (password.equals(content)) {
+ startActivity(new Intent(PasswordActivity.this, AddIconActivity.class));
+ finish();
+ } else {
+ setEmpty();
+ tv_hint.setText("密码错误");
+ }
+ } else if (CommonConfig.DEFAULT_PASSWORD.equals(content)) {
+ startActivity(new Intent(PasswordActivity.this, AddIconActivity.class));
+ finish();
+ } else {
+ setEmpty();
+ tv_hint.setText("密码错误");
+ }
+ }
+
+ private void setEmpty() {
+ Handler.getMain().postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ codeView.clearInputContent();
+ tv_hint.setText("");
+ }
+ }, 1000);
+ }
+
+ @Override
+ public void initData() {
+
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ }
+
+ private void add(VerificationCodeView codeView, String text) {
+ Log.e(TAG, "add: text = " + text);
+ String oldText = codeView.getEditText().getText().toString();
+ Log.e(TAG, "add: " + oldText);
+ codeView.getEditText().setText(text);
+ }
+
+
+}
diff --git a/app/src/main/java/com/uiui/zyos/activity/more/MoreAppActivity.java b/app/src/main/java/com/uiui/zyos/activity/more/MoreAppActivity.java
index c11ae8a..7d30b54 100644
--- a/app/src/main/java/com/uiui/zyos/activity/more/MoreAppActivity.java
+++ b/app/src/main/java/com/uiui/zyos/activity/more/MoreAppActivity.java
@@ -72,7 +72,6 @@ public class MoreAppActivity extends BaseActivity implements MoreContact.MoreVie
recyclerView.addItemDecoration(new RecyclerViewSpacesItemDecoration(stringIntegerHashMap));
mAppAdapter = new AppAdapter();
recyclerView.setAdapter(mAppAdapter);
-
}
@Override
@@ -81,6 +80,12 @@ public class MoreAppActivity extends BaseActivity implements MoreContact.MoreVie
mPresenter.getInstalledApp();
}
+ @Override
+ protected void onResume() {
+ super.onResume();
+ mPresenter.getInstalledApp();
+ }
+
@Override
protected void onDestroy() {
super.onDestroy();
@@ -92,7 +97,7 @@ public class MoreAppActivity extends BaseActivity implements MoreContact.MoreVie
@Override
public void setDesktopIcons(List desktopIcons) {
mAppAdapter.setDesktopIcons(desktopIcons);
- tv_appsize.setText(String.format(getString(R.string.app_size), desktopIcons.size()));
+ tv_appsize.setText(String.format(getString(R.string.app_size), desktopIcons.size() - 1));
}
private AppChangedReceiver mAppChangedReceiver;
diff --git a/app/src/main/java/com/uiui/zyos/activity/more/MorePresenter.java b/app/src/main/java/com/uiui/zyos/activity/more/MorePresenter.java
index 955103f..40f5e5b 100644
--- a/app/src/main/java/com/uiui/zyos/activity/more/MorePresenter.java
+++ b/app/src/main/java/com/uiui/zyos/activity/more/MorePresenter.java
@@ -6,8 +6,9 @@ import android.util.Log;
import androidx.annotation.NonNull;
import com.trello.rxlifecycle4.android.ActivityEvent;
+import com.uiui.zyos.R;
import com.uiui.zyos.bean.DesktopIcon;
-import com.uiui.zyos.utils.ApkUtils;
+import com.uiui.zyos.manager.AppManager;
import java.util.ArrayList;
@@ -16,6 +17,7 @@ import io.reactivex.rxjava3.subjects.BehaviorSubject;
public class MorePresenter implements MoreContact.Presenter {
private static final String TAG = MorePresenter.class.getSimpleName();
+
private Context mContext;
private MoreContact.MoreView mView;
@@ -46,7 +48,12 @@ public class MorePresenter implements MoreContact.Presenter {
@Override
public void getInstalledApp() {
- ArrayList desktopIcons = ApkUtils.queryFilterAppInfo(mContext);
+ ArrayList desktopIcons = AppManager.getInstance().getFilterAppList();
+ DesktopIcon desktopIcon = new DesktopIcon();
+ desktopIcon.setLable("添加应用");
+ desktopIcon.setPackageName("com.zyos.add");
+ desktopIcon.setIcon(mContext.getDrawable(R.drawable.icon_add));
+ desktopIcons.add(desktopIcons.size(), desktopIcon);
mView.setDesktopIcons(desktopIcons);
}
}
diff --git a/app/src/main/java/com/uiui/zyos/adapter/AddAppAdapter.java b/app/src/main/java/com/uiui/zyos/adapter/AddAppAdapter.java
new file mode 100644
index 0000000..f569ed7
--- /dev/null
+++ b/app/src/main/java/com/uiui/zyos/adapter/AddAppAdapter.java
@@ -0,0 +1,123 @@
+package com.uiui.zyos.adapter;
+
+import android.content.Context;
+import android.content.Intent;
+import android.provider.Settings;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.constraintlayout.widget.ConstraintLayout;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.uiui.zyos.R;
+import com.uiui.zyos.activity.PasswordActivity;
+import com.uiui.zyos.bean.DesktopIcon;
+import com.uiui.zyos.config.CommonConfig;
+import com.uiui.zyos.manager.AppManager;
+import com.uiui.zyos.utils.ApkUtils;
+import com.uiui.zyos.utils.BitmapUtils;
+import com.uiui.zyos.utils.IconUtils;
+import com.uiui.zyos.utils.OpenApkUtils;
+import com.uiui.zyos.utils.ToastUtil;
+
+import java.util.List;
+import java.util.Set;
+
+public class AddAppAdapter extends RecyclerView.Adapter {
+ private static final String TAG = AddAppAdapter.class.getSimpleName();
+
+ private Context mContext;
+
+ private List desktopIcons;
+
+ private Set packageSet;
+
+ @NonNull
+ @Override
+ public AppHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ mContext = parent.getContext();
+ return new AppHolder(LayoutInflater.from(mContext).inflate(R.layout.item_add_app, parent, false));
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull AppHolder holder, int position) {
+ DesktopIcon desktopIcon = desktopIcons.get(position);
+ String lable = desktopIcon.getLable();
+ holder.tv_appname.setText(lable);
+ holder.iv_icon.setImageDrawable(desktopIcon.getIcon());
+ String pkg = desktopIcon.getPackageName();
+
+ if (packageSet != null) {
+ if (packageSet.contains(pkg)) {
+ holder.iv_select.setImageDrawable(mContext.getDrawable(R.drawable.icon_selected));
+ } else {
+ holder.iv_select.setImageDrawable(mContext.getDrawable(R.drawable.icon_unselect));
+ }
+ }
+
+ Log.e(TAG, "getView: " + pkg);
+ int i = IconUtils.appClassNameList.indexOf(pkg);
+ if (i != -1) {
+ String val = IconUtils.appIconList.get(i);
+ int resID = mContext.getResources().getIdentifier(val, "drawable", "com.uiui.zyos");
+ if (resID == 0) {
+ Log.e(TAG, "getView: not found src : " + pkg);
+ holder.iv_icon.setImageBitmap(BitmapUtils.getIconBitmap(mContext, desktopIcon.getIcon()));
+ } else {
+ holder.iv_icon.setImageDrawable(mContext.getResources().getDrawable(resID));
+ }
+ } else {
+ if (AppManager.ADD_NAME.equals(pkg)) {
+ holder.iv_icon.setImageDrawable(desktopIcon.getIcon());
+ } else {
+ holder.iv_icon.setImageBitmap(BitmapUtils.getIconBitmap(mContext, desktopIcon.getIcon()));
+ }
+ }
+ holder.root.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ if (packageSet.contains(pkg)) {
+ packageSet.remove(pkg);
+ AppManager.getInstance().removePakcage(pkg);
+ } else {
+ packageSet.add(pkg);
+ AppManager.getInstance().addPakcage(pkg);
+ }
+ notifyDataSetChanged();
+ }
+ });
+ }
+
+ @Override
+ public int getItemCount() {
+ return desktopIcons == null ? 0 : desktopIcons.size();
+ }
+
+ public void setDesktopIcons(List desktopIcons) {
+ this.desktopIcons = desktopIcons;
+ notifyDataSetChanged();
+ }
+
+ public void setPackageSet(Set packageSet) {
+ this.packageSet = packageSet;
+ }
+
+ class AppHolder extends RecyclerView.ViewHolder {
+ ConstraintLayout root;
+ TextView tv_appname;
+ ImageView iv_icon, iv_select;
+
+ public AppHolder(@NonNull View itemView) {
+ super(itemView);
+ root = itemView.findViewById(R.id.root);
+ tv_appname = itemView.findViewById(R.id.tv_appname);
+ iv_icon = itemView.findViewById(R.id.iv_icon);
+ iv_select = itemView.findViewById(R.id.iv_select);
+ }
+ }
+}
diff --git a/app/src/main/java/com/uiui/zyos/adapter/AppAdapter.java b/app/src/main/java/com/uiui/zyos/adapter/AppAdapter.java
index ac6f42c..861c6d2 100644
--- a/app/src/main/java/com/uiui/zyos/adapter/AppAdapter.java
+++ b/app/src/main/java/com/uiui/zyos/adapter/AppAdapter.java
@@ -1,6 +1,7 @@
package com.uiui.zyos.adapter;
import android.content.Context;
+import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.provider.Settings;
import android.util.Log;
@@ -15,8 +16,10 @@ import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.recyclerview.widget.RecyclerView;
import com.uiui.zyos.R;
+import com.uiui.zyos.activity.PasswordActivity;
import com.uiui.zyos.bean.DesktopIcon;
import com.uiui.zyos.config.CommonConfig;
+import com.uiui.zyos.manager.AppManager;
import com.uiui.zyos.utils.ApkUtils;
import com.uiui.zyos.utils.AppUsedTimeUtils;
import com.uiui.zyos.utils.BitmapUtils;
@@ -60,19 +63,28 @@ public class AppAdapter extends RecyclerView.Adapter {
holder.iv_icon.setImageDrawable(mContext.getResources().getDrawable(resID));
}
} else {
- holder.iv_icon.setImageBitmap(BitmapUtils.getIconBitmap(mContext, desktopIcon.getIcon()));
+ if (AppManager.ADD_NAME.equals(pkg)) {
+ holder.iv_icon.setImageDrawable(desktopIcon.getIcon());
+ } else {
+ holder.iv_icon.setImageBitmap(BitmapUtils.getIconBitmap(mContext, desktopIcon.getIcon()));
+ }
}
holder.root.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
- int setting_other_appInstaller = Settings.Global.getInt(mContext.getContentResolver(), CommonConfig.SETTING_OTHER_APPINSTALLER_KEY, 1);
- if (setting_other_appInstaller == 0
- && !ApkUtils.isSystemApp(mContext, desktopIcon.getPackageName()
- )) {
- ToastUtil.show("已禁止应用打开");
+ if (AppManager.ADD_NAME.equals(pkg)) {
+ mContext.startActivity(new Intent(mContext, PasswordActivity.class));
} else {
- OpenApkUtils.getInstance().openApp(desktopIcon.getPackageName(), desktopIcon.getClassName());
+ int setting_other_appInstaller = Settings.Global.getInt(mContext.getContentResolver(), CommonConfig.SETTING_OTHER_APPINSTALLER_KEY, 1);
+ if (setting_other_appInstaller == 0
+ && !ApkUtils.isSystemApp(mContext, desktopIcon.getPackageName()
+ )) {
+ ToastUtil.show("已禁止应用打开");
+ } else {
+ OpenApkUtils.getInstance().openApp(desktopIcon.getPackageName(), desktopIcon.getClassName());
+ }
}
+
}
});
}
diff --git a/app/src/main/java/com/uiui/zyos/base/BaseApplication.java b/app/src/main/java/com/uiui/zyos/base/BaseApplication.java
index 1719730..46a431b 100644
--- a/app/src/main/java/com/uiui/zyos/base/BaseApplication.java
+++ b/app/src/main/java/com/uiui/zyos/base/BaseApplication.java
@@ -17,6 +17,7 @@ import com.tencent.android.tpush.XGPushManager;
import com.tencent.mmkv.MMKV;
import com.uiui.zyos.BuildConfig;
import com.uiui.zyos.alarm.AlarmUtils;
+import com.uiui.zyos.manager.AppManager;
import com.uiui.zyos.manager.ConnectManager;
import com.uiui.zyos.manager.RemoteManager;
import com.uiui.zyos.network.NetInterfaceManager;
@@ -49,6 +50,7 @@ public class BaseApplication extends Application {
if (SystemUtils.isMainProcessName(this, android.os.Process.myPid())) {
String rootDir = MMKV.initialize(this);
Log.e(TAG, "mmkv root: " + rootDir);
+ AppManager.init(this);
Aria.init(this);
Aria.get(this).getDownloadConfig().setMaxTaskNum(1);
Aria.get(this).getDownloadConfig().setConvertSpeed(true);
diff --git a/app/src/main/java/com/uiui/zyos/fragment/user/UserFragment.java b/app/src/main/java/com/uiui/zyos/fragment/user/UserFragment.java
index 010712b..565d73e 100644
--- a/app/src/main/java/com/uiui/zyos/fragment/user/UserFragment.java
+++ b/app/src/main/java/com/uiui/zyos/fragment/user/UserFragment.java
@@ -357,6 +357,7 @@ public class UserFragment extends BaseFragment implements UserContact.UserView {
super.onResume();
Log.e(TAG, "onResume: ");
setButtonVisibility();
+ mPresenter.getInstalledApp();
}
@Override
diff --git a/app/src/main/java/com/uiui/zyos/fragment/user/UserPresenter.java b/app/src/main/java/com/uiui/zyos/fragment/user/UserPresenter.java
index 9e4c9fb..0103343 100644
--- a/app/src/main/java/com/uiui/zyos/fragment/user/UserPresenter.java
+++ b/app/src/main/java/com/uiui/zyos/fragment/user/UserPresenter.java
@@ -9,25 +9,24 @@ import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.trello.rxlifecycle4.android.FragmentEvent;
import com.uiui.zyos.BuildConfig;
+import com.uiui.zyos.R;
import com.uiui.zyos.bean.AppUsed;
import com.uiui.zyos.bean.BaseResponse;
import com.uiui.zyos.bean.DesktopIcon;
import com.uiui.zyos.bean.SnInfo;
import com.uiui.zyos.config.CommonConfig;
import com.uiui.zyos.disklrucache.CacheHelper;
+import com.uiui.zyos.manager.AppManager;
import com.uiui.zyos.manager.RemoteManager;
import com.uiui.zyos.network.NetInterfaceManager;
import com.uiui.zyos.network.UrlAddress;
-import com.uiui.zyos.utils.ApkUtils;
import com.uiui.zyos.utils.CXAESUtil;
import com.uiui.zyos.utils.Utils;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
-import java.util.function.Function;
import java.util.function.Predicate;
-import java.util.function.ToLongFunction;
import java.util.stream.Collectors;
import io.reactivex.rxjava3.annotations.NonNull;
@@ -107,7 +106,12 @@ public class UserPresenter implements UserContact.Presenter {
@Override
public void getInstalledApp() {
- ArrayList desktopIcons = ApkUtils.queryFilterAppInfo(mContext);
+ ArrayList desktopIcons = AppManager.getInstance().getFilterAppList();
+ DesktopIcon desktopIcon = new DesktopIcon();
+ desktopIcon.setLable("添加应用");
+ desktopIcon.setPackageName("com.zyos.add");
+ desktopIcon.setIcon(mContext.getDrawable(R.drawable.icon_add));
+ desktopIcons.add(desktopIcons.size(), desktopIcon);
mView.setInstalledApp(desktopIcons);
}
diff --git a/app/src/main/java/com/uiui/zyos/manager/AppManager.java b/app/src/main/java/com/uiui/zyos/manager/AppManager.java
new file mode 100644
index 0000000..3162204
--- /dev/null
+++ b/app/src/main/java/com/uiui/zyos/manager/AppManager.java
@@ -0,0 +1,255 @@
+package com.uiui.zyos.manager;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.tencent.mmkv.MMKV;
+import com.uiui.zyos.bean.DesktopIcon;
+import com.uiui.zyos.config.CommonConfig;
+import com.uiui.zyos.utils.ApkUtils;
+
+import java.text.Collator;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+public class AppManager {
+ private static final String TAG = AppManager.class.getSimpleName();
+
+ public static final String ADD_NAME = "com.zyos.add";
+ private static final String SHOW_PACKAGE_KEY = "SHOW_PACKAGE_KEY";
+
+ @SuppressLint("StaticFieldLeak")
+ private static AppManager sInstance;
+ private Context mContext;
+ private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE);
+ private Set showPackages;
+
+ public static void init(Context context) {
+ if (context == null) {
+ throw new RuntimeException("context is NULL");
+ }
+ if (sInstance == null) {
+ Log.e(TAG, "init: ");
+ sInstance = new AppManager(context);
+ }
+ }
+
+ public AppManager(Context context) {
+ if (context == null) {
+ throw new RuntimeException("Context is NULL");
+ }
+ this.mContext = context;
+ this.showPackages = mMMKV.decodeStringSet(SHOW_PACKAGE_KEY, new HashSet<>());
+ this.showPackages.removeIf(TextUtils::isEmpty);
+ }
+
+ public static AppManager getInstance() {
+ if (sInstance == null) {
+ throw new IllegalStateException("You must be init AppManager first");
+ }
+ return sInstance;
+ }
+
+ public void addPakcage(String packageName) {
+ this.showPackages.add(packageName);
+ mMMKV.encode(SHOW_PACKAGE_KEY, showPackages);
+ }
+
+ public void removePakcage(String packageName) {
+ this.showPackages.remove(packageName);
+ mMMKV.encode(SHOW_PACKAGE_KEY, showPackages);
+ }
+
+ public Set getFilterAppset() {
+ PackageManager pm = mContext.getPackageManager();
+ // 查询所有已经安装的应用程序
+ List resolveInfos = new ArrayList<>();
+ // 创建一个类别为CATEGORY_LAUNCHER的该包名的Intent
+ Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
+ resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
+
+ // 通过getPackageManager()的queryIntentActivities方法遍历,得到所有能打开的app的packageName
+ List resolveinfoList = pm.queryIntentActivities(resolveIntent, 0);
+ Set allowPackages = resolveinfoList.stream().map(resolveInfo -> resolveInfo.activityInfo.packageName).collect(Collectors.toSet());
+
+ List adminApp = RemoteManager.getInstance().getAdminApp();
+ Log.i(TAG, "queryFilterAppInfo: adminapp = " + adminApp);
+ for (ResolveInfo resolveInfo : resolveinfoList) {
+ String pkg = resolveInfo.activityInfo.packageName;
+ if (ApkUtils.appIsDisable(mContext, pkg)) {
+ Log.e(TAG, "queryFilterAppInfo: disable = " + pkg);
+ continue;
+ }
+ if (showPackages.contains(pkg)) {
+ resolveInfos.add(resolveInfo);
+ } else {
+ //通过flag排除系统应用,会将电话、短信也排除掉
+ if (ApkUtils.isSystemApp(mContext, pkg)) {
+ if (ApkUtils.showPackageName.contains(pkg)) {
+ resolveInfos.add(resolveInfo);
+ }
+ } else {
+ if (allowPackages.contains(pkg) && !ApkUtils.excludePackageName.contains(pkg)) {
+ if (adminApp.contains(pkg)) {
+ resolveInfos.add(resolveInfo);
+ } else if (ApkUtils.showPackageName.contains(pkg)) {
+ resolveInfos.add(resolveInfo);
+ }
+ }
+ }
+ }
+ }
+ if (Settings.Global.getInt(mContext.getContentResolver(), "is_activity", 0) == 0) {
+ resolveInfos.removeIf(resolveInfo -> "com.uiui.city".equals(resolveInfo.activityInfo.packageName));
+ }
+ Set desktopIcons = resolveInfos.stream().map(resolveInfo -> resolveInfo.activityInfo.packageName).collect(Collectors.toSet());
+ return desktopIcons;
+ }
+
+
+ public ArrayList getFilterAppList() {
+ PackageManager pm = mContext.getPackageManager();
+ // 查询所有已经安装的应用程序
+ List resolveInfos = new ArrayList<>();
+ // 创建一个类别为CATEGORY_LAUNCHER的该包名的Intent
+ Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
+ resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
+
+ // 通过getPackageManager()的queryIntentActivities方法遍历,得到所有能打开的app的packageName
+ List resolveinfoList = pm.queryIntentActivities(resolveIntent, 0);
+ Set allowPackages = resolveinfoList.stream().map(resolveInfo -> resolveInfo.activityInfo.packageName).collect(Collectors.toSet());
+
+
+ List adminApp = RemoteManager.getInstance().getAdminApp();
+ Log.i(TAG, "queryFilterAppInfo: adminapp = " + adminApp);
+ for (ResolveInfo resolveInfo : resolveinfoList) {
+ String pkg = resolveInfo.activityInfo.packageName;
+ if (ApkUtils.appIsDisable(mContext, pkg)) {
+ Log.e(TAG, "queryFilterAppInfo: disable = " + pkg);
+ continue;
+ }
+ if (showPackages.contains(pkg)) {
+ resolveInfos.add(resolveInfo);
+ } else {
+ //通过flag排除系统应用,会将电话、短信也排除掉
+ if (ApkUtils.isSystemApp(mContext, pkg)) {
+ if (ApkUtils.showPackageName.contains(pkg)) {
+ resolveInfos.add(resolveInfo);
+ }
+ } else {
+ if (allowPackages.contains(pkg) && !ApkUtils.excludePackageName.contains(pkg)) {
+ if (adminApp.contains(pkg)) {
+ resolveInfos.add(resolveInfo);
+ } else if (ApkUtils.showPackageName.contains(pkg)) {
+ resolveInfos.add(resolveInfo);
+ }
+ }
+ }
+ }
+ }
+ if (Settings.Global.getInt(mContext.getContentResolver(), "is_activity", 0) == 0) {
+ resolveInfos.removeIf(resolveInfo -> "com.uiui.city".equals(resolveInfo.activityInfo.packageName));
+ }
+ resolveInfos.sort(new Comparator() {
+ @Override
+ public int compare(ResolveInfo o1, ResolveInfo o2) {
+ return Collator.getInstance(Locale.CHINESE).compare(o1.loadLabel(pm).toString(), o2.loadLabel(pm).toString());
+ }
+ });
+ resolveInfos.sort(new Comparator() {
+ @Override
+ public int compare(ResolveInfo o1, ResolveInfo o2) {
+ try {
+ if ((pm.getApplicationInfo(o1.activityInfo.packageName, 0).flags & ApplicationInfo.FLAG_SYSTEM) <= (pm.getApplicationInfo(o2.activityInfo.packageName, 0).flags & ApplicationInfo.FLAG_SYSTEM)) {
+ return 1;
+ } else {
+ return -1;
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ e.printStackTrace();
+ return 0;
+ }
+ }
+ });
+ ArrayList desktopIcons = new ArrayList<>();
+ for (ResolveInfo applicationInfo : resolveInfos) {
+ if (!ApkUtils.excludeClassName.contains(applicationInfo.activityInfo.name)) {
+ desktopIcons.add(DesktopIcon.creatDesktopIcon(mContext, applicationInfo));
+ }
+ }
+ return desktopIcons;
+ }
+
+ public ArrayList getAllAppList() {
+ PackageManager pm = mContext.getPackageManager();
+ // 查询所有已经安装的应用程序
+ List resolveInfos = new ArrayList<>();
+ // 创建一个类别为CATEGORY_LAUNCHER的该包名的Intent
+ Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
+ resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
+
+ // 通过getPackageManager()的queryIntentActivities方法遍历,得到所有能打开的app的packageName
+ List resolveinfoList = pm.queryIntentActivities(resolveIntent, 0);
+ Set allowPackages = resolveinfoList.stream().map(resolveInfo -> resolveInfo.activityInfo.packageName).collect(Collectors.toSet());
+
+
+ List adminApp = RemoteManager.getInstance().getAdminApp();
+ Log.i(TAG, "queryFilterAppInfo: adminapp = " + adminApp);
+ for (ResolveInfo resolveInfo : resolveinfoList) {
+ String pkg = resolveInfo.activityInfo.packageName;
+ if (ApkUtils.appIsDisable(mContext, pkg)) {
+ Log.e(TAG, "queryFilterAppInfo: disable = " + pkg);
+ continue;
+ }
+ if (ApkUtils.excludePackageName.contains(pkg)) {
+ continue;
+ }
+
+ resolveInfos.add(resolveInfo);
+ }
+ if (Settings.Global.getInt(mContext.getContentResolver(), "is_activity", 0) == 0) {
+ resolveInfos.removeIf(resolveInfo -> "com.uiui.city".equals(resolveInfo.activityInfo.packageName));
+ }
+ resolveInfos.sort(new Comparator() {
+ @Override
+ public int compare(ResolveInfo o1, ResolveInfo o2) {
+ return Collator.getInstance(Locale.CHINESE).compare(o1.loadLabel(pm).toString(), o2.loadLabel(pm).toString());
+ }
+ });
+ resolveInfos.sort(new Comparator() {
+ @Override
+ public int compare(ResolveInfo o1, ResolveInfo o2) {
+ try {
+ if ((pm.getApplicationInfo(o1.activityInfo.packageName, 0).flags & ApplicationInfo.FLAG_SYSTEM) <= (pm.getApplicationInfo(o2.activityInfo.packageName, 0).flags & ApplicationInfo.FLAG_SYSTEM)) {
+ return 1;
+ } else {
+ return -1;
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ e.printStackTrace();
+ return 0;
+ }
+ }
+ });
+ ArrayList desktopIcons = new ArrayList<>();
+ for (ResolveInfo applicationInfo : resolveInfos) {
+ desktopIcons.add(DesktopIcon.creatDesktopIcon(mContext, applicationInfo));
+ }
+ return desktopIcons;
+ }
+
+}
diff --git a/app/src/main/java/com/uiui/zyos/utils/ApkUtils.java b/app/src/main/java/com/uiui/zyos/utils/ApkUtils.java
index 4b41537..4d5b712 100644
--- a/app/src/main/java/com/uiui/zyos/utils/ApkUtils.java
+++ b/app/src/main/java/com/uiui/zyos/utils/ApkUtils.java
@@ -45,7 +45,7 @@ import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.schedulers.Schedulers;
public class ApkUtils {
- private static HashSet excludePackageName = new HashSet() {{
+ public static final HashSet excludePackageName = new HashSet() {{
this.add(BuildConfig.APPLICATION_ID);
this.add("com.uiui.zy");
this.add("com.uiui.zyos");
@@ -88,11 +88,11 @@ public class ApkUtils {
this.add("com.huawei.gamebox");
}};
- private static HashSet excludeClassName = new HashSet() {{
+ public static final HashSet excludeClassName = new HashSet() {{
this.add("com.android.dialer.app.calllog.CallLogActivity");
}};
- private static HashSet showPackageName = new HashSet() {{
+ public static final HashSet showPackageName = new HashSet() {{
this.add("com.android.dialer");
// this.add("com.android.gallery3d");
// this.add("com.android.settings");
diff --git a/app/src/main/res/drawable-hdpi/icon_add.png b/app/src/main/res/drawable-hdpi/icon_add.png
new file mode 100644
index 0000000000000000000000000000000000000000..6966add56d0831ab8786d5fb51509ba35e61edd8
GIT binary patch
literal 2036
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
literal 0
HcmV?d00001
diff --git a/app/src/main/res/layout/activity_add_icon.xml b/app/src/main/res/layout/activity_add_icon.xml
new file mode 100644
index 0000000..bca8947
--- /dev/null
+++ b/app/src/main/res/layout/activity_add_icon.xml
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout-land/activity_exit.xml b/app/src/main/res/layout/activity_exit.xml
similarity index 100%
rename from app/src/main/res/layout-land/activity_exit.xml
rename to app/src/main/res/layout/activity_exit.xml
diff --git a/app/src/main/res/layout-port/activity_exit.xml b/app/src/main/res/layout/activity_passwd.xml
similarity index 99%
rename from app/src/main/res/layout-port/activity_exit.xml
rename to app/src/main/res/layout/activity_passwd.xml
index 402718e..350f725 100644
--- a/app/src/main/res/layout-port/activity_exit.xml
+++ b/app/src/main/res/layout/activity_passwd.xml
@@ -67,7 +67,7 @@
android:gravity="center"
android:maxLines="2"
android:minLines="2"
- android:text="退出系统"
+ android:text="输入密码后添加应用到桌面"
android:textColor="@color/white"
android:textSize="@dimen/sp_14"
app:layout_constraintEnd_toEndOf="parent"
diff --git a/app/src/main/res/layout/item_add_app.xml b/app/src/main/res/layout/item_add_app.xml
new file mode 100644
index 0000000..f895776
--- /dev/null
+++ b/app/src/main/res/layout/item_add_app.xml
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file