version:1.7.4

fix:
update:样式优化,增加dockapp预览
This commit is contained in:
2025-09-08 10:01:34 +08:00
parent 780909c403
commit dc3c87b2f9
8 changed files with 170 additions and 13 deletions

View File

@@ -17,8 +17,8 @@ android {
applicationId "com.xxpatx.os" applicationId "com.xxpatx.os"
minSdkVersion 24 minSdkVersion 24
targetSdkVersion 29 targetSdkVersion 29
versionCode 1073 versionCode 1074
versionName "1.7.3" versionName "1.7.4"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

View File

@@ -11,6 +11,7 @@ import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
import com.tencent.mmkv.MMKV; import com.tencent.mmkv.MMKV;
import com.xxpatx.os.R; import com.xxpatx.os.R;
import com.xxpatx.os.adapter.DockAppAdapter;
import com.xxpatx.os.adapter.DockAppSelectedAdapter; import com.xxpatx.os.adapter.DockAppSelectedAdapter;
import com.xxpatx.os.base.mvvm.BaseMvvmActivity; import com.xxpatx.os.base.mvvm.BaseMvvmActivity;
import com.xxpatx.os.bean.DockApp; import com.xxpatx.os.bean.DockApp;
@@ -29,10 +30,10 @@ public class DockActivity extends BaseMvvmActivity<DockViewModel, ActivityDockBi
public static final String DOCK_APP_KEY = "DockAppPackageKey"; public static final String DOCK_APP_KEY = "DockAppPackageKey";
private DockAppAdapter mDockAppAdapter;
private DockAppSelectedAdapter mDockAppSelectedAdapter; private DockAppSelectedAdapter mDockAppSelectedAdapter;
public static final List<String> INCLUDE_SYSTEM_APP =new ArrayList<String>(){{ public static final List<String> INCLUDE_SYSTEM_APP = new ArrayList<String>() {{
this.add("com.android.mms");//信息 this.add("com.android.mms");//信息
this.add("com.mediatek.camera"); this.add("com.mediatek.camera");
}}; }};
@@ -47,7 +48,25 @@ public class DockActivity extends BaseMvvmActivity<DockViewModel, ActivityDockBi
@Override @Override
protected void initView() { protected void initView() {
mDockAppAdapter = new DockAppAdapter();
mDockAppSelectedAdapter = new DockAppSelectedAdapter(); mDockAppSelectedAdapter = new DockAppSelectedAdapter();
mDockAppAdapter.setAppSelectedCallback(new DockAppAdapter.AppSelectedCallback() {
@Override
public void onAppSelected(List<DockApp> dockApps) {
mDockAppSelectedAdapter.notifyDataSetChanged();
}
});
mViewDataBinding.rvSelect.setLayoutManager(new GridLayoutManager(this, 4));
mViewDataBinding.rvSelect.addItemDecoration(new GridSpaceItemDecoration(4, 10, 10));
mViewDataBinding.rvSelect.setAdapter(mDockAppAdapter);
mDockAppSelectedAdapter.setAppSelectedCallback(new DockAppSelectedAdapter.AppSelectedCallback() {
@Override
public void onAppSelected(List<DockApp> dockApps) {
mDockAppAdapter.setDockApps(dockApps);
}
});
// if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { // if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
// mViewDataBinding.recyclerView.setLayoutManager(new GridLayoutManager(this, 3)); // mViewDataBinding.recyclerView.setLayoutManager(new GridLayoutManager(this, 3));
// mViewDataBinding.recyclerView.addItemDecoration(new GridSpaceItemDecoration(3, 20, 20)); // mViewDataBinding.recyclerView.addItemDecoration(new GridSpaceItemDecoration(3, 20, 20));
@@ -82,6 +101,7 @@ public class DockActivity extends BaseMvvmActivity<DockViewModel, ActivityDockBi
try { try {
List<DockApp> dockApps = gson.fromJson(jsonString, type); List<DockApp> dockApps = gson.fromJson(jsonString, type);
mDockAppSelectedAdapter.setSelectedPkgList(dockApps); mDockAppSelectedAdapter.setSelectedPkgList(dockApps);
mDockAppAdapter.setDockApps(dockApps);
} catch (Exception e) { } catch (Exception e) {
Log.e(TAG, "setDockApp: " + e.getMessage()); Log.e(TAG, "setDockApp: " + e.getMessage());
mMMKV.encode(DockActivity.DOCK_APP_KEY, ""); mMMKV.encode(DockActivity.DOCK_APP_KEY, "");

View File

@@ -1,6 +1,9 @@
package com.xxpatx.os.adapter; package com.xxpatx.os.adapter;
import android.content.Context; import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@@ -11,10 +14,12 @@ import androidx.annotation.NonNull;
import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.xxpatx.os.BuildConfig;
import com.xxpatx.os.R; import com.xxpatx.os.R;
import com.xxpatx.os.bean.DockApp; import com.xxpatx.os.bean.DockApp;
import com.xxpatx.os.service.NotificationService; import com.xxpatx.os.service.NotificationService;
import com.xxpatx.os.utils.ApkUtils; import com.xxpatx.os.utils.ApkUtils;
import com.xxpatx.os.utils.IconUtils;
import java.util.List; import java.util.List;
@@ -29,6 +34,16 @@ public class DockAppAdapter extends RecyclerView.Adapter<DockAppAdapter.Holder>
notifyDataSetChanged(); notifyDataSetChanged();
} }
private AppSelectedCallback mAppSelectedCallback;
public void setAppSelectedCallback(AppSelectedCallback appSelectedCallback) {
mAppSelectedCallback = appSelectedCallback;
}
public interface AppSelectedCallback {
void onAppSelected(List<DockApp> dockApps);
}
@NonNull @NonNull
@Override @Override
public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
@@ -39,15 +54,21 @@ public class DockAppAdapter extends RecyclerView.Adapter<DockAppAdapter.Holder>
@Override @Override
public void onBindViewHolder(@NonNull Holder holder, int position) { public void onBindViewHolder(@NonNull Holder holder, int position) {
DockApp dockApp = mDockApps.get(position); DockApp dockApp = mDockApps.get(position);
holder.iv_icon.setImageDrawable(ApkUtils.getAppDrawable(mContext, dockApp.getPackageName())); String pkg = dockApp.getPackageName();
holder.iv_icon.setImageDrawable(ApkUtils.getAppDrawable(mContext, pkg));
holder.tv_name.setText(dockApp.getAppName()); holder.tv_name.setText(dockApp.getAppName());
holder.root.setOnClickListener(new View.OnClickListener() { holder.root.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
ApkUtils.openPackage(mContext, dockApp.getPackageName(), dockApp.getClassName()); // ApkUtils.openPackage(mContext, pkg, dockApp.getClassName());
mDockApps.remove(position);
notifyDataSetChanged();
if (mAppSelectedCallback != null) {
mAppSelectedCallback.onAppSelected(mDockApps);
}
} }
}); });
int size = NotificationService.getNotificationLength(dockApp.getPackageName()); int size = NotificationService.getNotificationLength(pkg);
if (size == 0) { if (size == 0) {
holder.bg.setVisibility(View.GONE); holder.bg.setVisibility(View.GONE);
} else if (size < 99) { } else if (size < 99) {
@@ -57,7 +78,19 @@ public class DockAppAdapter extends RecyclerView.Adapter<DockAppAdapter.Holder>
holder.bg.setVisibility(View.VISIBLE); holder.bg.setVisibility(View.VISIBLE);
holder.bg.setText("99+"); holder.bg.setText("99+");
} }
switch (pkg) {
case "xxpatx.os.dialer":
holder.iv_icon.setImageDrawable(mContext.getDrawable(R.drawable.home_icon_dialer));
break;
case "com.mediatek.camera":
holder.iv_icon.setImageDrawable(mContext.getDrawable(R.drawable.com_android_camera));
break;
case "com.android.mms":
holder.iv_icon.setImageDrawable(mContext.getDrawable(R.drawable.com_android_mms_ui));
break;
default:
holder.iv_icon.setImageDrawable(getIcon(pkg));
}
} }
@Override @Override
@@ -65,6 +98,29 @@ public class DockAppAdapter extends RecyclerView.Adapter<DockAppAdapter.Holder>
return mDockApps == null ? 0 : mDockApps.size(); return mDockApps == null ? 0 : mDockApps.size();
} }
public Drawable getIcon(String packageName) {
PackageManager pm = mContext.getPackageManager();
ApplicationInfo info = null;
try {
info = pm.getApplicationInfo(packageName, 0);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
if (info == null) {
return null;
} else {
int i = IconUtils.appClassNameList.indexOf(packageName);
if (i != -1) {
String val = IconUtils.appIconList.get(i);
int resID = mContext.getResources().getIdentifier(val, "drawable", BuildConfig.APPLICATION_ID);
if (resID != 0) {
return mContext.getResources().getDrawable(resID);
}
}
return info.loadIcon(pm);
}
}
static class Holder extends RecyclerView.ViewHolder { static class Holder extends RecyclerView.ViewHolder {
ConstraintLayout root; ConstraintLayout root;
ImageView iv_icon; ImageView iv_icon;

View File

@@ -2,7 +2,10 @@ package com.xxpatx.os.adapter;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.database.Cursor; import android.database.Cursor;
import android.graphics.drawable.Drawable;
import android.provider.CallLog; import android.provider.CallLog;
import android.util.Log; import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@@ -14,12 +17,14 @@ import android.widget.TextView;
import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.ConstraintLayout;
import com.xxpatx.os.BuildConfig;
import com.xxpatx.os.R; import com.xxpatx.os.R;
import com.xxpatx.os.activity.phone.PhoneActivity; import com.xxpatx.os.activity.phone.PhoneActivity;
import com.xxpatx.os.bean.DockApp; import com.xxpatx.os.bean.DockApp;
import com.xxpatx.os.manager.SpeechManager; import com.xxpatx.os.manager.SpeechManager;
import com.xxpatx.os.service.NotificationService; import com.xxpatx.os.service.NotificationService;
import com.xxpatx.os.utils.ApkUtils; import com.xxpatx.os.utils.ApkUtils;
import com.xxpatx.os.utils.IconUtils;
import java.util.List; import java.util.List;
@@ -84,7 +89,7 @@ public class DockAppGridAdapter extends BaseAdapter {
holder.iv_icon.setImageDrawable(mContext.getDrawable(R.drawable.com_android_mms_ui)); holder.iv_icon.setImageDrawable(mContext.getDrawable(R.drawable.com_android_mms_ui));
break; break;
default: default:
holder.iv_icon.setImageDrawable(ApkUtils.getAppDrawable(mContext, pkg)); holder.iv_icon.setImageDrawable(getIcon(pkg));
} }
holder.tv_name.setText(dockApp.getAppName()); holder.tv_name.setText(dockApp.getAppName());
holder.root.setOnClickListener(new View.OnClickListener() { holder.root.setOnClickListener(new View.OnClickListener() {
@@ -124,6 +129,29 @@ public class DockAppGridAdapter extends BaseAdapter {
return convertView; return convertView;
} }
public Drawable getIcon(String packageName) {
PackageManager pm = mContext.getPackageManager();
ApplicationInfo info = null;
try {
info = pm.getApplicationInfo(packageName, 0);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
if (info == null) {
return null;
} else {
int i = IconUtils.appClassNameList.indexOf(packageName);
if (i != -1) {
String val = IconUtils.appIconList.get(i);
int resID = mContext.getResources().getIdentifier(val, "drawable", BuildConfig.APPLICATION_ID);
if (resID != 0) {
return mContext.getResources().getDrawable(resID);
}
}
return info.loadIcon(pm);
}
}
private int readMissCall() { private int readMissCall() {
int result = 0; int result = 0;
Cursor cursor = mContext.getContentResolver().query(CallLog.Calls.CONTENT_URI, Cursor cursor = mContext.getContentResolver().query(CallLog.Calls.CONTENT_URI,

View File

@@ -48,6 +48,16 @@ public class DockAppSelectedAdapter extends RecyclerView.Adapter<DockAppSelected
notifyDataSetChanged(); notifyDataSetChanged();
} }
private AppSelectedCallback mAppSelectedCallback;
public void setAppSelectedCallback(AppSelectedCallback appSelectedCallback) {
mAppSelectedCallback = appSelectedCallback;
}
public interface AppSelectedCallback {
void onAppSelected(List<DockApp> dockApps);
}
@NonNull @NonNull
@Override @Override
public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
@@ -70,7 +80,7 @@ public class DockAppSelectedAdapter extends RecyclerView.Adapter<DockAppSelected
holder.iv_icon.setImageDrawable(mContext.getDrawable(R.drawable.com_android_mms_ui)); holder.iv_icon.setImageDrawable(mContext.getDrawable(R.drawable.com_android_mms_ui));
break; break;
default: default:
holder.iv_icon.setImageDrawable(getIcon(dockApp.getPackageName())); holder.iv_icon.setImageDrawable(getIcon(pkg));
} }
holder.tv_name.setText(dockApp.getAppName()); holder.tv_name.setText(dockApp.getAppName());
if (mSelectedPkgList.contains(dockApp)) { if (mSelectedPkgList.contains(dockApp)) {
@@ -144,11 +154,17 @@ public class DockAppSelectedAdapter extends RecyclerView.Adapter<DockAppSelected
Toaster.show("最多选择5个"); Toaster.show("最多选择5个");
} else { } else {
mSelectedPkgList.add(dockApp); mSelectedPkgList.add(dockApp);
if (mAppSelectedCallback != null) {
mAppSelectedCallback.onAppSelected(mSelectedPkgList);
}
iv_select.setImageDrawable(mContext.getDrawable(R.drawable.icon_selected)); iv_select.setImageDrawable(mContext.getDrawable(R.drawable.icon_selected));
root.setBackground(mContext.getDrawable(R.drawable.app_select_background)); root.setBackground(mContext.getDrawable(R.drawable.app_select_background));
} }
} else { } else {
mSelectedPkgList.remove(dockApp); mSelectedPkgList.remove(dockApp);
if (mAppSelectedCallback != null) {
mAppSelectedCallback.onAppSelected(mSelectedPkgList);
}
iv_select.setImageDrawable(mContext.getDrawable(R.drawable.icon_unselected)); iv_select.setImageDrawable(mContext.getDrawable(R.drawable.icon_unselected));
root.setBackground(mContext.getDrawable(R.drawable.app_unselect_background)); root.setBackground(mContext.getDrawable(R.drawable.app_unselect_background));
} }

View File

@@ -57,7 +57,7 @@ public class WeatherDayApdapterPort extends RecyclerView.Adapter<WeatherDayApdap
try { try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse(dailyBean.getFxDate()); Date date = sdf.parse(dailyBean.getFxDate());
SimpleDateFormat now = new SimpleDateFormat("MM月dd日"); SimpleDateFormat now = new SimpleDateFormat("dd日");
dateString = now.format(date); dateString = now.format(date);
} catch (ParseException e) { } catch (ParseException e) {
e.printStackTrace(); e.printStackTrace();

View File

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- 填充的颜色:这里设置背景透明 -->
<solid android:color="#4DF3F3F3" />
<!-- 边框的颜色 :不能和窗口背景色一样 -->
<!-- 设置按钮的四个角为弧形 -->
<!-- android:radius 弧形的半径 -->
<corners
android:bottomLeftRadius="10dp"
android:bottomRightRadius="10dp"
android:topLeftRadius="10dp"
android:topRightRadius="10dp" />
<!-- paddingButton里面的文字与Button边界的间隔 -->
<!-- <padding-->
<!-- android:bottom="10dp"-->
<!-- android:left="10dp"-->
<!-- android:right="10dp"-->
<!-- android:top="10dp" />-->
</shape>

View File

@@ -16,7 +16,7 @@
android:layout_height="match_parent"> android:layout_height="match_parent">
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintLayout" android:id="@+id/cl_exit"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="48dp" android:layout_height="48dp"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
@@ -57,6 +57,18 @@
tools:text="@string/app_size" /> tools:text="@string/app_size" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_select"
android:layout_width="match_parent"
android:layout_height="88dp"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="16dp"
android:background="@drawable/settings_app_card_bg"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/cl_exit" />
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView" android:id="@+id/recyclerView"
android:layout_width="match_parent" android:layout_width="match_parent"
@@ -67,7 +79,7 @@
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/constraintLayout" /> app:layout_constraintTop_toBottomOf="@+id/rv_select" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</layout> </layout>