diff --git a/app/build.gradle b/app/build.gradle index bf94474..d0e2b81 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId "com.uiuios.aios" minSdkVersion 24 targetSdkVersion 29 - versionCode 40 - versionName "4.9" + versionCode 41 + versionName "5.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -201,6 +201,7 @@ dependencies { // Java language implementation implementation "androidx.fragment:fragment:1.4.1" implementation 'androidx.legacy:legacy-support-v4:1.0.0' + testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 629e0de..2383865 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,20 @@ + + + + + + + + + @@ -75,6 +89,30 @@ android:resumeWhilePausing="true" android:stateNotNeeded="true" android:windowSoftInputMode="adjustPan"> + + + + + + + + + + + + @@ -84,12 +122,8 @@ + - + + + + + + + = Build.VERSION_CODES.O + ? android.R.drawable.sym_def_app_icon : android.R.mipmap.sym_def_app_icon, + iconDpi); + } +} diff --git a/app/src/main/java/com/uiuios/aios/activity/main/MainActivity.java b/app/src/main/java/com/uiuios/aios/activity/main/MainActivity.java index 561379d..6109531 100644 --- a/app/src/main/java/com/uiuios/aios/activity/main/MainActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/main/MainActivity.java @@ -1,5 +1,11 @@ package com.uiuios.aios.activity.main; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; + +import androidx.annotation.Nullable; + import com.uiuios.aios.R; public class MainActivity extends BaseMainActivity { @@ -9,4 +15,18 @@ public class MainActivity extends BaseMainActivity { public int getLayoutId() { return R.layout.activity_main; } + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Log.e(TAG, "onCreate: "); + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + Log.e(TAG, "onNewIntent: getAction = " + intent.getAction()); + Log.e(TAG, "onNewIntent: getCategories = " + intent.getCategories()); + Log.e(TAG, "onNewIntent: getFlags = " + intent.getFlags()); + } } diff --git a/app/src/main/java/com/uiuios/aios/adapter/AddAppAdapter.java b/app/src/main/java/com/uiuios/aios/adapter/AddAppAdapter.java index fa7705b..cdf5da3 100644 --- a/app/src/main/java/com/uiuios/aios/adapter/AddAppAdapter.java +++ b/app/src/main/java/com/uiuios/aios/adapter/AddAppAdapter.java @@ -40,10 +40,10 @@ public class AddAppAdapter extends RecyclerView.Adapter @Override public void onBindViewHolder(@NonNull AppHolder holder, int position) { DesktopIcon desktopIcon = desktopIcons.get(position); - String lable = desktopIcon.getLable(); + String lable = desktopIcon.getTitle(); holder.tv_appname.setText(lable); holder.iv_icon.setImageDrawable(desktopIcon.getIcon()); - String pkg = desktopIcon.getPackageName(); + String pkg = desktopIcon.getPackage(); if (packageSet != null) { if (packageSet.contains(pkg)) { diff --git a/app/src/main/java/com/uiuios/aios/adapter/HomeAppAdapter.java b/app/src/main/java/com/uiuios/aios/adapter/HomeAppAdapter.java index 09c3686..3ee586e 100644 --- a/app/src/main/java/com/uiuios/aios/adapter/HomeAppAdapter.java +++ b/app/src/main/java/com/uiuios/aios/adapter/HomeAppAdapter.java @@ -43,10 +43,10 @@ public class HomeAppAdapter extends RecyclerView.Adapter mDesktopIcons; private MyGridLayout gridLayout; private String TAG = AppListFragment.class.getSimpleName(); + private LauncherApps mLauncherApps; public AppListFragment() { // Required empty public constructor @@ -114,6 +121,7 @@ public class AppListFragment extends BaseFragment { // Inflate the layout for this fragment rootView = inflater.inflate(R.layout.fragment_applist, container, false); mContext = rootView.getContext(); + mLauncherApps = (LauncherApps) mContext.getSystemService(Context.LAUNCHER_APPS_SERVICE); initView(); return rootView; } @@ -136,12 +144,19 @@ public class AppListFragment extends BaseFragment { View view = getLayoutInflater().inflate(R.layout.item_actions, null); ImageView iv = view.findViewById(R.id.iv); + ImageView iv_app = view.findViewById(R.id.iv_app); TextView tv = view.findViewById(R.id.tv); TextView bg = view.findViewById(R.id.bg); ConstraintLayout constraintLayout = view.findViewById(R.id.btn_booktag); DesktopIcon desktopIcon = mDesktopIcons.get(index); if (desktopIcon != null) { - String pkg = desktopIcon.getPackageName(); + String pkg = desktopIcon.getPackage(); + if (desktopIcon instanceof ShortcutPkgInfo) { + iv_app.setVisibility(View.VISIBLE); + iv_app.setImageDrawable(ApkUtils.getAppDrawable(mContext, pkg)); + } else { + iv_app.setVisibility(View.GONE); + } Log.e(TAG, "getView: " + pkg); int i = IconUtils.appClassNameList.indexOf(pkg); int size = NotificationService.getNotificationLength(pkg); @@ -175,9 +190,9 @@ public class AppListFragment extends BaseFragment { desktopIcon.setIcon(mContext.getResources().getDrawable(resID)); } } else { - iv.setImageDrawable( desktopIcon.getIcon()); + iv.setImageDrawable(desktopIcon.getIcon()); } - tv.setText(desktopIcon.getLable()); + tv.setText(desktopIcon.getTitle()); // linearLayout.setEnabled(true); } else { // linearLayout.setEnabled(false); @@ -198,8 +213,22 @@ public class AppListFragment extends BaseFragment { public void onItemClick(View v, int index) { DesktopIcon desktopIcon = mDesktopIcons.get(index); if (desktopIcon != null) { - Log.e(TAG, "onItemClick: " + desktopIcon.getPackageName()); - switch (desktopIcon.getPackageName()) { + Log.e(TAG, "onItemClick: " + desktopIcon.getPackage()); + if (desktopIcon instanceof ShortcutPkgInfo) { + try { + ActivityOptions activityOptions = ActivityOptions.makeClipRevealAnimation(v, v.getScrollX(), v.getScrollY(), v.getMeasuredWidth(), v.getMeasuredHeight()); + String packegeName = ((ShortcutPkgInfo) desktopIcon).getPackageName(); + String id = ((ShortcutPkgInfo) desktopIcon).getId(); + Rect rect = new Rect(v.getLeft(), v.getTop(), v.getRight(), v.getBottom()); + UserHandle userHandle = Process.myUserHandle(); + Log.e(TAG, "onItemClick: " + packegeName); + mLauncherApps.startShortcut(packegeName, id, rect, activityOptions.toBundle(), userHandle); + } catch (Exception e) { + Log.e(TAG, "Failed to start shortcut: " + e.getMessage()); + } + return; + } + switch (desktopIcon.getPackage()) { case "aios.daily.app": startActivity(new Intent(mContext, DailyAppActivity.class)); break; @@ -224,8 +253,8 @@ public class AppListFragment extends BaseFragment { // ToastUtil.show("电话功能被禁用"); // return; // } else { - ApkUtils.openPackage(v.getContext(), desktopIcon.getPackageName(), desktopIcon.getClassName()); - AppUsedTimeUtils.getInstance().setAppPackageName(desktopIcon.getPackageName()); + ApkUtils.openPackage(v.getContext(), desktopIcon.getPackage(), desktopIcon.getClazz()); + AppUsedTimeUtils.getInstance().setAppPackageName(desktopIcon.getPackage()); AppUsedTimeUtils.getInstance().setStartTime(System.currentTimeMillis()); SendRunningApp(getActivity()); // } @@ -234,20 +263,20 @@ public class AppListFragment extends BaseFragment { case "com.uiuios.sn": case "com.uiuios.appstore": case "com.uiuios.browser": - ApkUtils.openPackage(v.getContext(), desktopIcon.getPackageName(), desktopIcon.getClassName()); - AppUsedTimeUtils.getInstance().setAppPackageName(desktopIcon.getPackageName()); + ApkUtils.openPackage(v.getContext(), desktopIcon.getPackage(), desktopIcon.getClazz()); + AppUsedTimeUtils.getInstance().setAppPackageName(desktopIcon.getPackage()); AppUsedTimeUtils.getInstance().setStartTime(System.currentTimeMillis()); SendRunningApp(getActivity()); break; default: 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() + && !ApkUtils.isSystemApp(mContext, desktopIcon.getPackage() )) { ToastUtil.show("已禁止应用打开"); } else { - ApkUtils.openPackage(v.getContext(), desktopIcon.getPackageName(), desktopIcon.getClassName()); - AppUsedTimeUtils.getInstance().setAppPackageName(desktopIcon.getPackageName()); + ApkUtils.openPackage(v.getContext(), desktopIcon.getPackage(), desktopIcon.getClazz()); + AppUsedTimeUtils.getInstance().setAppPackageName(desktopIcon.getPackage()); AppUsedTimeUtils.getInstance().setStartTime(System.currentTimeMillis()); SendRunningApp(getActivity()); } @@ -259,8 +288,12 @@ public class AppListFragment extends BaseFragment { public void onLongClick(View v, int index) { DesktopIcon desktopIcon = mDesktopIcons.get(index); if (desktopIcon == null) return; - String pkg = desktopIcon.getPackageName(); + String pkg = desktopIcon.getPackage(); Log.e(TAG, "onLongClick: " + pkg); + if (desktopIcon instanceof ShortcutPkgInfo) { + showShortcutDialog((ShortcutPkgInfo) desktopIcon); + return; + } switch (pkg) { case "aios.exit": case "com.uiuios.sn": @@ -313,9 +346,36 @@ public class AppListFragment extends BaseFragment { mContext.startActivity(intent); } + private void showShortcutDialog(ShortcutPkgInfo shortcutPkgInfo) { + if (shortcutPkgInfo == null) return; + String label = shortcutPkgInfo.getTitle(); + String pkg = shortcutPkgInfo.getPackage(); + ShortcutDialog shortcutDialog = new ShortcutDialog(mContext); + shortcutDialog.setTitle("删除快捷方式"); + shortcutDialog.setMessage(label); + shortcutDialog.setIconImage(shortcutPkgInfo.getIcon()); + shortcutDialog.setAppIconImage(ApkUtils.getAppDrawable(mContext, pkg)); + shortcutDialog.setOnClickBottomListener(new ShortcutDialog.OnClickBottomListener() { + @Override + public void onPositiveClick() { + if (!ShortcutUtils.getInstance().deleteShortcut(shortcutPkgInfo.getId(), shortcutPkgInfo.getPackageName())) { + ToastUtil.show("删除失败"); + } + mContext.sendBroadcast(new Intent(MainActivity.ACTION_PACKAGE_HIDE)); + shortcutDialog.dismiss(); + } + + @Override + public void onNegtiveClick() { + shortcutDialog.dismiss(); + } + }); + shortcutDialog.show(); + } + private void showHideDialog(DesktopIcon desktopIcon) { - String label = desktopIcon.getLable(); - String pkg = desktopIcon.getPackageName(); + String label = desktopIcon.getTitle(); + String pkg = desktopIcon.getPackage(); DailyAppDialog dailyAppDialog = new DailyAppDialog(mContext); dailyAppDialog.setTitle("移到日常应用"); dailyAppDialog.setMessage(label); diff --git a/app/src/main/java/com/uiuios/aios/fragment/home/HomePresenter.java b/app/src/main/java/com/uiuios/aios/fragment/home/HomePresenter.java index 71db523..6ecf893 100644 --- a/app/src/main/java/com/uiuios/aios/fragment/home/HomePresenter.java +++ b/app/src/main/java/com/uiuios/aios/fragment/home/HomePresenter.java @@ -1,12 +1,10 @@ package com.uiuios.aios.fragment.home; import android.content.Context; -import android.view.View; import com.trello.rxlifecycle4.android.FragmentEvent; import com.uiuios.aios.R; import com.uiuios.aios.alarm.AlarmClockData; -import com.uiuios.aios.alarm.AlarmUtils; import com.uiuios.aios.bean.DesktopIcon; import com.uiuios.aios.manager.AppManager; import com.uiuios.aios.network.NetInterfaceManager; @@ -57,8 +55,8 @@ public class HomePresenter implements HomeContact.Presenter { // desktopIcons.add(desktopIcons.size(), updateDesktopIcon); DesktopIcon desktopIcon = new DesktopIcon(); - desktopIcon.setLable("添加应用"); - desktopIcon.setPackageName(AppManager.ADD_NAME); + desktopIcon.setTitle("添加应用"); + desktopIcon.setPackage(AppManager.ADD_NAME); desktopIcon.setIcon(mContext.getDrawable(R.drawable.home_icon_add)); desktopIcons.add(desktopIcons.size(), desktopIcon); diff --git a/app/src/main/java/com/uiuios/aios/shortcut/ShortcutHelper.java b/app/src/main/java/com/uiuios/aios/shortcut/ShortcutHelper.java new file mode 100644 index 0000000..f71025b --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/shortcut/ShortcutHelper.java @@ -0,0 +1,61 @@ +package com.uiuios.aios.shortcut; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.os.Environment; +import android.util.Log; + +import androidx.annotation.Nullable; + +import java.io.File; + +public class ShortcutHelper extends SQLiteOpenHelper { + private static final String TAG = ShortcutHelper.class.getSimpleName(); + + public static final int DATABASE_VERSION = 1; + public static final String DATABASE_NAME = "Shortcut.db"; + // public static final String DATABASE_FILE_NAME = Environment.getExternalStorageDirectory().getPath() + File.separator + DATABASE_NAME; + public static final String DATABASE_FILE_NAME = File.separator + DATABASE_NAME; + + public static final String TABLE_ICON = " Icon"; + + public static final String KEY_MID = "mId"; + public static final String KEY_TITLE = "mTitle"; + public static final String KEY_PACKAGENAME = "mPackageName"; + public static final String KEY_CLASS = "mClass"; + public static final String KEY_PACKAGE = "mPackage"; + public static final String KEY_ICON = "icon"; + public static final String KEY_TIMESTAMP = "timestamp"; + + String CREATE_SHORTCUT_TABLE = "CREATE TABLE IF NOT EXISTS" + TABLE_ICON + + "(" + + KEY_MID + " TEXT PRIMARY KEY," + + KEY_TITLE + " TEXT," + + KEY_PACKAGENAME + " TEXT," + + KEY_CLASS + " TEXT," + + KEY_PACKAGE + " TEXT," + + KEY_ICON + " BLOB," + + KEY_TIMESTAMP + " LONG" + + ")"; + + public ShortcutHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) { + super(context, name, factory, version); + } + + + @Override + public void onCreate(SQLiteDatabase db) { + db.execSQL(CREATE_SHORTCUT_TABLE); + } + + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + switch (newVersion) { + default: + case 1: + break; + } + } +} diff --git a/app/src/main/java/com/uiuios/aios/shortcut/ShortcutPkgInfo.java b/app/src/main/java/com/uiuios/aios/shortcut/ShortcutPkgInfo.java new file mode 100644 index 0000000..d68b014 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/shortcut/ShortcutPkgInfo.java @@ -0,0 +1,53 @@ +package com.uiuios.aios.shortcut; + +import android.content.ComponentName; +import android.graphics.drawable.Drawable; + +import com.uiuios.aios.bean.DesktopIcon; + +import java.io.Serializable; + +public class ShortcutPkgInfo extends DesktopIcon implements Serializable { + private static final long serialVersionUID = -8142340420690477465L; + + String mId; + String mPackageName;//谁创建的 + + public ShortcutPkgInfo() { + + } + + public ShortcutPkgInfo(String id, String title, String packageName, ComponentName componentName, Drawable icon) { + mId = id; + mTitle = title; + mPackageName = packageName; + mClass = componentName.getClassName(); + mPackage = componentName.getPackageName(); + this.icon = icon; + } + + public ShortcutPkgInfo(String id, String title, String packageName, String aClass, String aPackage, Drawable icon) { + mId = id; + mTitle = title; + mPackageName = packageName; + mClass = aClass; + mPackage = aPackage; + this.icon = icon; + } + + public String getId() { + return mId; + } + + public void setId(String id) { + mId = id; + } + + public String getPackageName() { + return mPackageName; + } + + public void setPackageName(String packageName) { + mPackageName = packageName; + } +} diff --git a/app/src/main/java/com/uiuios/aios/shortcut/ShortcutUtils.java b/app/src/main/java/com/uiuios/aios/shortcut/ShortcutUtils.java new file mode 100644 index 0000000..35008ec --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/shortcut/ShortcutUtils.java @@ -0,0 +1,154 @@ +package com.uiuios.aios.shortcut; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.PixelFormat; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.util.Log; + +import java.io.ByteArrayOutputStream; +import java.util.ArrayList; +import java.util.List; + +public class ShortcutUtils { + private static final String TAG = ShortcutUtils.class.getSimpleName(); + + private static ShortcutUtils sInstance; + private Context mContext; + private ShortcutHelper mShortcutHelper; + private SQLiteDatabase mDatabase; + + public ShortcutUtils(Context context) { + this.mContext = context; +// this.mShortcutHelper = new ShortcutHelper(context, ShortcutHelper.DATABASE_FILE_NAME, null, ShortcutHelper.DATABASE_VERSION); + this.mShortcutHelper = new ShortcutHelper(context, mContext.getExternalCacheDir() + ShortcutHelper.DATABASE_FILE_NAME, null, ShortcutHelper.DATABASE_VERSION); + this.mDatabase = mShortcutHelper.getWritableDatabase(); + + } + + public static void init(Context context) { + if (context == null) { + throw new RuntimeException("context is NULL"); + } + if (sInstance == null) { + sInstance = new ShortcutUtils(context); + } + } + + public static ShortcutUtils getInstance() { + if (sInstance == null) { + throw new IllegalStateException("You must be init ShortcutUtils first"); + } + return sInstance; + } + + + public boolean addShortcut(ShortcutPkgInfo shortcutPkgInfo) { + ContentValues values = getValuesFromShortcutPkgInfo(shortcutPkgInfo); + long id = 0; + mDatabase.beginTransaction(); + try { + id = mDatabase.insertWithOnConflict(ShortcutHelper.TABLE_ICON, null, values, SQLiteDatabase.CONFLICT_REPLACE); + mDatabase.setTransactionSuccessful(); + } catch (Exception e) { + Log.e(TAG, "addShortcut: " + e.getMessage()); + } finally { + mDatabase.endTransaction(); + } + return id > 0; + } + + public boolean deleteShortcut(ShortcutPkgInfo shortcutPkgInfo) { + if (shortcutPkgInfo == null) { + return true; + } + return deleteShortcut(shortcutPkgInfo.getId(), shortcutPkgInfo.getPackageName()); + } + + public boolean deleteShortcut(String mId, String pkg) { + long id = 0; + mDatabase.beginTransaction(); + try { + id = mDatabase.delete(ShortcutHelper.TABLE_ICON, " mId = '" + mId + "' and mPackageName = '" + pkg + "'", null); + mDatabase.setTransactionSuccessful(); + } catch (Exception e) { + Log.e(TAG, "deleteShortcut: " + e.getMessage()); + } finally { + mDatabase.endTransaction(); + } + return id > 0; + } + + // +// public boolean deleteShortcut(String mId) { +// +// } +// + public List getShortcutList() { + List list = new ArrayList<>(); + String selectQuery = "SELECT * FROM " + ShortcutHelper.TABLE_ICON; + Cursor cursor = mDatabase.rawQuery(selectQuery, null); + if (cursor.moveToFirst()) { + do { + ShortcutPkgInfo shortcutPkgInfo = new ShortcutPkgInfo(); + shortcutPkgInfo.setId(cursor.getString(0)); + shortcutPkgInfo.setTitle(cursor.getString(1)); + shortcutPkgInfo.setPackageName(cursor.getString(2)); + shortcutPkgInfo.setClass(cursor.getString(3)); + shortcutPkgInfo.setPackage(cursor.getString(4)); + shortcutPkgInfo.setIcon(Bytes2Drawable(cursor.getBlob(5))); + list.add(shortcutPkgInfo); + } while (cursor.moveToNext()); + } + cursor.close(); + return list; + } + + private ContentValues getValuesFromShortcutPkgInfo(ShortcutPkgInfo shortcutPkgInfo) { + ContentValues values = new ContentValues(); + values.put(ShortcutHelper.KEY_MID, shortcutPkgInfo.getId()); + values.put(ShortcutHelper.KEY_TITLE, shortcutPkgInfo.getTitle()); + values.put(ShortcutHelper.KEY_PACKAGENAME, shortcutPkgInfo.getPackageName()); + values.put(ShortcutHelper.KEY_CLASS, shortcutPkgInfo.getClazz()); + values.put(ShortcutHelper.KEY_PACKAGE, shortcutPkgInfo.getPackage()); + values.put(ShortcutHelper.KEY_ICON, drawableToBitmap(shortcutPkgInfo.getIcon())); + values.put(ShortcutHelper.KEY_TIMESTAMP, System.currentTimeMillis()); + return values; + } + + public static byte[] drawableToBitmap(Drawable drawable) { + // 取 drawable 的长宽 + int w = drawable.getIntrinsicWidth(); + int h = drawable.getIntrinsicHeight(); + + // 取 drawable 的颜色格式 + Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 + : Bitmap.Config.RGB_565; + // 建立对应 bitmap + Bitmap bitmap = Bitmap.createBitmap(w, h, config); + // 建立对应 bitmap 的画布 + Canvas canvas = new Canvas(bitmap); + drawable.setBounds(0, 0, w, h); + // 把 drawable 内容画到画布中 + drawable.draw(canvas); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); + return baos.toByteArray(); + } + + public Drawable Bytes2Drawable(byte[] b) { + if (b.length != 0) { + Bitmap bm = BitmapFactory.decodeByteArray(b, 0, b.length); + BitmapDrawable bd = new BitmapDrawable(mContext.getResources(), bm); + return bd; + } else { + return null; + } + } +} diff --git a/app/src/main/java/com/uiuios/aios/utils/ApkUtils.java b/app/src/main/java/com/uiuios/aios/utils/ApkUtils.java index 4fb067a..277834d 100644 --- a/app/src/main/java/com/uiuios/aios/utils/ApkUtils.java +++ b/app/src/main/java/com/uiuios/aios/utils/ApkUtils.java @@ -9,6 +9,7 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageInstaller; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.graphics.drawable.Drawable; import android.os.Binder; import android.os.Build; import android.provider.Settings; @@ -19,11 +20,12 @@ import androidx.annotation.RequiresApi; import com.uiuios.aios.BuildConfig; import com.uiuios.aios.R; -import com.uiuios.aios.activity.QuickAppActivity; import com.uiuios.aios.bean.DesktopIcon; import com.uiuios.aios.manager.AppManager; import com.uiuios.aios.manager.AppStatusManager; import com.uiuios.aios.receiver.InstallResultReceiver; +import com.uiuios.aios.shortcut.ShortcutPkgInfo; +import com.uiuios.aios.shortcut.ShortcutUtils; import java.io.File; import java.lang.reflect.InvocationTargetException; @@ -36,7 +38,6 @@ import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Set; -import java.util.stream.Collectors; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.core.Observable; @@ -159,7 +160,7 @@ public class ApkUtils { * @return */ public static ArrayList queryFilterAppInfo(Context context) { - List quickApps= new ArrayList<>(AppManager.getInstance().getAddPackages()); + List quickApps = new ArrayList<>(AppManager.getInstance().getAddPackages()); PackageManager pm = context.getPackageManager(); // 查询所有已经安装的应用程序 @@ -245,23 +246,25 @@ public class ApkUtils { desktopIcons.add(DesktopIcon.creatDesktopIcon(context, applicationInfo)); } } + List shortcutPkgInfos = ShortcutUtils.getInstance().getShortcutList(); + desktopIcons.addAll(shortcutPkgInfos); DesktopIcon dailyIcon = new DesktopIcon(); dailyIcon.setIcon(context.getDrawable(R.drawable.icon_daily_app)); - dailyIcon.setLable("日常应用"); - dailyIcon.setPackageName("aios.daily.app"); + dailyIcon.setTitle("日常应用"); + dailyIcon.setPackage("aios.daily.app"); desktopIcons.add(0, dailyIcon); DesktopIcon familyIcon = new DesktopIcon(); familyIcon.setIcon(context.getDrawable(R.drawable.com_android_appstore)); - familyIcon.setLable("应用市场"); - familyIcon.setPackageName("aios.appstore"); + familyIcon.setTitle("应用市场"); + familyIcon.setPackage("aios.appstore"); desktopIcons.add(1, familyIcon); DesktopIcon exitIcon = new DesktopIcon(); exitIcon.setIcon(context.getDrawable(R.drawable.exit_icon)); - exitIcon.setLable("切换系统"); - exitIcon.setPackageName("aios.exit"); + exitIcon.setTitle("切换系统"); + exitIcon.setPackage("aios.exit"); desktopIcons.add(exitIcon); return desktopIcons; @@ -341,6 +344,24 @@ public class ApkUtils { return applicationInfo; } + public static Drawable getAppDrawable(Context context, String pkg) { + if (context==null||TextUtils.isEmpty(pkg)){ + return null; + } + PackageManager packageManager = context.getPackageManager(); + ApplicationInfo applicationInfo = null; + try { + applicationInfo = packageManager.getApplicationInfo(pkg, 0); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + if (applicationInfo != null) { + return applicationInfo.loadIcon(packageManager); + } else { + return null; + } + } + public static void openApp(Context context, String packageName) { Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName); if (intent != null) { diff --git a/app/src/main/res/layout/add_item_confirmation_activity.xml b/app/src/main/res/layout/add_item_confirmation_activity.xml new file mode 100644 index 0000000..35c80ca --- /dev/null +++ b/app/src/main/res/layout/add_item_confirmation_activity.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_shortcut.xml b/app/src/main/res/layout/dialog_shortcut.xml new file mode 100644 index 0000000..09c266e --- /dev/null +++ b/app/src/main/res/layout/dialog_shortcut.xml @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_actions.xml b/app/src/main/res/layout/item_actions.xml index 9abbc16..59d3023 100644 --- a/app/src/main/res/layout/item_actions.xml +++ b/app/src/main/res/layout/item_actions.xml @@ -17,37 +17,37 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + + + Hello blank fragment + "允许应用自行添加快捷方式。" + "安装快捷方式" + "添加到主屏幕" + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 3c1e4ed..10d4dc3 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -30,7 +30,7 @@ false - + true @null