Load adaptive icon properly

This commit is contained in:
NekoInverter 2020-04-04 15:54:29 +08:00
parent 2c563ec9e2
commit c460571a3e
No known key found for this signature in database
GPG Key ID: 280D6CCCF95715F9
12 changed files with 47 additions and 36 deletions

View File

@ -74,5 +74,6 @@ dependencies {
implementation 'com.takisoft.preferencex:preferencex-colorpicker:1.1.0' implementation 'com.takisoft.preferencex:preferencex-colorpicker:1.1.0'
implementation 'tech.rectifier.preferencex-android:preferencex-simplemenu:88f93154b2' implementation 'tech.rectifier.preferencex-android:preferencex-simplemenu:88f93154b2'
implementation 'com.timehop.stickyheadersrecyclerview:library:0.4.3@aar' implementation 'com.timehop.stickyheadersrecyclerview:library:0.4.3@aar'
implementation 'me.zhanghai.android.appiconloader:appiconloader:1.1.0'
compileOnly 'de.robv.android.xposed:api:82' compileOnly 'de.robv.android.xposed:api:82'
} }

View File

@ -17,7 +17,7 @@ public class XposedApp extends Application {
public static final String TAG = "XposedApp"; public static final String TAG = "XposedApp";
private static final File EDXPOSED_PROP_FILE = new File("/system/framework/edconfig.jar"); private static final File EDXPOSED_PROP_FILE = new File("/system/framework/edconfig.jar");
private static XposedApp instance = null; private static XposedApp instance = null;
public InstallZipUtil.XposedProp xposedProp; public InstallZipUtil.XposedProp mXposedProp;
public static XposedApp getInstance() { public static XposedApp getInstance() {
return instance; return instance;
@ -51,7 +51,7 @@ public class XposedApp extends Application {
} }
} }
synchronized (this) { synchronized (this) {
xposedProp = prop; mXposedProp = prop;
} }
} }
} }

View File

@ -69,6 +69,8 @@ public class AboutActivity extends BaseActivity {
if (translator.isEmpty()) { if (translator.isEmpty()) {
binding.translatorsView.setVisibility(View.GONE); binding.translatorsView.setVisibility(View.GONE);
} }
binding.appIcon.setImageBitmap(XposedApp.getInstance().getAppIconLoader().loadIcon(getApplicationInfo(), false));
} }
void setupView(View v, final int url) { void setupView(View v, final int url) {

View File

@ -14,6 +14,8 @@ import org.meowcat.edxposed.manager.databinding.ActivityMainBinding;
import org.meowcat.edxposed.manager.util.ModuleUtil; import org.meowcat.edxposed.manager.util.ModuleUtil;
import org.meowcat.edxposed.manager.util.RepoLoader; import org.meowcat.edxposed.manager.util.RepoLoader;
import me.zhanghai.android.appiconloader.AppIconLoader;
public class MainActivity extends BaseActivity implements RepoLoader.RepoListener, ModuleUtil.ModuleListener { public class MainActivity extends BaseActivity implements RepoLoader.RepoListener, ModuleUtil.ModuleListener {
ActivityMainBinding binding; ActivityMainBinding binding;
private RepoLoader repoLoader; private RepoLoader repoLoader;
@ -70,6 +72,7 @@ public class MainActivity extends BaseActivity implements RepoLoader.RepoListene
appMenu.setOnMenuItemClickListener(this::onOptionsItemSelected); appMenu.setOnMenuItemClickListener(this::onOptionsItemSelected);
appMenu.show(); appMenu.show();
}); });
binding.appIcon.setImageBitmap(XposedApp.getInstance().getAppIconLoader().loadIcon(getApplicationInfo(), false));
String installedXposedVersion; String installedXposedVersion;
try { try {
installedXposedVersion = XposedApp.getXposedProp().getVersion(); installedXposedVersion = XposedApp.getXposedProp().getVersion();
@ -90,6 +93,11 @@ public class MainActivity extends BaseActivity implements RepoLoader.RepoListene
binding.status.setCardBackgroundColor(ContextCompat.getColor(this, R.color.amber_500)); binding.status.setCardBackgroundColor(ContextCompat.getColor(this, R.color.amber_500));
binding.statusIcon.setImageDrawable(getDrawable(R.drawable.ic_warning)); binding.statusIcon.setImageDrawable(getDrawable(R.drawable.ic_warning));
} }
} else if (XposedApp.getXposedVersion() > 0) {
binding.statusTitle.setText(R.string.Activated);
binding.statusSummary.setText(getString(R.string.version_x, XposedApp.getXposedVersion()));
binding.status.setCardBackgroundColor(ContextCompat.getColor(this, R.color.download_status_update_available));
binding.statusIcon.setImageDrawable(getDrawable(R.drawable.ic_check_circle));
} else { } else {
binding.statusTitle.setText(R.string.Install); binding.statusTitle.setText(R.string.Install);
binding.statusSummary.setText(R.string.InstallDetail); binding.statusSummary.setText(R.string.InstallDetail);

View File

@ -545,7 +545,7 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi
String updateDate = dateformat.format(new Date(item.updateTime)); String updateDate = dateformat.format(new Date(item.updateTime));
holder.timestamps.setText(getString(R.string.install_timestamps, creationDate, updateDate)); holder.timestamps.setText(getString(R.string.install_timestamps, creationDate, updateDate));
holder.appIcon.setImageDrawable(item.getIcon()); holder.appIcon.setImageBitmap(item.getIcon(ModulesActivity.this));
TextView descriptionText = holder.appDescription; TextView descriptionText = holder.appDescription;
descriptionText.setVisibility(View.VISIBLE); descriptionText.setVisibility(View.VISIBLE);

View File

@ -36,6 +36,7 @@ import java.util.Date;
import java.util.Objects; import java.util.Objects;
import de.robv.android.xposed.installer.util.InstallZipUtil; import de.robv.android.xposed.installer.util.InstallZipUtil;
import me.zhanghai.android.appiconloader.AppIconLoader;
public class XposedApp extends de.robv.android.xposed.installer.XposedApp implements Application.ActivityLifecycleCallbacks { public class XposedApp extends de.robv.android.xposed.installer.XposedApp implements Application.ActivityLifecycleCallbacks {
public static final String TAG = "EdXposedManager"; public static final String TAG = "EdXposedManager";
@ -49,13 +50,14 @@ public class XposedApp extends de.robv.android.xposed.installer.XposedApp implem
private SharedPreferences pref; private SharedPreferences pref;
private AppCompatActivity currentActivity = null; private AppCompatActivity currentActivity = null;
private boolean isUiLoaded = false; private boolean isUiLoaded = false;
private AppIconLoader appIconLoader;
public static XposedApp getInstance() { public static XposedApp getInstance() {
return instance; return instance;
} }
public static InstallZipUtil.XposedProp getXposedProp() { public static InstallZipUtil.XposedProp getXposedProp() {
return de.robv.android.xposed.installer.XposedApp.getInstance().xposedProp; return de.robv.android.xposed.installer.XposedApp.getInstance().mXposedProp;
} }
public static void runOnUiThread(Runnable action) { public static void runOnUiThread(Runnable action) {
@ -144,6 +146,13 @@ public class XposedApp extends de.robv.android.xposed.installer.XposedApp implem
} }
RepoLoader.getInstance().triggerFirstLoadIfNecessary(); RepoLoader.getInstance().triggerFirstLoadIfNecessary();
appIconLoader = new AppIconLoader(getResources().getDimensionPixelSize(
R.dimen.app_icon_size), this);
}
public AppIconLoader getAppIconLoader(){
return appIconLoader;
} }
private void registerReceivers() { private void registerReceivers() {

View File

@ -33,6 +33,8 @@ import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import me.zhanghai.android.appiconloader.AppIconLoader;
public class AppAdapter extends RecyclerView.Adapter<AppAdapter.ViewHolder> implements Filterable { public class AppAdapter extends RecyclerView.Adapter<AppAdapter.ViewHolder> implements Filterable {
protected final Context context; protected final Context context;
@ -173,7 +175,7 @@ public class AppAdapter extends RecyclerView.Adapter<AppAdapter.ViewHolder> impl
@Override @Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) { public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
ApplicationInfo info = showList.get(position); ApplicationInfo info = showList.get(position);
holder.appIcon.setImageDrawable(info.loadIcon(pm)); holder.appIcon.setImageBitmap(XposedApp.getInstance().getAppIconLoader().loadIcon(info, false));
holder.appName.setText(InstallApkUtil.getAppLabel(info, pm)); holder.appName.setText(InstallApkUtil.getAppLabel(info, pm));
try { try {
holder.appVersion.setText(pm.getPackageInfo(info.packageName, 0).versionName); holder.appVersion.setText(pm.getPackageInfo(info.packageName, 0).versionName);

View File

@ -8,6 +8,7 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Build; import android.os.Build;
import android.os.FileUtils; import android.os.FileUtils;
@ -32,6 +33,8 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
import me.zhanghai.android.appiconloader.AppIconLoader;
@SuppressWarnings("OctalInteger") @SuppressWarnings("OctalInteger")
public final class ModuleUtil { public final class ModuleUtil {
// xposedminversion below this // xposedminversion below this
@ -385,23 +388,8 @@ public final class ModuleUtil {
return (version != null) && version.code > versionCode; return (version != null) && version.code > versionCode;
} }
public Drawable getIcon() { public Bitmap getIcon(Context context) {
if (iconCache != null) return XposedApp.getInstance().getAppIconLoader().loadIcon(app, false);
return iconCache.newDrawable();
Intent mIntent = new Intent(Intent.ACTION_MAIN);
//mIntent.addCategory(ModulesFragment.SETTINGS_CATEGORY);
mIntent.setPackage(app.packageName);
List<ResolveInfo> ris = pm.queryIntentActivities(mIntent, 0);
Drawable result;
if (ris == null || ris.size() <= 0)
result = app.loadIcon(pm);
else
result = ris.get(0).activityInfo.loadIcon(pm);
iconCache = result.getConstantState();
return result;
} }
@NonNull @NonNull

View File

@ -27,22 +27,22 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="72dp" android:layout_height="72dp"
android:orientation="horizontal" android:orientation="horizontal"
android:padding="16dp"> android:padding="16dp"
android:clipChildren="false"
android:clipToPadding="false">
<ImageView <ImageView
android:id="@+id/app_icon"
android:layout_width="42dp" android:layout_width="42dp"
android:layout_height="64dp" android:layout_height="42dp"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:adjustViewBounds="true" android:contentDescription="@string/app_name" />
android:contentDescription="@string/app_name"
android:scaleType="centerCrop"
app:srcCompat="@drawable/ic_launcher_foreground" />
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:paddingHorizontal="16dp" android:layout_marginStart="14dp"
android:text="@string/app_name" android:text="@string/app_name"
android:textAppearance="@style/TextAppearance.AppCompat.Headline" /> android:textAppearance="@style/TextAppearance.AppCompat.Headline" />
</LinearLayout> </LinearLayout>
@ -67,7 +67,6 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="32dp" android:layout_marginStart="32dp"
android:layout_marginLeft="32dp"
android:orientation="vertical" android:orientation="vertical"
android:paddingTop="8dp" android:paddingTop="8dp"
android:paddingBottom="8dp" android:paddingBottom="8dp"

View File

@ -35,19 +35,17 @@
<ImageView <ImageView
android:id="@+id/app_icon" android:id="@+id/app_icon"
android:layout_width="28dp" android:layout_width="42dp"
android:layout_height="wrap_content" android:layout_height="42dp"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_marginStart="16dp" android:layout_marginStart="16dp"
android:contentDescription="@string/app_name" android:contentDescription="@string/app_name" />
android:scaleType="centerCrop"
app:srcCompat="@drawable/ic_launcher_foreground" />
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_marginStart="25dp" android:layout_marginStart="10dp"
android:layout_toEndOf="@id/app_icon" android:layout_toEndOf="@id/app_icon"
android:contentDescription="@string/app_name" android:contentDescription="@string/app_name"
android:text="@string/app_name" android:text="@string/app_name"

View File

@ -0,0 +1,3 @@
<resources>
<dimen name="app_icon_size">48dp</dimen>\
</resources>

View File

@ -335,4 +335,5 @@
<string name="material_design_2">Material Design 2</string> <string name="material_design_2">Material Design 2</string>
<string name="xposed_description">Enable EdXposed enhancements:\nRemove background restrictions on EdXposed\nDetermine if Xposed is working properly\nPretend to have Xposed Installer installed</string> <string name="xposed_description">Enable EdXposed enhancements:\nRemove background restrictions on EdXposed\nDetermine if Xposed is working properly\nPretend to have Xposed Installer installed</string>
<string name="status_enhancement">Enhancement mode</string> <string name="status_enhancement">Enhancement mode</string>
<string name="version_x">Version %d</string>
</resources> </resources>