From b32afc078769ba4bc47e35676e9ceba831f616ea Mon Sep 17 00:00:00 2001 From: NekoInverter <42698724+NekoInverter@users.noreply.github.com> Date: Fri, 28 Feb 2020 19:06:44 +0800 Subject: [PATCH] Fixes --- .idea/gradle.xml | 13 +- app/build.gradle | 6 +- app/libs/AndroidHiddenAPI.jar | Bin 3191 -> 0 bytes .../manager/BaseAdvancedInstaller.java | 3 +- .../edxposed/manager/BlackListActivity.java | 3 +- .../edxposed/manager/CompatListActivity.java | 3 +- .../edxposed/manager/DownloadActivity.java | 10 +- .../manager/DownloadDetailsFragment.java | 5 +- .../DownloadDetailsVersionsFragment.java | 3 +- .../edxposed/manager/ModulesActivity.java | 4 +- .../edxposed/manager/SettingsActivity.java | 2 +- .../manager/StatusInstallerFragment.java | 9 +- .../meowcat/edxposed/manager/XposedApp.java | 7 +- .../edxposed/manager/adapters/AppHelper.java | 2 +- .../edxposed/manager/util/FileUtils.java | 174 ++++++++++++++++++ .../edxposed/manager/util/ModuleUtil.java | 1 - .../edxposed/manager/util/NavUtil.java | 11 +- .../util/chrome/CustomTabsURLSpan.java | 7 +- .../util/chrome/LinkTransformationMethod.java | 7 +- .../edxposed/manager/util/json/XposedZip.java | 4 +- app/src/main/res/layout/activity_about.xml | 50 ++--- .../main/res/layout/activity_crash_report.xml | 2 +- app/src/main/res/layout/activity_main.xml | 32 ++-- app/src/main/res/layout/item_download.xml | 3 +- app/src/main/res/layout/item_module.xml | 2 +- app/src/main/res/layout/item_version.xml | 2 +- .../main/res/layout/single_installer_view.xml | 24 +-- app/src/main/res/layout/status_installer.xml | 33 ++-- app/src/main/res/values/styles.xml | 2 +- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 +- 31 files changed, 314 insertions(+), 116 deletions(-) delete mode 100644 app/libs/AndroidHiddenAPI.jar create mode 100644 app/src/main/java/org/meowcat/edxposed/manager/util/FileUtils.java diff --git a/.idea/gradle.xml b/.idea/gradle.xml index d291b3d7..674414fc 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,15 +1,20 @@ + diff --git a/app/build.gradle b/app/build.gradle index d9510a46..8f57cff4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,8 +1,8 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 28 - buildToolsVersion "29.0.2" + compileSdkVersion 29 + buildToolsVersion "29.0.3" defaultConfig { applicationId "org.meowcat.edxposed.manager" minSdkVersion 21 @@ -31,7 +31,7 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' - implementation 'com.google.android.material:material:1.2.0-alpha04' + implementation 'com.google.android.material:material:1.2.0-alpha05' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0' implementation 'com.github.bumptech.glide:glide:4.11.0' implementation "com.github.topjohnwu.libsu:core:2.5.1" diff --git a/app/libs/AndroidHiddenAPI.jar b/app/libs/AndroidHiddenAPI.jar deleted file mode 100644 index 113acc1e39b8151c067fc694a108aa613ae76541..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3191 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 diff --git a/app/src/main/java/org/meowcat/edxposed/manager/BaseAdvancedInstaller.java b/app/src/main/java/org/meowcat/edxposed/manager/BaseAdvancedInstaller.java index 14228311..4c4b4de6 100644 --- a/app/src/main/java/org/meowcat/edxposed/manager/BaseAdvancedInstaller.java +++ b/app/src/main/java/org/meowcat/edxposed/manager/BaseAdvancedInstaller.java @@ -19,6 +19,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.fragment.app.Fragment; @@ -188,7 +189,7 @@ public class BaseAdvancedInstaller extends Fragment { view.findViewById(R.id.warning_unofficial).setVisibility(View.VISIBLE); } - showOnXda.setOnClickListener(v -> NavUtil.startURL(getActivity(), supportUrl())); + showOnXda.setOnClickListener(v -> NavUtil.startURL((AppCompatActivity) getActivity(), supportUrl())); updateDescription.setOnClickListener(v -> new MaterialAlertDialogBuilder(Objects.requireNonNull(getContext())) .setTitle(R.string.changes) .setMessage(Html.fromHtml(description())) diff --git a/app/src/main/java/org/meowcat/edxposed/manager/BlackListActivity.java b/app/src/main/java/org/meowcat/edxposed/manager/BlackListActivity.java index ce2b593d..bdeb92ba 100644 --- a/app/src/main/java/org/meowcat/edxposed/manager/BlackListActivity.java +++ b/app/src/main/java/org/meowcat/edxposed/manager/BlackListActivity.java @@ -11,6 +11,7 @@ import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; import androidx.appcompat.widget.SearchView; import androidx.appcompat.widget.Toolbar; +import androidx.core.view.MenuItemCompat; import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -72,7 +73,7 @@ public class BlackListActivity extends BaseActivity implements AppAdapter.Callba @Override public boolean onCreateOptionsMenu(@NonNull Menu menu) { getMenuInflater().inflate(R.menu.menu_app_list, menu); - mSearchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); + mSearchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.menu_search)); mSearchView.setOnQueryTextListener(mSearchListener); return super.onCreateOptionsMenu(menu); } diff --git a/app/src/main/java/org/meowcat/edxposed/manager/CompatListActivity.java b/app/src/main/java/org/meowcat/edxposed/manager/CompatListActivity.java index d4059dea..c94f411b 100644 --- a/app/src/main/java/org/meowcat/edxposed/manager/CompatListActivity.java +++ b/app/src/main/java/org/meowcat/edxposed/manager/CompatListActivity.java @@ -10,6 +10,7 @@ import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; import androidx.appcompat.widget.SearchView; import androidx.appcompat.widget.Toolbar; +import androidx.core.view.MenuItemCompat; import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -75,7 +76,7 @@ public class CompatListActivity extends BaseActivity implements AppAdapter.Callb @Override public boolean onCreateOptionsMenu(@NonNull Menu menu) { getMenuInflater().inflate(R.menu.menu_app_list, menu); - mSearchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); + mSearchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.menu_search)); mSearchView.setOnQueryTextListener(mSearchListener); return super.onCreateOptionsMenu(menu); } diff --git a/app/src/main/java/org/meowcat/edxposed/manager/DownloadActivity.java b/app/src/main/java/org/meowcat/edxposed/manager/DownloadActivity.java index b200f611..dc44079e 100644 --- a/app/src/main/java/org/meowcat/edxposed/manager/DownloadActivity.java +++ b/app/src/main/java/org/meowcat/edxposed/manager/DownloadActivity.java @@ -11,6 +11,7 @@ import android.net.ConnectivityManager; import android.net.Uri; import android.os.Build; import android.os.Bundle; +import android.util.TypedValue; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; @@ -18,10 +19,12 @@ import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.appcompat.app.ActionBar; import androidx.appcompat.widget.SearchView; import androidx.appcompat.widget.Toolbar; +import androidx.core.view.MenuItemCompat; import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -152,7 +155,7 @@ public class DownloadActivity extends BaseActivity implements RepoLoader.RepoLis // Setup search button final MenuItem searchItem = menu.findItem(R.id.menu_search); - mSearchView = (SearchView) searchItem.getActionView(); + mSearchView = (SearchView) MenuItemCompat.getActionView(searchItem); mSearchView.setIconifiedByDefault(true); mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override @@ -347,6 +350,11 @@ public class DownloadActivity extends BaseActivity implements RepoLoader.RepoLis txtStatus.setText(mContext.getString( R.string.download_status_installed, installedVersion)); //txtStatus.setTextColor(ThemeUtil.getThemeColor(mContext, R.attr.download_status_installed)); + TypedValue typedValue = new TypedValue(); + Resources.Theme theme = txtStatus.getContext().getTheme(); + theme.resolveAttribute(android.R.attr.textColorSecondary, typedValue, true); + @ColorInt int color = typedValue.data; + txtStatus.setTextColor(color); txtStatus.setVisibility(View.VISIBLE); } else { txtStatus.setVisibility(View.GONE); diff --git a/app/src/main/java/org/meowcat/edxposed/manager/DownloadDetailsFragment.java b/app/src/main/java/org/meowcat/edxposed/manager/DownloadDetailsFragment.java index 5b479cb1..1d511950 100644 --- a/app/src/main/java/org/meowcat/edxposed/manager/DownloadDetailsFragment.java +++ b/app/src/main/java/org/meowcat/edxposed/manager/DownloadDetailsFragment.java @@ -10,6 +10,7 @@ import android.view.ViewGroup; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; import org.meowcat.edxposed.manager.repo.Module; @@ -45,7 +46,7 @@ public class DownloadDetailsFragment extends Fragment { if (module.description != null) { if (module.descriptionIsHtml) { description.setText(RepoParser.parseSimpleHtml(getActivity(), module.description, description)); - description.setTransformationMethod(new LinkTransformationMethod(getActivity())); + description.setTransformationMethod(new LinkTransformationMethod((AppCompatActivity) getActivity())); description.setMovementMethod(LinkMovementMethod.getInstance()); } else { description.setText(module.description); @@ -67,7 +68,7 @@ public class DownloadDetailsFragment extends Fragment { final Uri link = NavUtil.parseURL(moreInfoEntry.second); if (link != null) { txtValue.setTextColor(txtValue.getLinkTextColors()); - moreInfoView.setOnClickListener(v -> NavUtil.startURL(getActivity(), link)); + moreInfoView.setOnClickListener(v -> NavUtil.startURL((AppCompatActivity) getActivity(), link)); } moreInfoContainer.addView(moreInfoView); diff --git a/app/src/main/java/org/meowcat/edxposed/manager/DownloadDetailsVersionsFragment.java b/app/src/main/java/org/meowcat/edxposed/manager/DownloadDetailsVersionsFragment.java index 2cee8761..616358d1 100644 --- a/app/src/main/java/org/meowcat/edxposed/manager/DownloadDetailsVersionsFragment.java +++ b/app/src/main/java/org/meowcat/edxposed/manager/DownloadDetailsVersionsFragment.java @@ -16,6 +16,7 @@ import android.widget.FrameLayout; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; import androidx.core.content.ContextCompat; import androidx.fragment.app.ListFragment; @@ -247,7 +248,7 @@ public class DownloadDetailsVersionsFragment extends ListFragment { if (item.changelogIsHtml) { holder.txtChanges.setText(RepoParser.parseSimpleHtml(getActivity(), item.changelog, holder.txtChanges)); - holder.txtChanges.setTransformationMethod(new LinkTransformationMethod(getActivity())); + holder.txtChanges.setTransformationMethod(new LinkTransformationMethod((AppCompatActivity) getActivity())); holder.txtChanges.setMovementMethod(LinkMovementMethod.getInstance()); } else { holder.txtChanges.setText(item.changelog); diff --git a/app/src/main/java/org/meowcat/edxposed/manager/ModulesActivity.java b/app/src/main/java/org/meowcat/edxposed/manager/ModulesActivity.java index 796b57d5..1f4fd114 100644 --- a/app/src/main/java/org/meowcat/edxposed/manager/ModulesActivity.java +++ b/app/src/main/java/org/meowcat/edxposed/manager/ModulesActivity.java @@ -4,7 +4,6 @@ import android.content.ActivityNotFoundException; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; -import android.graphics.Color; import android.net.Uri; import android.os.Bundle; import android.os.Environment; @@ -25,6 +24,7 @@ import androidx.annotation.NonNull; import androidx.appcompat.app.ActionBar; import androidx.appcompat.widget.SearchView; import androidx.appcompat.widget.Toolbar; +import androidx.core.view.MenuItemCompat; import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -162,7 +162,7 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_modules, menu); - mSearchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); + mSearchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.menu_search)); mSearchView.setOnQueryTextListener(mSearchListener); return super.onCreateOptionsMenu(menu); } diff --git a/app/src/main/java/org/meowcat/edxposed/manager/SettingsActivity.java b/app/src/main/java/org/meowcat/edxposed/manager/SettingsActivity.java index deb05b89..b0dff339 100644 --- a/app/src/main/java/org/meowcat/edxposed/manager/SettingsActivity.java +++ b/app/src/main/java/org/meowcat/edxposed/manager/SettingsActivity.java @@ -6,7 +6,6 @@ import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; -import android.os.FileUtils; import android.view.View; import android.widget.FrameLayout; import android.widget.LinearLayout; @@ -25,6 +24,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.takisoft.preferencex.PreferenceFragmentCompat; import com.topjohnwu.superuser.Shell; +import org.meowcat.edxposed.manager.util.FileUtils; import org.meowcat.edxposed.manager.util.RepoLoader; import java.io.File; diff --git a/app/src/main/java/org/meowcat/edxposed/manager/StatusInstallerFragment.java b/app/src/main/java/org/meowcat/edxposed/manager/StatusInstallerFragment.java index c7af6264..4db23cec 100644 --- a/app/src/main/java/org/meowcat/edxposed/manager/StatusInstallerFragment.java +++ b/app/src/main/java/org/meowcat/edxposed/manager/StatusInstallerFragment.java @@ -1,7 +1,6 @@ package org.meowcat.edxposed.manager; import android.annotation.SuppressLint; -import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; @@ -10,7 +9,6 @@ import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.os.Bundle; -import android.os.FileUtils; import android.text.Html; import android.util.Log; import android.view.LayoutInflater; @@ -19,10 +17,13 @@ import android.view.ViewGroup; import android.widget.TextView; import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; import com.google.android.material.dialog.MaterialAlertDialogBuilder; +import org.meowcat.edxposed.manager.util.FileUtils; + import java.io.BufferedReader; import java.io.File; import java.io.FileReader; @@ -35,7 +36,7 @@ import java.util.Objects; public class StatusInstallerFragment extends Fragment { public static final File DISABLE_FILE = new File(XposedApp.BASE_DIR + "conf/disabled"); - private static Activity sActivity; + private static AppCompatActivity sActivity; private static String mUpdateLink; private static View mUpdateView; private static View mUpdateButton; @@ -115,7 +116,7 @@ public class StatusInstallerFragment extends Fragment { @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - sActivity = getActivity(); + sActivity = (AppCompatActivity) getActivity(); } @SuppressLint("WorldReadableFiles") diff --git a/app/src/main/java/org/meowcat/edxposed/manager/XposedApp.java b/app/src/main/java/org/meowcat/edxposed/manager/XposedApp.java index a47a8429..d3c08d81 100644 --- a/app/src/main/java/org/meowcat/edxposed/manager/XposedApp.java +++ b/app/src/main/java/org/meowcat/edxposed/manager/XposedApp.java @@ -12,16 +12,17 @@ import android.content.res.Resources; import android.os.Build; import android.os.Bundle; import android.os.Environment; -import android.os.FileUtils; import android.os.Handler; import android.preference.PreferenceManager; import android.util.DisplayMetrics; import android.util.Log; import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import org.meowcat.edxposed.manager.receivers.PackageChangeReceiver; +import org.meowcat.edxposed.manager.util.FileUtils; import org.meowcat.edxposed.manager.util.ModuleUtil; import org.meowcat.edxposed.manager.util.NotificationUtil; import org.meowcat.edxposed.manager.util.RepoLoader; @@ -52,7 +53,7 @@ public class XposedApp extends de.robv.android.xposed.installer.XposedApp implem private static Thread mUiThread; private static Handler mMainHandler; private SharedPreferences mPref; - private Activity mCurrentActivity = null; + private AppCompatActivity mCurrentActivity = null; private boolean mIsUiLoaded = false; public static XposedApp getInstance() { @@ -236,7 +237,7 @@ public class XposedApp extends de.robv.android.xposed.installer.XposedApp implem @Override public synchronized void onActivityResumed(@NonNull Activity activity) { - mCurrentActivity = activity; + mCurrentActivity = (AppCompatActivity) activity; updateProgressIndicator(null); } diff --git a/app/src/main/java/org/meowcat/edxposed/manager/adapters/AppHelper.java b/app/src/main/java/org/meowcat/edxposed/manager/adapters/AppHelper.java index a4c860fa..9f37c66d 100644 --- a/app/src/main/java/org/meowcat/edxposed/manager/adapters/AppHelper.java +++ b/app/src/main/java/org/meowcat/edxposed/manager/adapters/AppHelper.java @@ -6,7 +6,6 @@ import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.net.Uri; -import android.os.FileUtils; import android.view.View; import android.widget.Toast; @@ -20,6 +19,7 @@ import org.meowcat.edxposed.manager.BuildConfig; import org.meowcat.edxposed.manager.R; import org.meowcat.edxposed.manager.XposedApp; import org.meowcat.edxposed.manager.util.CompileUtil; +import org.meowcat.edxposed.manager.util.FileUtils; import java.io.File; import java.io.FileNotFoundException; diff --git a/app/src/main/java/org/meowcat/edxposed/manager/util/FileUtils.java b/app/src/main/java/org/meowcat/edxposed/manager/util/FileUtils.java new file mode 100644 index 00000000..af6a78f8 --- /dev/null +++ b/app/src/main/java/org/meowcat/edxposed/manager/util/FileUtils.java @@ -0,0 +1,174 @@ +package org.meowcat.edxposed.manager.util; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.util.regex.Pattern; +import java.util.zip.CRC32; +import java.util.zip.CheckedInputStream; + +@SuppressWarnings("ALL") +public class FileUtils { + public static final int S_IRWXU = 448; + public static final int S_IRUSR = 256; + public static final int S_IWUSR = 128; + public static final int S_IXUSR = 64; + public static final int S_IRWXG = 56; + public static final int S_IRGRP = 32; + public static final int S_IWGRP = 16; + public static final int S_IXGRP = 8; + public static final int S_IRWXO = 7; + public static final int S_IROTH = 4; + public static final int S_IWOTH = 2; + public static final int S_IXOTH = 1; + private static final Pattern SAFE_FILENAME_PATTERN = Pattern.compile("[\\w%+,./=_-]+"); + + public static native int setPermissions(String paramString, int paramInt1, int paramInt2, int paramInt3); + + public static native int getFatVolumeId(String paramString); + + public static boolean sync(FileOutputStream stream) { + try { + if (stream != null) + stream.getFD().sync(); + return true; + } catch (IOException e) { + return false; + } + } + + public static boolean copyFile(File srcFile, File destFile) { + boolean result = false; + try { + InputStream in = new FileInputStream(srcFile); + try { + result = copyToFile(in, destFile); + } finally { + in.close(); + } + } catch (IOException e) { + result = false; + } + return result; + } + + public static boolean copyToFile(InputStream inputStream, File destFile) { + try { + if (destFile.exists()) + destFile.delete(); + FileOutputStream out = new FileOutputStream(destFile); + try { + byte[] buffer = new byte[4096]; + int bytesRead; + while ((bytesRead = inputStream.read(buffer)) >= 0) + out.write(buffer, 0, bytesRead); + } finally { + out.flush(); + try { + out.getFD().sync(); + } catch (IOException e) { + } + out.close(); + } + return true; + } catch (IOException e) { + return false; + } + } + + public static boolean isFilenameSafe(File file) { + return SAFE_FILENAME_PATTERN.matcher(file.getPath()).matches(); + } + + public static String readTextFile(File file, int max, String ellipsis) throws IOException { + InputStream input = new FileInputStream(file); + BufferedInputStream bis = new BufferedInputStream(input); + try { + long size = file.length(); + if (max > 0 || (size > 0L && max == 0)) { + if (size > 0L && (max == 0 || size < max)) + max = (int) size; + byte[] arrayOfByte = new byte[max + 1]; + int length = bis.read(arrayOfByte); + if (length <= 0) + return ""; + if (length <= max) + return new String(arrayOfByte, 0, length); + if (ellipsis == null) + return new String(arrayOfByte, 0, max); + return new String(arrayOfByte, 0, max) + ellipsis; + } + if (max < 0) { + int len; + boolean rolled = false; + byte[] last = null, arrayOfByte1 = null; + do { + if (last != null) + rolled = true; + byte[] tmp = last; + last = arrayOfByte1; + arrayOfByte1 = tmp; + if (arrayOfByte1 == null) + arrayOfByte1 = new byte[-max]; + len = bis.read(arrayOfByte1); + } while (len == arrayOfByte1.length); + if (last == null && len <= 0) + return ""; + if (last == null) + return new String(arrayOfByte1, 0, len); + if (len > 0) { + rolled = true; + System.arraycopy(last, len, last, 0, last.length - len); + System.arraycopy(arrayOfByte1, 0, last, last.length - len, len); + } + if (ellipsis == null || !rolled) + return new String(last); + return ellipsis + new String(last); + } + ByteArrayOutputStream contents = new ByteArrayOutputStream(); + byte[] data = new byte[1024]; + while (true) { + int len = bis.read(data); + if (len > 0) + contents.write(data, 0, len); + if (len != data.length) + return contents.toString(); + } + } finally { + bis.close(); + input.close(); + } + } + + public static void stringToFile(String filename, String string) throws IOException { + FileWriter out = new FileWriter(filename); + try { + out.write(string); + } finally { + out.close(); + } + } + + public static long checksumCrc32(File file) throws FileNotFoundException, IOException { + CRC32 checkSummer = new CRC32(); + CheckedInputStream cis = null; + try { + cis = new CheckedInputStream(new FileInputStream(file), checkSummer); + byte[] buf = new byte[128]; + while (cis.read(buf) >= 0) ; + return checkSummer.getValue(); + } finally { + if (cis != null) + try { + cis.close(); + } catch (IOException e) { + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/org/meowcat/edxposed/manager/util/ModuleUtil.java b/app/src/main/java/org/meowcat/edxposed/manager/util/ModuleUtil.java index 93d113df..77fd92a3 100644 --- a/app/src/main/java/org/meowcat/edxposed/manager/util/ModuleUtil.java +++ b/app/src/main/java/org/meowcat/edxposed/manager/util/ModuleUtil.java @@ -10,7 +10,6 @@ import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; import android.graphics.drawable.Drawable; import android.os.Build; -import android.os.FileUtils; import android.util.Log; import android.widget.Toast; diff --git a/app/src/main/java/org/meowcat/edxposed/manager/util/NavUtil.java b/app/src/main/java/org/meowcat/edxposed/manager/util/NavUtil.java index 6afc89eb..5021930e 100644 --- a/app/src/main/java/org/meowcat/edxposed/manager/util/NavUtil.java +++ b/app/src/main/java/org/meowcat/edxposed/manager/util/NavUtil.java @@ -1,7 +1,5 @@ package org.meowcat.edxposed.manager.util; -import android.app.Activity; -import android.app.AlertDialog; import android.content.Context; import android.net.Uri; import android.text.Spannable; @@ -11,9 +9,12 @@ import android.text.util.Linkify; import androidx.annotation.AnyThread; import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; import androidx.browser.customtabs.CustomTabsIntent; import androidx.core.content.ContextCompat; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; + import org.meowcat.edxposed.manager.R; import org.meowcat.edxposed.manager.XposedApp; @@ -30,20 +31,20 @@ public final class NavUtil { return (spans.length > 0) ? Uri.parse(spans[0].getURL()) : null; } - public static void startURL(Activity activity, Uri uri) { + public static void startURL(AppCompatActivity activity, Uri uri) { CustomTabsIntent.Builder customTabsIntent = new CustomTabsIntent.Builder(); customTabsIntent.setShowTitle(true); customTabsIntent.setToolbarColor(ContextCompat.getColor(activity, R.color.colorPrimary)); customTabsIntent.build().launchUrl(activity, uri); } - public static void startURL(Activity activity, String url) { + public static void startURL(AppCompatActivity activity, String url) { startURL(activity, parseURL(url)); } @AnyThread public static void showMessage(final @NonNull Context context, final CharSequence message) { - XposedApp.runOnUiThread(() -> new AlertDialog.Builder(context) + XposedApp.runOnUiThread(() -> new MaterialAlertDialogBuilder(context) .setMessage(message) .setPositiveButton(android.R.string.ok, null) .show()); diff --git a/app/src/main/java/org/meowcat/edxposed/manager/util/chrome/CustomTabsURLSpan.java b/app/src/main/java/org/meowcat/edxposed/manager/util/chrome/CustomTabsURLSpan.java index cd75146c..c0b66544 100644 --- a/app/src/main/java/org/meowcat/edxposed/manager/util/chrome/CustomTabsURLSpan.java +++ b/app/src/main/java/org/meowcat/edxposed/manager/util/chrome/CustomTabsURLSpan.java @@ -1,9 +1,10 @@ package org.meowcat.edxposed.manager.util.chrome; -import android.app.Activity; import android.text.style.URLSpan; import android.view.View; +import androidx.appcompat.app.AppCompatActivity; + import org.meowcat.edxposed.manager.util.NavUtil; /** @@ -11,9 +12,9 @@ import org.meowcat.edxposed.manager.util.NavUtil; */ public class CustomTabsURLSpan extends URLSpan { - private Activity activity; + private AppCompatActivity activity; - CustomTabsURLSpan(Activity activity, String url) { + CustomTabsURLSpan(AppCompatActivity activity, String url) { super(url); this.activity = activity; } diff --git a/app/src/main/java/org/meowcat/edxposed/manager/util/chrome/LinkTransformationMethod.java b/app/src/main/java/org/meowcat/edxposed/manager/util/chrome/LinkTransformationMethod.java index 40eea65c..7e37722f 100644 --- a/app/src/main/java/org/meowcat/edxposed/manager/util/chrome/LinkTransformationMethod.java +++ b/app/src/main/java/org/meowcat/edxposed/manager/util/chrome/LinkTransformationMethod.java @@ -1,6 +1,5 @@ package org.meowcat.edxposed.manager.util.chrome; -import android.app.Activity; import android.graphics.Rect; import android.text.Spannable; import android.text.Spanned; @@ -10,14 +9,16 @@ import android.text.util.Linkify; import android.view.View; import android.widget.TextView; +import androidx.appcompat.app.AppCompatActivity; + /** * Created by Nikola D. on 12/23/2015. */ public class LinkTransformationMethod implements TransformationMethod { - private Activity activity; + private AppCompatActivity activity; - public LinkTransformationMethod(Activity activity) { + public LinkTransformationMethod(AppCompatActivity activity) { this.activity = activity; } diff --git a/app/src/main/java/org/meowcat/edxposed/manager/util/json/XposedZip.java b/app/src/main/java/org/meowcat/edxposed/manager/util/json/XposedZip.java index b9f68967..c534b65d 100644 --- a/app/src/main/java/org/meowcat/edxposed/manager/util/json/XposedZip.java +++ b/app/src/main/java/org/meowcat/edxposed/manager/util/json/XposedZip.java @@ -1,6 +1,5 @@ package org.meowcat.edxposed.manager.util.json; -import android.app.Activity; import android.content.Context; import android.view.LayoutInflater; import android.view.View; @@ -10,6 +9,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; import java.util.List; @@ -46,7 +46,7 @@ public class XposedZip { View row; ItemHolder holder = new ItemHolder(); - LayoutInflater inflater = ((Activity) context).getLayoutInflater(); + LayoutInflater inflater = ((AppCompatActivity) context).getLayoutInflater(); row = inflater.inflate(android.R.layout.simple_dropdown_item_1line, parent, false); holder.name = row.findViewById(android.R.id.text1); diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml index 00d34508..4ee46d25 100644 --- a/app/src/main/res/layout/activity_about.xml +++ b/app/src/main/res/layout/activity_about.xml @@ -41,7 +41,7 @@ android:adjustViewBounds="true" android:contentDescription="@string/app_name" android:scaleType="centerCrop" - android:src="@drawable/ic_launcher_foreground" /> + app:srcCompat="@drawable/ic_launcher_foreground" /> + app:srcCompat="@drawable/ic_info" /> + app:srcCompat="@drawable/ic_history" /> + app:srcCompat="@drawable/ic_description" /> + app:srcCompat="@drawable/ic_language" /> + app:srcCompat="@drawable/ic_modules" /> + app:srcCompat="@drawable/ic_help" /> + app:srcCompat="@drawable/ic_help" /> + app:srcCompat="@drawable/ic_github" /> + app:srcCompat="@drawable/ic_donate" /> + app:srcCompat="@drawable/ic_bug" /> + app:srcCompat="@drawable/ic_info" /> + app:srcCompat="@drawable/ic_help" /> + app:srcCompat="@drawable/ic_launcher_foreground" /> @@ -76,8 +76,8 @@ android:layout_height="28dp" android:layout_centerVertical="true" android:contentDescription="@string/Activated" - android:src="@drawable/ic_check_circle" - android:tint="@android:color/white" /> + android:tint="@android:color/white" + app:srcCompat="@drawable/ic_check_circle" /> + app:srcCompat="@drawable/ic_apps" /> + app:srcCompat="@drawable/ic_get_app" /> + app:srcCompat="@drawable/outline_list_24" /> + app:srcCompat="@drawable/ic_assignment" /> + app:srcCompat="@drawable/ic_settings" /> + app:srcCompat="@drawable/ic_info" /> diff --git a/app/src/main/res/layout/item_version.xml b/app/src/main/res/layout/item_version.xml index e79ec0bc..b33d32df 100644 --- a/app/src/main/res/layout/item_version.xml +++ b/app/src/main/res/layout/item_version.xml @@ -1,7 +1,7 @@