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 0000000..6966add Binary files /dev/null and b/app/src/main/res/drawable-hdpi/icon_add.png differ diff --git a/app/src/main/res/drawable-hdpi/icon_selected.png b/app/src/main/res/drawable-hdpi/icon_selected.png new file mode 100644 index 0000000..fc5be44 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/icon_selected.png differ diff --git a/app/src/main/res/drawable-hdpi/icon_unselect.png b/app/src/main/res/drawable-hdpi/icon_unselect.png new file mode 100644 index 0000000..99de4c9 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/icon_unselect.png differ 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