├── .gitattributes
├── logo.ai
├── logo.png
├── NOTICE.txt
├── tools
├── signapk.jar
├── testkey.pk8
├── sign.bat
└── testkey.x509.pem
├── .gitignore
├── logo_transparent.png
├── assets
├── XposedBridge.jar
├── arm
│ ├── busybox-xposed
│ ├── app_process_xposed_sdk15
│ └── app_process_xposed_sdk16
├── x86
│ ├── busybox-xposed
│ ├── app_process_xposed_sdk15
│ └── app_process_xposed_sdk16
├── Xposed-Disabler-Recovery.zip
└── Xposed-Installer-Recovery.zip
├── lib
└── AndroidHiddenAPI.jar
├── libs
├── android-support-v13.jar
├── libsuperuser-185868.jar
└── StickyListHeaders-d7f6fc.jar
├── res
├── drawable-hdpi
│ ├── ic_launcher.png
│ ├── ic_menu_refresh.png
│ └── ic_notification.png
├── drawable-ldpi
│ ├── ic_launcher.png
│ ├── ic_menu_refresh.png
│ └── ic_notification.png
├── drawable-mdpi
│ ├── ic_launcher.png
│ ├── ic_menu_refresh.png
│ └── ic_notification.png
├── drawable-xhdpi
│ ├── ic_launcher.png
│ ├── ic_menu_refresh.png
│ └── ic_notification.png
├── drawable-xxhdpi
│ ├── ic_launcher.png
│ ├── ic_menu_refresh.png
│ └── ic_notification.png
├── anim
│ ├── slide_in_left.xml
│ ├── slide_in_right.xml
│ ├── slide_out_right.xml
│ └── slide_out_left.xml
├── menu
│ ├── menu_download_details.xml
│ ├── menu_logs.xml
│ ├── context_menu_modules.xml
│ └── menu_download.xml
├── drawable
│ ├── background_card_light.xml
│ ├── background_card_black.xml
│ ├── background_card_dark.xml
│ ├── background_card_normal_dark.xml
│ ├── background_card_normal_light.xml
│ ├── background_card_normal_black.xml
│ ├── background_card_pressed_light.xml
│ ├── background_card_pressed_dark.xml
│ └── background_card_pressed_black.xml
├── values
│ ├── attrs.xml
│ ├── donottranslate.xml
│ ├── colors.xml
│ ├── styles.xml
│ └── arrays.xml
├── layout
│ ├── xposed_not_active_note.xml
│ ├── list_sticky_header_download.xml
│ ├── tab_logs.xml
│ ├── tab_downloader.xml
│ ├── dialog_install_warning.xml
│ ├── download_moreinfo.xml
│ ├── activity_welcome.xml
│ ├── activity_download_details_not_found.xml
│ ├── activity_download_details.xml
│ ├── list_item_download.xml
│ ├── download_details.xml
│ ├── download_view.xml
│ ├── list_item_welcome.xml
│ ├── list_item_module.xml
│ ├── list_item_version.xml
│ ├── tab_about.xml
│ └── tab_installer.xml
├── xml
│ ├── module_prefs.xml
│ └── prefs.xml
├── values-id
│ └── strings.xml
├── values-ar
│ └── strings.xml
├── values-gl
│ └── strings.xml
├── values-ko
│ └── strings.xml
├── values-az
│ └── strings.xml
└── values-sv
│ └── strings.xml
├── .settings
└── org.eclipse.jdt.ui.prefs
├── src
└── de
│ └── robv
│ └── android
│ └── xposed
│ └── installer
│ ├── repo
│ ├── Repository.java
│ ├── ModuleVersion.java
│ ├── Module.java
│ ├── ReleaseType.java
│ └── RepoParser.java
│ ├── widget
│ ├── ListPreferenceSummaryFix.java
│ ├── IntegerListPreference.java
│ └── DownloadView.java
│ ├── DownloadReceiver.java
│ ├── XposedBaseActivity.java
│ ├── util
│ ├── ThemeUtil.java
│ ├── HashUtil.java
│ ├── NavUtil.java
│ ├── RootUtil.java
│ ├── PrefixedSharedPreferences.java
│ ├── AssetUtil.java
│ └── NotificationUtil.java
│ ├── DownloadDetailsSettingsFragment.java
│ ├── XposedInstallerActivity.java
│ ├── AboutFragment.java
│ ├── PackageChangeReceiver.java
│ ├── DownloadDetailsFragment.java
│ ├── SettingsFragment.java
│ ├── XposedDropdownNavActivity.java
│ ├── XposedApp.java
│ ├── WelcomeActivity.java
│ ├── DownloadDetailsActivity.java
│ └── LogsFragment.java
├── lint.xml
├── .classpath
├── project.properties
├── proguard-project.txt
├── .project
└── AndroidManifest.xml
/.gitattributes:
--------------------------------------------------------------------------------
1 | *.sh eol=lf
2 | *.java text
3 | *.xml text
4 | *.ai binary
5 |
--------------------------------------------------------------------------------
/logo.ai:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/logo.ai
--------------------------------------------------------------------------------
/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/logo.png
--------------------------------------------------------------------------------
/NOTICE.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/NOTICE.txt
--------------------------------------------------------------------------------
/tools/signapk.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/tools/signapk.jar
--------------------------------------------------------------------------------
/tools/testkey.pk8:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/tools/testkey.pk8
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea/
2 | bin/
3 | gen/
4 | out/
5 | *.apk
6 | *.iml
7 | proguard/
8 | proguard_logs/
9 |
--------------------------------------------------------------------------------
/logo_transparent.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/logo_transparent.png
--------------------------------------------------------------------------------
/assets/XposedBridge.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/assets/XposedBridge.jar
--------------------------------------------------------------------------------
/assets/arm/busybox-xposed:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/assets/arm/busybox-xposed
--------------------------------------------------------------------------------
/assets/x86/busybox-xposed:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/assets/x86/busybox-xposed
--------------------------------------------------------------------------------
/lib/AndroidHiddenAPI.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/lib/AndroidHiddenAPI.jar
--------------------------------------------------------------------------------
/libs/android-support-v13.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/libs/android-support-v13.jar
--------------------------------------------------------------------------------
/libs/libsuperuser-185868.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/libs/libsuperuser-185868.jar
--------------------------------------------------------------------------------
/libs/StickyListHeaders-d7f6fc.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/libs/StickyListHeaders-d7f6fc.jar
--------------------------------------------------------------------------------
/res/drawable-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/res/drawable-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/res/drawable-ldpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/res/drawable-ldpi/ic_launcher.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/res/drawable-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/assets/Xposed-Disabler-Recovery.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/assets/Xposed-Disabler-Recovery.zip
--------------------------------------------------------------------------------
/assets/arm/app_process_xposed_sdk15:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/assets/arm/app_process_xposed_sdk15
--------------------------------------------------------------------------------
/assets/arm/app_process_xposed_sdk16:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/assets/arm/app_process_xposed_sdk16
--------------------------------------------------------------------------------
/assets/x86/app_process_xposed_sdk15:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/assets/x86/app_process_xposed_sdk15
--------------------------------------------------------------------------------
/assets/x86/app_process_xposed_sdk16:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/assets/x86/app_process_xposed_sdk16
--------------------------------------------------------------------------------
/res/drawable-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/res/drawable-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/res/drawable-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/res/drawable-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/.settings/org.eclipse.jdt.ui.prefs:
--------------------------------------------------------------------------------
1 | eclipse.preferences.version=1
2 | formatter_profile=_Xposed
3 | formatter_settings_version=12
4 |
--------------------------------------------------------------------------------
/assets/Xposed-Installer-Recovery.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/assets/Xposed-Installer-Recovery.zip
--------------------------------------------------------------------------------
/res/drawable-hdpi/ic_menu_refresh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/res/drawable-hdpi/ic_menu_refresh.png
--------------------------------------------------------------------------------
/res/drawable-hdpi/ic_notification.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/res/drawable-hdpi/ic_notification.png
--------------------------------------------------------------------------------
/res/drawable-ldpi/ic_menu_refresh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/res/drawable-ldpi/ic_menu_refresh.png
--------------------------------------------------------------------------------
/res/drawable-ldpi/ic_notification.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/res/drawable-ldpi/ic_notification.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/ic_menu_refresh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/res/drawable-mdpi/ic_menu_refresh.png
--------------------------------------------------------------------------------
/res/drawable-mdpi/ic_notification.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/res/drawable-mdpi/ic_notification.png
--------------------------------------------------------------------------------
/res/drawable-xhdpi/ic_menu_refresh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/res/drawable-xhdpi/ic_menu_refresh.png
--------------------------------------------------------------------------------
/res/drawable-xhdpi/ic_notification.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/res/drawable-xhdpi/ic_notification.png
--------------------------------------------------------------------------------
/res/drawable-xxhdpi/ic_menu_refresh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/res/drawable-xxhdpi/ic_menu_refresh.png
--------------------------------------------------------------------------------
/res/drawable-xxhdpi/ic_notification.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BioHaZard1/XposedInstaller/HEAD/res/drawable-xxhdpi/ic_notification.png
--------------------------------------------------------------------------------
/res/anim/slide_in_left.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
8 |
9 |
--------------------------------------------------------------------------------
/res/anim/slide_in_right.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
8 |
9 |
--------------------------------------------------------------------------------
/res/anim/slide_out_right.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
8 |
9 |
--------------------------------------------------------------------------------
/res/anim/slide_out_left.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
8 |
9 |
--------------------------------------------------------------------------------
/src/de/robv/android/xposed/installer/repo/Repository.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.repo;
2 |
3 |
4 | public class Repository {
5 | public String name;
6 | public String url;
7 | public boolean isPartial = false;
8 | public String partialUrl;
9 | public String version;
10 |
11 | /*package*/ Repository() {};
12 | }
13 |
--------------------------------------------------------------------------------
/lint.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/res/menu/menu_download_details.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/res/drawable/background_card_light.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 |
7 |
--------------------------------------------------------------------------------
/res/drawable/background_card_black.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 |
7 |
8 |
--------------------------------------------------------------------------------
/res/drawable/background_card_dark.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 |
7 |
8 |
--------------------------------------------------------------------------------
/res/values/attrs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/res/layout/xposed_not_active_note.xml:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/res/xml/module_prefs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 |
12 |
--------------------------------------------------------------------------------
/src/de/robv/android/xposed/installer/repo/ModuleVersion.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.repo;
2 |
3 |
4 | public class ModuleVersion {
5 | public final Module module;
6 | public String name;
7 | public int code;
8 | public String downloadLink;
9 | public String md5sum;
10 | public String changelog;
11 | public boolean changelogIsHtml = false;
12 | public ReleaseType relType = ReleaseType.STABLE;
13 | public long uploaded = -1;
14 |
15 | /*package*/ ModuleVersion(Module module) {
16 | this.module = module;
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/.classpath:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/project.properties:
--------------------------------------------------------------------------------
1 | # This file is automatically generated by Android Tools.
2 | # Do not modify this file -- YOUR CHANGES WILL BE ERASED!
3 | #
4 | # This file must be checked in Version Control Systems.
5 | #
6 | # To customize properties used by the Ant build system edit
7 | # "ant.properties", and override values to adapt the script to your
8 | # project structure.
9 | #
10 | # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
11 | proguard.config=proguard-project.txt
12 |
13 | # Project target.
14 | target=android-15
15 |
--------------------------------------------------------------------------------
/src/de/robv/android/xposed/installer/widget/ListPreferenceSummaryFix.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.widget;
2 |
3 | import android.content.Context;
4 | import android.preference.ListPreference;
5 | import android.util.AttributeSet;
6 |
7 | public class ListPreferenceSummaryFix extends ListPreference {
8 | public ListPreferenceSummaryFix(Context context) {
9 | super(context);
10 | }
11 |
12 | public ListPreferenceSummaryFix(Context context, AttributeSet attrs) {
13 | super(context, attrs);
14 | }
15 |
16 | @Override
17 | public void setValue(String value) {
18 | super.setValue(value);
19 | notifyChanged();
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/tools/sign.bat:
--------------------------------------------------------------------------------
1 | @ECHO OFF
2 |
3 | cd /d %~dp0
4 | cd ..
5 |
6 | echo Signing Xposed-Disabler-Recovery.zip
7 | java -jar tools\SignApk.jar -w tools\testkey.x509.pem tools\testkey.pk8 assets\Xposed-Disabler-Recovery.zip assets\Xposed-Disabler-Recovery.zip_signed
8 | move assets\Xposed-Disabler-Recovery.zip_signed assets\Xposed-Disabler-Recovery.zip
9 |
10 | echo Signing Xposed-Installer-Recovery.zip
11 | java -jar tools\SignApk.jar -w tools\testkey.x509.pem tools\testkey.pk8 assets\Xposed-Installer-Recovery.zip assets\Xposed-Installer-Recovery.zip_signed
12 | move assets\Xposed-Installer-Recovery.zip_signed assets\Xposed-Installer-Recovery.zip
13 |
14 | pause
15 |
--------------------------------------------------------------------------------
/res/values/donottranslate.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Xposed Installer
5 | app_process
6 | XposedBridge.jar
7 | ---
8 | https://github.com/rovo89
9 | http://forum.xda-developers.com/xposed
10 | StickyListHeaders\nlibsuperuser
11 |
12 |
--------------------------------------------------------------------------------
/res/layout/list_sticky_header_download.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
15 |
16 |
--------------------------------------------------------------------------------
/res/layout/tab_logs.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
12 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/src/de/robv/android/xposed/installer/DownloadReceiver.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer;
2 |
3 | import android.app.DownloadManager;
4 | import android.content.BroadcastReceiver;
5 | import android.content.Context;
6 | import android.content.Intent;
7 | import de.robv.android.xposed.installer.util.DownloadsUtil;
8 |
9 | public class DownloadReceiver extends BroadcastReceiver {
10 | @Override
11 | public void onReceive(final Context context, final Intent intent) {
12 | String action = intent.getAction();
13 | if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
14 | long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);
15 | DownloadsUtil.triggerDownloadFinishedCallback(context, downloadId);
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/res/menu/menu_logs.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/res/menu/context_menu_modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/res/menu/menu_download.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/res/layout/tab_downloader.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/src/de/robv/android/xposed/installer/repo/Module.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.repo;
2 |
3 | import java.util.ArrayList;
4 | import java.util.LinkedList;
5 | import java.util.List;
6 |
7 | import android.util.Pair;
8 |
9 | public class Module {
10 | public final Repository repository;
11 | public String packageName;
12 | public String name;
13 | public String summary;
14 | public String description;
15 | public boolean descriptionIsHtml = false;
16 | public String author;
17 | public String support;
18 | public final List> moreInfo = new LinkedList>();
19 | public final List versions = new ArrayList();
20 | public final List screenshots = new ArrayList();
21 | public long created = -1;
22 | public long updated = -1;
23 |
24 | /*package*/ Module(Repository repository) {
25 | this.repository = repository;
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/res/drawable/background_card_normal_dark.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | -
6 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | -
17 |
19 |
20 |
21 |
22 |
23 |
24 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/res/drawable/background_card_normal_light.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | -
6 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | -
17 |
19 |
20 |
21 |
22 |
23 |
24 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/res/layout/dialog_install_warning.xml:
--------------------------------------------------------------------------------
1 |
5 |
6 |
10 |
11 |
17 |
18 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/src/de/robv/android/xposed/installer/XposedBaseActivity.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer;
2 |
3 | import android.app.Activity;
4 | import android.os.Bundle;
5 | import de.robv.android.xposed.installer.util.NavUtil;
6 | import de.robv.android.xposed.installer.util.ThemeUtil;
7 |
8 | public abstract class XposedBaseActivity extends Activity {
9 | public boolean leftActivityWithSlideAnim = false;
10 | public int mTheme = -1;
11 |
12 | @Override
13 | protected void onCreate(Bundle savedInstanceBundle) {
14 | super.onCreate(savedInstanceBundle);
15 | ThemeUtil.setTheme(this);
16 | }
17 |
18 | @Override
19 | protected void onResume() {
20 | super.onResume();
21 | ThemeUtil.reloadTheme(this);
22 |
23 | if (leftActivityWithSlideAnim)
24 | NavUtil.setTransitionSlideLeave(this);
25 | leftActivityWithSlideAnim = false;
26 | }
27 |
28 | public void setLeftWithSlideAnim(boolean newValue) {
29 | this.leftActivityWithSlideAnim = newValue;
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/res/drawable/background_card_normal_black.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | -
6 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | -
17 |
19 |
20 |
21 |
22 |
23 |
24 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/res/layout/download_moreinfo.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
17 |
18 |
23 |
24 |
--------------------------------------------------------------------------------
/res/layout/activity_welcome.xml:
--------------------------------------------------------------------------------
1 |
8 |
9 |
16 |
17 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/res/layout/activity_download_details_not_found.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
18 |
19 |
24 |
25 |
--------------------------------------------------------------------------------
/res/drawable/background_card_pressed_light.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | -
6 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | -
17 |
19 |
20 |
21 |
22 |
23 |
24 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/res/drawable/background_card_pressed_dark.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | -
6 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | -
17 |
19 |
20 |
21 |
22 |
23 |
24 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/res/drawable/background_card_pressed_black.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | -
6 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | -
17 |
19 |
20 |
21 |
22 |
23 |
24 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/proguard-project.txt:
--------------------------------------------------------------------------------
1 | -dontobfuscate
2 |
3 | # These are mostly picked from proguard-android-optimize.txt
4 | -optimizations !code/allocation/variable,!code/simplification/cast,!field/*,!class/merging/*
5 | -optimizationpasses 5
6 | -allowaccessmodification
7 | -dontpreverify
8 |
9 | -dontusemixedcaseclassnames
10 | -dontskipnonpubliclibraryclasses
11 | -verbose
12 |
13 | # For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
14 | -keepclassmembers enum * {
15 | public static **[] values();
16 | public static ** valueOf(java.lang.String);
17 | }
18 |
19 | -keepclassmembers class **.R$* {
20 | public static ;
21 | }
22 |
23 | # The support library contains references to newer platform versions.
24 | # Don't warn about those in case this app is linking against an older
25 | # platform version. We know about them, and they are safe.
26 | -dontwarn android.support.**
27 |
28 | # These are ok as well
29 | -dontwarn android.os.FileUtils
30 | -dontwarn com.emilsjolander.components.stickylistheaders.**
31 |
--------------------------------------------------------------------------------
/.project:
--------------------------------------------------------------------------------
1 |
2 |
3 | XposedInstaller
4 |
5 |
6 |
7 |
8 |
9 | com.android.ide.eclipse.adt.ResourceManagerBuilder
10 |
11 |
12 |
13 |
14 | com.android.ide.eclipse.adt.PreCompilerBuilder
15 |
16 |
17 |
18 |
19 | org.eclipse.jdt.core.javabuilder
20 |
21 |
22 |
23 |
24 | com.android.ide.eclipse.adt.ApkBuilder
25 |
26 |
27 |
28 |
29 |
30 | com.android.ide.eclipse.adt.AndroidNature
31 | org.eclipse.jdt.core.javanature
32 |
33 |
34 |
35 | src/NOTICE.txt
36 | 1
37 | PROJECT_LOC/NOTICE.txt
38 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/src/de/robv/android/xposed/installer/repo/ReleaseType.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.repo;
2 |
3 | import de.robv.android.xposed.installer.R;
4 |
5 | public enum ReleaseType {
6 | STABLE (R.string.reltype_stable, R.string.reltype_stable_summary),
7 | BETA (R.string.reltype_beta, R.string.reltype_beta_summary),
8 | EXPERIMENTAL (R.string.reltype_experimental, R.string.reltype_experimental_summary);
9 |
10 | private static final ReleaseType[] sValuesCache = values();
11 |
12 | public static ReleaseType fromString(String value) {
13 | if (value == null || value.equals("stable"))
14 | return STABLE;
15 | else if (value.equals("beta"))
16 | return BETA;
17 | else if (value.equals("experimental"))
18 | return EXPERIMENTAL;
19 | else
20 | return STABLE;
21 | }
22 |
23 | public static ReleaseType fromOrdinal(int ordinal) {
24 | return sValuesCache[ordinal];
25 | }
26 |
27 | private final int mTitleId;
28 | private final int mSummaryId;
29 |
30 | private ReleaseType(int titleId, int summaryId) {
31 | mTitleId = titleId;
32 | mSummaryId = summaryId;
33 | }
34 |
35 | public int getTitleId() {
36 | return mTitleId;
37 | }
38 |
39 | public int getSummaryId() {
40 | return mSummaryId;
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/src/de/robv/android/xposed/installer/util/ThemeUtil.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.util;
2 |
3 | import android.content.Context;
4 | import android.content.res.Resources.Theme;
5 | import android.content.res.TypedArray;
6 | import de.robv.android.xposed.installer.R;
7 | import de.robv.android.xposed.installer.XposedApp;
8 | import de.robv.android.xposed.installer.XposedBaseActivity;
9 |
10 | public final class ThemeUtil {
11 | private ThemeUtil() {};
12 |
13 | private static int[] THEMES = new int[] {
14 | R.style.Theme_Light,
15 | R.style.Theme_Dark,
16 | R.style.Theme_Dark_Black,
17 | };
18 |
19 | public static int getSelectTheme() {
20 | int theme = XposedApp.getPreferences().getInt("theme", 0);
21 | return (theme >= 0 && theme < THEMES.length) ? theme : 0;
22 | }
23 |
24 | public static void setTheme(XposedBaseActivity activity) {
25 | activity.mTheme = getSelectTheme();
26 | activity.setTheme(THEMES[activity.mTheme]);
27 | }
28 |
29 | public static void reloadTheme(XposedBaseActivity activity) {
30 | int theme = getSelectTheme();
31 | if (theme != activity.mTheme)
32 | activity.recreate();
33 | }
34 |
35 | public static int getThemeColor(Context context, int id) {
36 | Theme theme = context.getTheme();
37 | TypedArray a = theme.obtainStyledAttributes(new int[] {id});
38 | int result = a.getColor(0, 0);
39 | a.recycle();
40 | return result;
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/res/layout/activity_download_details.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
13 |
14 |
21 |
22 |
23 |
35 |
36 |
--------------------------------------------------------------------------------
/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | @android:color/holo_blue_light
4 | @android:color/holo_red_light
5 | @android:color/holo_red_dark
6 | #fff
7 | #777
8 | @color/darker_green
9 | @color/download_status_update_available
10 | @color/download_status_update_available
11 | #ff22aa00
12 |
13 |
14 | #e5e5e5
15 | #fff
16 | #dfdfdf
17 | #dbdbdb
18 | #222
19 |
20 |
21 | #363636
22 | #505050
23 | #161616
24 | #222
25 |
26 |
27 | #000000
28 | #181818
29 | #303030
30 | #121212
31 |
32 |
--------------------------------------------------------------------------------
/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
15 |
16 |
25 |
26 |
32 |
33 |
--------------------------------------------------------------------------------
/src/de/robv/android/xposed/installer/DownloadDetailsSettingsFragment.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer;
2 |
3 | import android.app.Activity;
4 | import android.os.Bundle;
5 | import android.preference.Preference;
6 | import android.preference.Preference.OnPreferenceChangeListener;
7 | import android.preference.PreferenceFragment;
8 | import android.preference.PreferenceManager;
9 | import de.robv.android.xposed.installer.repo.Module;
10 | import de.robv.android.xposed.installer.util.PrefixedSharedPreferences;
11 | import de.robv.android.xposed.installer.util.RepoLoader;
12 |
13 | public class DownloadDetailsSettingsFragment extends PreferenceFragment {
14 | private DownloadDetailsActivity mActivity;
15 |
16 | @Override
17 | public void onAttach(Activity activity) {
18 | super.onAttach(activity);
19 | mActivity = (DownloadDetailsActivity) activity;
20 | }
21 |
22 | @Override
23 | public void onCreate(Bundle savedInstanceState) {
24 | super.onCreate(savedInstanceState);
25 |
26 | final Module module = mActivity.getModule();
27 | if (module == null)
28 | return;
29 |
30 | final String packageName = module.packageName;
31 |
32 | PreferenceManager prefManager = getPreferenceManager();
33 | prefManager.setSharedPreferencesName("module_settings");
34 | PrefixedSharedPreferences.injectToPreferenceManager(prefManager, module.packageName);
35 | addPreferencesFromResource(R.xml.module_prefs);
36 |
37 | findPreference("release_type").setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
38 | @Override
39 | public boolean onPreferenceChange(Preference preference, Object newValue) {
40 | RepoLoader.getInstance().setReleaseTypeLocal(packageName, (String) newValue);
41 | return true;
42 | }
43 | });
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/res/layout/list_item_download.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
13 |
14 |
22 |
23 |
31 |
32 |
40 |
41 |
--------------------------------------------------------------------------------
/tools/testkey.x509.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE-----
2 | MIIEqDCCA5CgAwIBAgIJAJNurL4H8gHfMA0GCSqGSIb3DQEBBQUAMIGUMQswCQYD
3 | VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4g
4 | VmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UE
5 | AxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAe
6 | Fw0wODAyMjkwMTMzNDZaFw0zNTA3MTcwMTMzNDZaMIGUMQswCQYDVQQGEwJVUzET
7 | MBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4G
8 | A1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9p
9 | ZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZI
10 | hvcNAQEBBQADggENADCCAQgCggEBANaTGQTexgskse3HYuDZ2CU+Ps1s6x3i/waM
11 | qOi8qM1r03hupwqnbOYOuw+ZNVn/2T53qUPn6D1LZLjk/qLT5lbx4meoG7+yMLV4
12 | wgRDvkxyGLhG9SEVhvA4oU6Jwr44f46+z4/Kw9oe4zDJ6pPQp8PcSvNQIg1QCAcy
13 | 4ICXF+5qBTNZ5qaU7Cyz8oSgpGbIepTYOzEJOmc3Li9kEsBubULxWBjf/gOBzAzU
14 | RNps3cO4JFgZSAGzJWQTT7/emMkod0jb9WdqVA2BVMi7yge54kdVMxHEa5r3b97s
15 | zI5p58ii0I54JiCUP5lyfTwE/nKZHZnfm644oLIXf6MdW2r+6R8CAQOjgfwwgfkw
16 | HQYDVR0OBBYEFEhZAFY9JyxGrhGGBaR0GawJyowRMIHJBgNVHSMEgcEwgb6AFEhZ
17 | AFY9JyxGrhGGBaR0GawJyowRoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UE
18 | CBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMH
19 | QW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAG
20 | CSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJAJNurL4H8gHfMAwGA1Ud
21 | EwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHqvlozrUMRBBVEY0NqrrwFbinZa
22 | J6cVosK0TyIUFf/azgMJWr+kLfcHCHJsIGnlw27drgQAvilFLAhLwn62oX6snb4Y
23 | LCBOsVMR9FXYJLZW2+TcIkCRLXWG/oiVHQGo/rWuWkJgU134NDEFJCJGjDbiLCpe
24 | +ZTWHdcwauTJ9pUbo8EvHRkU3cYfGmLaLfgn9gP+pWA7LFQNvXwBnDa6sppCccEX
25 | 31I828XzgXpJ4O+mDL1/dBd+ek8ZPUP0IgdyZm5MTYPhvVqGCHzzTy3sIeJFymwr
26 | sBbmg2OAUNLEMO6nwmocSdN2ClirfxqCzJOLSDE4QyS9BAH6EhY6UFcOaE0=
27 | -----END CERTIFICATE-----
28 |
--------------------------------------------------------------------------------
/src/de/robv/android/xposed/installer/widget/IntegerListPreference.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.widget;
2 |
3 | import android.content.Context;
4 | import android.content.SharedPreferences;
5 | import android.preference.ListPreference;
6 | import android.util.AttributeSet;
7 |
8 | public class IntegerListPreference extends ListPreference {
9 | public IntegerListPreference(Context context) {
10 | super(context);
11 | }
12 |
13 | public IntegerListPreference(Context context, AttributeSet attrs) {
14 | super(context, attrs);
15 | }
16 |
17 | @Override
18 | public void setValue(String value) {
19 | super.setValue(value);
20 | notifyChanged();
21 | }
22 |
23 | @Override
24 | protected boolean persistString(String value) {
25 | if (value == null)
26 | return false;
27 |
28 | return persistInt(getIntValue(value));
29 | }
30 |
31 | @Override
32 | protected String getPersistedString(String defaultReturnValue) {
33 | SharedPreferences pref = getPreferenceManager().getSharedPreferences();
34 | String key = getKey();
35 | if (!shouldPersist() || !pref.contains(key))
36 | return defaultReturnValue;
37 |
38 | return String.valueOf(pref.getInt(key, 0));
39 | }
40 |
41 | @Override
42 | public int findIndexOfValue(String value) {
43 | CharSequence[] entryValues = getEntryValues();
44 | int intValue = getIntValue(value);
45 | if (value != null && entryValues != null) {
46 | for (int i = entryValues.length - 1; i >= 0; i--) {
47 | if (getIntValue(entryValues[i].toString()) == intValue) {
48 | return i;
49 | }
50 | }
51 | }
52 | return -1;
53 | }
54 |
55 | public static int getIntValue(String value) {
56 | if (value == null)
57 | return 0;
58 |
59 | return (int)((value.startsWith("0x"))
60 | ? Long.parseLong(value.substring(2), 16)
61 | : Long.parseLong(value));
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/res/layout/download_details.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
14 |
15 |
21 |
22 |
29 |
30 |
35 |
36 |
42 |
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/src/de/robv/android/xposed/installer/XposedInstallerActivity.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer;
2 |
3 | import java.util.HashMap;
4 |
5 | import android.content.Intent;
6 | import android.os.Bundle;
7 |
8 | public class XposedInstallerActivity extends XposedDropdownNavActivity {
9 | public static final String EXTRA_SECTION = "section";
10 | public static final String EXTRA_SECTION_LEGACY = "opentab";
11 |
12 | private static final HashMap TABS;
13 | static {
14 | TABS = new HashMap(TAB_COUNT, 1);
15 | TABS.put("install", TAB_INSTALL);
16 | TABS.put("modules", TAB_MODULES);
17 | TABS.put("download", TAB_DOWNLOAD);
18 | TABS.put("logs", TAB_LOGS);
19 | TABS.put("settings", TAB_SETTINGS);
20 | TABS.put("about", TAB_ABOUT);
21 | }
22 |
23 | @Override
24 | public void onCreate(Bundle savedInstanceState) {
25 | super.onCreate(savedInstanceState);
26 | selectInitialTab(getIntent(), savedInstanceState);
27 | }
28 |
29 | @Override
30 | protected void onSaveInstanceState(Bundle outState) {
31 | super.onSaveInstanceState(outState);
32 | outState.putInt("section", getActionBar().getSelectedNavigationIndex());
33 | }
34 |
35 | private void selectInitialTab(Intent intent, Bundle savedInstanceState) {
36 | int selectTabIndex = -1;
37 |
38 | Bundle extras = intent.getExtras();
39 | if (extras != null) {
40 | Object section = extras.get(EXTRA_SECTION);
41 | if (section == null)
42 | section = extras.get(EXTRA_SECTION_LEGACY);
43 |
44 | if (section instanceof Integer) {
45 | selectTabIndex = (Integer) section;
46 | } else if (section instanceof String && TABS.containsKey(section)) {
47 | selectTabIndex = TABS.get(section);
48 | }
49 | }
50 |
51 | if (selectTabIndex == -1 && savedInstanceState != null)
52 | selectTabIndex = savedInstanceState.getInt("section", -1);
53 |
54 | if (selectTabIndex >= 0 && selectTabIndex < TAB_COUNT)
55 | getActionBar().setSelectedNavigationItem(selectTabIndex);
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/src/de/robv/android/xposed/installer/util/HashUtil.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.util;
2 |
3 | import java.io.File;
4 | import java.io.FileInputStream;
5 | import java.io.IOException;
6 | import java.io.InputStream;
7 | import java.security.MessageDigest;
8 | import java.security.NoSuchAlgorithmException;
9 |
10 | public class HashUtil {
11 | public static final String hash(String input, String algorithm) {
12 | try {
13 | MessageDigest md = MessageDigest.getInstance(algorithm);
14 | byte[] messageDigest = md.digest(input.getBytes());
15 | return toHexString(messageDigest);
16 | } catch (NoSuchAlgorithmException e) {
17 | throw new IllegalArgumentException(e);
18 | }
19 | }
20 |
21 | public static final String md5(String input) {
22 | return hash(input, "MD5");
23 | }
24 |
25 | public static final String sha1(String input) {
26 | return hash(input, "SHA-1");
27 | }
28 |
29 |
30 | public static final String hash(File file, String algorithm) throws IOException {
31 | try {
32 | MessageDigest md = MessageDigest.getInstance(algorithm);
33 | InputStream is = new FileInputStream(file);
34 | byte[] buffer = new byte[8192];
35 | int read = 0;
36 | while ((read = is.read(buffer)) > 0) {
37 | md.update(buffer, 0, read);
38 | }
39 | is.close();
40 | byte[] messageDigest = md.digest();
41 | return toHexString(messageDigest);
42 | } catch (NoSuchAlgorithmException e) {
43 | throw new IllegalArgumentException(e);
44 | }
45 | }
46 |
47 | public static final String md5(File input) throws IOException {
48 | return hash(input, "MD5");
49 | }
50 |
51 | public static final String sha1(File input) throws IOException {
52 | return hash(input, "SHA-1");
53 | }
54 |
55 |
56 | private static String toHexString(byte[] bytes) {
57 | StringBuilder sb = new StringBuilder();
58 | for (byte b : bytes) {
59 | int unsignedB = b & 0xff;
60 | if (unsignedB < 0x10)
61 | sb.append("0");
62 | sb.append(Integer.toHexString(unsignedB));
63 | }
64 | return sb.toString();
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/res/layout/download_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
7 |
14 |
15 |
22 |
23 |
32 |
33 |
41 |
42 |
43 |
44 |
49 |
50 |
--------------------------------------------------------------------------------
/src/de/robv/android/xposed/installer/AboutFragment.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer;
2 |
3 | import android.app.Activity;
4 | import android.app.Fragment;
5 | import android.content.pm.PackageManager.NameNotFoundException;
6 | import android.os.Bundle;
7 | import android.text.method.LinkMovementMethod;
8 | import android.view.LayoutInflater;
9 | import android.view.View;
10 | import android.view.ViewGroup;
11 | import android.widget.TextView;
12 |
13 | public class AboutFragment extends Fragment {
14 | @Override
15 | public void onCreate(Bundle savedInstanceState) {
16 | super.onCreate(savedInstanceState);
17 | }
18 |
19 | @Override
20 | public void onActivityCreated(Bundle savedInstanceState) {
21 | super.onActivityCreated(savedInstanceState);
22 | Activity activity = getActivity();
23 | if (activity instanceof XposedDropdownNavActivity)
24 | ((XposedDropdownNavActivity) activity).setNavItem(XposedDropdownNavActivity.TAB_ABOUT);
25 | }
26 |
27 | @Override
28 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
29 | View v = inflater.inflate(R.layout.tab_about, container, false);
30 |
31 | try {
32 | String packageName = getActivity().getPackageName();
33 | String version = getActivity().getPackageManager().getPackageInfo(packageName, 0).versionName;
34 | ((TextView) v.findViewById(R.id.version)).setText(version);
35 | } catch (NameNotFoundException e) {
36 | // should not happen
37 | }
38 |
39 | ((TextView) v.findViewById(R.id.about_developers)).setMovementMethod(LinkMovementMethod.getInstance());
40 | ((TextView) v.findViewById(R.id.about_libraries)).setMovementMethod(LinkMovementMethod.getInstance());
41 |
42 | String translator = getResources().getString(R.string.translator);
43 | if (translator.isEmpty()) {
44 | v.findViewById(R.id.about_translator_label).setVisibility(View.GONE);
45 | v.findViewById(R.id.about_translator).setVisibility(View.GONE);
46 | } else {
47 | ((TextView) v.findViewById(R.id.about_translator)).setMovementMethod(LinkMovementMethod.getInstance());
48 | }
49 |
50 | return v;
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/res/values/arrays.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | - @string/download_sorting_status
5 | - @string/download_sorting_updated
6 | - @string/download_sorting_created
7 |
8 |
9 |
10 | - @string/install_mode_normal
11 | - @string/install_mode_recovery_auto
12 | - @string/install_mode_recovery_manual
13 |
14 |
15 |
16 | - 0
17 | - 1
18 | - 2
19 |
20 |
21 |
22 | - @string/settings_theme_light
23 | - @string/settings_theme_dark
24 | - @string/settings_theme_black
25 |
26 |
27 |
28 | - 0
29 | - 1
30 | - 2
31 |
32 |
33 |
34 | - @string/reltype_stable_summary
35 | - @string/reltype_beta_summary
36 | - @string/reltype_experimental_summary
37 |
38 |
39 |
40 | - stable
41 | - beta
42 | - experimental
43 |
44 |
45 |
46 | - @string/reltype_use_global_summary
47 | - @string/reltype_stable_summary
48 | - @string/reltype_beta_summary
49 | - @string/reltype_experimental_summary
50 |
51 |
52 |
53 |
54 | - stable
55 | - beta
56 | - experimental
57 |
58 |
59 |
--------------------------------------------------------------------------------
/src/de/robv/android/xposed/installer/util/NavUtil.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.util;
2 |
3 | import android.app.Activity;
4 | import android.content.ComponentName;
5 | import android.content.Context;
6 | import android.content.Intent;
7 | import android.net.Uri;
8 | import android.provider.Browser;
9 | import android.text.Spannable;
10 | import android.text.SpannableString;
11 | import android.text.style.URLSpan;
12 | import android.text.util.Linkify;
13 | import de.robv.android.xposed.installer.R;
14 | import de.robv.android.xposed.installer.XposedBaseActivity;
15 |
16 | public final class NavUtil {
17 | public static final String FINISH_ON_UP_NAVIGATION = "finish_on_up_navigation";
18 | public static final Uri EXAMPLE_URI = Uri.fromParts("http", "//example.org", null);
19 |
20 | public static void setTransitionSlideEnter(Activity activity) {
21 | activity.overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
22 |
23 | if (activity instanceof XposedBaseActivity)
24 | ((XposedBaseActivity) activity).setLeftWithSlideAnim(true);
25 | }
26 |
27 | public static void setTransitionSlideLeave(Activity activity) {
28 | activity.overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right);
29 | }
30 |
31 | public static Uri parseURL(String str) {
32 | if (str == null || str.isEmpty())
33 | return null;
34 |
35 | Spannable spannable = new SpannableString(str);
36 | Linkify.addLinks(spannable, Linkify.ALL);
37 | URLSpan spans[] = spannable.getSpans(0, spannable.length(), URLSpan.class);
38 | return (spans.length > 0) ? Uri.parse(spans[0].getURL()) : null;
39 | }
40 |
41 | public static void startURL(Context context, Uri uri) {
42 | Intent intent = new Intent(Intent.ACTION_VIEW, uri);
43 | intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName());
44 |
45 | if ("http".equals(uri.getScheme()) && "repo.xposed.info".equals(uri.getHost())) {
46 | Intent browser = new Intent(Intent.ACTION_VIEW, EXAMPLE_URI);
47 | ComponentName browserApp = browser.resolveActivity(context.getPackageManager());
48 | intent.setComponent(browserApp);
49 | }
50 |
51 | context.startActivity(intent);
52 | }
53 |
54 | public static void startURL(Context context, String url) {
55 | startURL(context, parseURL(url));
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/res/layout/list_item_welcome.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
16 |
17 |
27 |
28 |
38 |
39 |
46 |
47 |
57 |
58 |
--------------------------------------------------------------------------------
/src/de/robv/android/xposed/installer/PackageChangeReceiver.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer;
2 |
3 | import android.content.BroadcastReceiver;
4 | import android.content.Context;
5 | import android.content.Intent;
6 | import android.net.Uri;
7 | import de.robv.android.xposed.installer.util.AssetUtil;
8 | import de.robv.android.xposed.installer.util.ModuleUtil;
9 | import de.robv.android.xposed.installer.util.ModuleUtil.InstalledModule;
10 | import de.robv.android.xposed.installer.util.NotificationUtil;
11 |
12 | public class PackageChangeReceiver extends BroadcastReceiver {
13 | private final static ModuleUtil mModuleUtil = ModuleUtil.getInstance();
14 |
15 | @Override
16 | public void onReceive(final Context context, final Intent intent) {
17 | if (intent.getAction().equals(Intent.ACTION_PACKAGE_REMOVED)
18 | && intent.getBooleanExtra(Intent.EXTRA_REPLACING, false))
19 | // Ignore existing packages being removed in order to be updated
20 | return;
21 |
22 | String packageName = getPackageName(intent);
23 | if (packageName == null)
24 | return;
25 |
26 | if (intent.getAction().equals(Intent.ACTION_PACKAGE_CHANGED)) {
27 | // make sure that the change is for the complete package, not only a component
28 | String[] components = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST);
29 | if (components != null) {
30 | boolean isForPackage = false;
31 | for (String component : components) {
32 | if (packageName.equals(component)) {
33 | isForPackage = true;
34 | break;
35 | }
36 | }
37 | if (!isForPackage)
38 | return;
39 | }
40 | }
41 |
42 | if (packageName.equals(AssetUtil.STATIC_BUSYBOX_PACKAGE)) {
43 | AssetUtil.checkStaticBusyboxAvailability();
44 | AssetUtil.removeBusybox();
45 | return;
46 | }
47 |
48 | InstalledModule module = ModuleUtil.getInstance().reloadSingleModule(packageName);
49 | if (module == null || intent.getAction().equals(Intent.ACTION_PACKAGE_REMOVED)) {
50 | // Package being removed, disable it if it was a previously active Xposed mod
51 | if (mModuleUtil.isModuleEnabled(packageName)) {
52 | mModuleUtil.setModuleEnabled(packageName, false);
53 | mModuleUtil.updateModulesList(false);
54 | }
55 | return;
56 | }
57 |
58 | if (mModuleUtil.isModuleEnabled(packageName)) {
59 | mModuleUtil.updateModulesList(false);
60 | NotificationUtil.showModulesUpdatedNotification();
61 | } else {
62 | NotificationUtil.showNotActivatedNotification(packageName, module.getAppName());
63 | }
64 | }
65 |
66 | private static String getPackageName(Intent intent) {
67 | Uri uri = intent.getData();
68 | return (uri != null) ? uri.getSchemeSpecificPart() : null;
69 | }
70 | }
71 |
--------------------------------------------------------------------------------
/res/xml/prefs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
14 |
15 |
16 |
19 |
24 |
31 |
32 |
33 |
36 |
43 |
44 |
45 |
48 |
54 |
61 |
62 |
--------------------------------------------------------------------------------
/res/layout/list_item_module.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
13 |
14 |
22 |
23 |
26 |
35 |
44 |
45 |
46 |
53 |
61 |
62 |
63 |
69 |
70 |
--------------------------------------------------------------------------------
/src/de/robv/android/xposed/installer/DownloadDetailsFragment.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer;
2 |
3 | import android.app.Activity;
4 | import android.app.Fragment;
5 | import android.net.Uri;
6 | import android.os.Bundle;
7 | import android.text.method.LinkMovementMethod;
8 | import android.util.Pair;
9 | import android.view.LayoutInflater;
10 | import android.view.View;
11 | import android.view.ViewGroup;
12 | import android.widget.TextView;
13 | import de.robv.android.xposed.installer.repo.Module;
14 | import de.robv.android.xposed.installer.repo.RepoParser;
15 | import de.robv.android.xposed.installer.util.NavUtil;
16 |
17 | public class DownloadDetailsFragment extends Fragment {
18 | private DownloadDetailsActivity mActivity;
19 |
20 | @Override
21 | public void onAttach(Activity activity) {
22 | super.onAttach(activity);
23 | mActivity = (DownloadDetailsActivity) activity;
24 | }
25 |
26 | @Override
27 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
28 | final Module module = mActivity.getModule();
29 | if (module == null)
30 | return null;
31 |
32 | final View view = inflater.inflate(R.layout.download_details, container, false);
33 |
34 | TextView title = (TextView) view.findViewById(R.id.download_title);
35 | title.setText(module.name);
36 |
37 | TextView author = (TextView) view.findViewById(R.id.download_author);
38 | if (module.author != null && !module.author.isEmpty())
39 | author.setText(getString(R.string.download_author, module.author));
40 | else
41 | author.setText(R.string.download_unknown_author);
42 |
43 | TextView description = (TextView) view.findViewById(R.id.download_description);
44 | if (module.description != null) {
45 | if (module.descriptionIsHtml) {
46 | description.setText(RepoParser.parseSimpleHtml(module.description));
47 | description.setMovementMethod(LinkMovementMethod.getInstance());
48 | } else {
49 | description.setText(module.description);
50 | }
51 | } else {
52 | description.setVisibility(View.GONE);
53 | }
54 |
55 | ViewGroup moreInfoContainer = (ViewGroup) view.findViewById(R.id.download_moreinfo_container);
56 | for (Pair moreInfoEntry : module.moreInfo) {
57 | View moreInfoView = inflater.inflate(R.layout.download_moreinfo, moreInfoContainer, false);
58 | TextView txtTitle = (TextView) moreInfoView.findViewById(android.R.id.title);
59 | TextView txtValue = (TextView) moreInfoView.findViewById(android.R.id.message);
60 |
61 | txtTitle.setText(moreInfoEntry.first + ":");
62 | txtValue.setText(moreInfoEntry.second);
63 |
64 | final Uri link = NavUtil.parseURL(moreInfoEntry.second);
65 | if (link != null) {
66 | txtValue.setTextColor(txtValue.getLinkTextColors());
67 | moreInfoView.setOnClickListener(new View.OnClickListener() {
68 | @Override
69 | public void onClick(View v) {
70 | NavUtil.startURL(getActivity(), link);
71 | }
72 | });
73 | }
74 |
75 | moreInfoContainer.addView(moreInfoView);
76 | }
77 |
78 | return view;
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/src/de/robv/android/xposed/installer/SettingsFragment.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer;
2 |
3 | import java.io.File;
4 | import java.io.IOException;
5 |
6 | import android.app.Activity;
7 | import android.os.Bundle;
8 | import android.preference.CheckBoxPreference;
9 | import android.preference.Preference;
10 | import android.preference.Preference.OnPreferenceChangeListener;
11 | import android.preference.PreferenceFragment;
12 | import android.widget.Toast;
13 | import de.robv.android.xposed.installer.util.RepoLoader;
14 |
15 | public class SettingsFragment extends PreferenceFragment {
16 | private static final File mDisableResourcesFlag = new File(XposedApp.BASE_DIR + "conf/disable_resources");
17 |
18 | @Override
19 | public void onActivityCreated(Bundle savedInstanceState) {
20 | super.onActivityCreated(savedInstanceState);
21 | Activity activity = getActivity();
22 | if (activity instanceof XposedDropdownNavActivity)
23 | ((XposedDropdownNavActivity) activity).setNavItem(XposedDropdownNavActivity.TAB_SETTINGS);
24 | }
25 |
26 | @Override
27 | public void onCreate(Bundle savedInstanceState) {
28 | super.onCreate(savedInstanceState);
29 |
30 | addPreferencesFromResource(R.xml.prefs);
31 |
32 | findPreference("enable_downloads").setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
33 | @Override
34 | public boolean onPreferenceChange(Preference preference, Object newValue) {
35 | boolean enabled = (Boolean) newValue;
36 | if (enabled) {
37 | preference.getEditor().putBoolean("enable_downloads", enabled).apply();
38 | RepoLoader.getInstance().refreshRepositories();
39 | RepoLoader.getInstance().triggerReload(true);
40 | } else {
41 | RepoLoader.getInstance().clear(true);
42 | }
43 | return true;
44 | }
45 | });
46 |
47 | findPreference("release_type_global").setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
48 | @Override
49 | public boolean onPreferenceChange(Preference preference, Object newValue) {
50 | RepoLoader.getInstance().setReleaseTypeGlobal((String) newValue);
51 | return true;
52 | }
53 | });
54 |
55 | CheckBoxPreference prefDisableResources = (CheckBoxPreference) findPreference("disable_resources");
56 | prefDisableResources.setChecked(mDisableResourcesFlag.exists());
57 | prefDisableResources.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
58 | @Override
59 | public boolean onPreferenceChange(Preference preference, Object newValue) {
60 | boolean enabled = (Boolean) newValue;
61 | if (enabled) {
62 | try {
63 | mDisableResourcesFlag.createNewFile();
64 | } catch (IOException e) {
65 | Toast.makeText(getActivity(), e.getMessage(), Toast.LENGTH_SHORT).show();
66 | }
67 | } else {
68 | mDisableResourcesFlag.delete();
69 | }
70 | return (enabled == mDisableResourcesFlag.exists());
71 | }
72 | });
73 |
74 | Preference prefTheme = findPreference("theme");
75 | prefTheme.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
76 | @Override
77 | public boolean onPreferenceChange(Preference preference, Object newValue) {
78 | getActivity().recreate();
79 | return true;
80 | }
81 | });
82 | }
83 | }
84 |
--------------------------------------------------------------------------------
/res/layout/list_item_version.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
13 |
14 |
21 |
22 |
27 |
28 |
34 |
35 |
36 |
43 |
44 |
52 |
53 |
61 |
62 |
63 |
64 |
68 |
69 |
77 |
78 |
83 |
84 |
--------------------------------------------------------------------------------
/src/de/robv/android/xposed/installer/util/RootUtil.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.util;
2 |
3 | import java.util.List;
4 |
5 | import android.os.Handler;
6 | import android.os.HandlerThread;
7 | import eu.chainfire.libsuperuser.Shell;
8 | import eu.chainfire.libsuperuser.Shell.OnCommandResultListener;
9 |
10 | public class RootUtil {
11 | private Shell.Interactive mShell = null;
12 | private HandlerThread mCallbackThread = null;
13 |
14 | private boolean mCommandRunning = false;
15 | private int mLastExitCode = -1;
16 | private List mLastOutput = null;
17 |
18 | private OnCommandResultListener commandResultListener = new OnCommandResultListener() {
19 | @Override
20 | public void onCommandResult(int commandCode, int exitCode, List output) {
21 | mLastExitCode = exitCode;
22 | mLastOutput = output;
23 | synchronized (mCallbackThread) {
24 | mCommandRunning = false;
25 | mCallbackThread.notifyAll();
26 | }
27 | }
28 | };
29 |
30 | private void waitForCommandFinished() {
31 | synchronized (mCallbackThread) {
32 | while (mCommandRunning) {
33 | try {
34 | mCallbackThread.wait();
35 | } catch (InterruptedException ignored) {}
36 | }
37 | }
38 |
39 | if (mLastExitCode == OnCommandResultListener.WATCHDOG_EXIT
40 | || mLastExitCode == OnCommandResultListener.SHELL_DIED)
41 | dispose();
42 | }
43 |
44 | /**
45 | * Starts an interactive shell with root permissions.
46 | * Does nothing if already running.
47 | *
48 | * @return true if root access is available, false otherwise
49 | */
50 | public synchronized boolean startShell() {
51 | if (mShell != null) {
52 | if (mShell.isRunning())
53 | return true;
54 | else
55 | dispose();
56 | }
57 |
58 | mCallbackThread = new HandlerThread("su callback listener");
59 | mCallbackThread.start();
60 |
61 | mCommandRunning = true;
62 | mShell = new Shell.Builder()
63 | .useSU()
64 | .setHandler(new Handler(mCallbackThread.getLooper()))
65 | .setWantSTDERR(true)
66 | .setWatchdogTimeout(10)
67 | .open(commandResultListener);
68 |
69 | waitForCommandFinished();
70 |
71 | if (mLastExitCode != OnCommandResultListener.SHELL_RUNNING) {
72 | dispose();
73 | return false;
74 | }
75 |
76 | return true;
77 | }
78 |
79 | /**
80 | * Closes all resources related to the shell.
81 | */
82 | public synchronized void dispose() {
83 | if (mShell == null)
84 | return;
85 |
86 | try {
87 | mShell.close();
88 | } catch (Exception ignored) {}
89 | mShell = null;
90 |
91 | mCallbackThread.quit();
92 | mCallbackThread = null;
93 | }
94 |
95 | /**
96 | * Executes a single command, waits for its termination and returns the result
97 | */
98 | public synchronized int execute(String command, List output) {
99 | if (mShell == null)
100 | throw new IllegalStateException("shell is not running");
101 |
102 | mCommandRunning = true;
103 | mShell.addCommand(command, 0, commandResultListener);
104 | waitForCommandFinished();
105 |
106 | if (output != null)
107 | output.addAll(mLastOutput);
108 |
109 | return mLastExitCode;
110 | }
111 |
112 | /**
113 | * Executes a single command via the bundled BusyBox executable
114 | */
115 | public int executeWithBusybox(String command, List output) {
116 | AssetUtil.extractBusybox();
117 | return execute(AssetUtil.BUSYBOX_FILE.getAbsolutePath() + " " + command, output);
118 | }
119 |
120 | @Override
121 | protected void finalize() throws Throwable {
122 | dispose();
123 | }
124 | }
125 |
--------------------------------------------------------------------------------
/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
24 |
25 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
76 |
77 |
78 |
79 |
80 |
81 |
83 |
84 |
85 |
86 |
--------------------------------------------------------------------------------
/src/de/robv/android/xposed/installer/util/PrefixedSharedPreferences.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer.util;
2 |
3 | import java.lang.reflect.Field;
4 | import java.util.HashMap;
5 | import java.util.Map;
6 | import java.util.Map.Entry;
7 | import java.util.Set;
8 |
9 | import android.annotation.SuppressLint;
10 | import android.content.SharedPreferences;
11 | import android.preference.PreferenceManager;
12 |
13 | public class PrefixedSharedPreferences implements SharedPreferences {
14 | private final SharedPreferences mBase;
15 | private final String mPrefix;
16 |
17 | public PrefixedSharedPreferences(SharedPreferences base, String prefix) {
18 | mBase = base;
19 | mPrefix = prefix + "_";
20 | }
21 |
22 | public static void injectToPreferenceManager(PreferenceManager manager, String prefix) {
23 | SharedPreferences prefixedPrefs = new PrefixedSharedPreferences(manager.getSharedPreferences(), prefix);
24 |
25 | try {
26 | Field fieldSharedPref = PreferenceManager.class.getDeclaredField("mSharedPreferences");
27 | fieldSharedPref.setAccessible(true);
28 | fieldSharedPref.set(manager, prefixedPrefs);
29 | } catch (Throwable t) {
30 | throw new RuntimeException(t);
31 | }
32 | }
33 |
34 | @Override
35 | public Map getAll() {
36 | Map baseResult = mBase.getAll();
37 | Map prefixedResult = new HashMap(baseResult);
38 | for (Entry entry : baseResult.entrySet()) {
39 | prefixedResult.put(mPrefix + entry.getKey(), entry.getValue());
40 | }
41 | return prefixedResult;
42 | }
43 |
44 | @Override
45 | public String getString(String key, String defValue) {
46 | return mBase.getString(mPrefix + key, defValue);
47 | }
48 |
49 | @Override
50 | public Set getStringSet(String key, Set defValues) {
51 | return mBase.getStringSet(mPrefix + key, defValues);
52 | }
53 |
54 | @Override
55 | public int getInt(String key, int defValue) {
56 | return mBase.getInt(mPrefix + key, defValue);
57 | }
58 |
59 | @Override
60 | public long getLong(String key, long defValue) {
61 | return mBase.getLong(mPrefix + key, defValue);
62 | }
63 |
64 | @Override
65 | public float getFloat(String key, float defValue) {
66 | return mBase.getFloat(mPrefix + key, defValue);
67 | }
68 |
69 | @Override
70 | public boolean getBoolean(String key, boolean defValue) {
71 | return mBase.getBoolean(mPrefix + key, defValue);
72 | }
73 |
74 | @Override
75 | public boolean contains(String key) {
76 | return mBase.contains(mPrefix + key);
77 | }
78 |
79 | @SuppressLint("CommitPrefEdits")
80 | @Override
81 | public Editor edit() {
82 | return new EditorImpl(mBase.edit());
83 | }
84 |
85 | @Override
86 | public void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) {
87 | throw new UnsupportedOperationException("listeners are not supported in this implementation");
88 | }
89 |
90 | @Override
91 | public void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) {
92 | throw new UnsupportedOperationException("listeners are not supported in this implementation");
93 | }
94 |
95 |
96 | private class EditorImpl implements Editor {
97 | private final Editor mEditorBase;
98 |
99 | public EditorImpl(Editor base) {
100 | mEditorBase = base;
101 | }
102 |
103 | @Override
104 | public Editor putString(String key, String value) {
105 | mEditorBase.putString(mPrefix + key, value);
106 | return this;
107 | }
108 |
109 | @Override
110 | public Editor putStringSet(String key, Set values) {
111 | mEditorBase.putStringSet(mPrefix + key, values);
112 | return this;
113 | }
114 |
115 | @Override
116 | public Editor putInt(String key, int value) {
117 | mEditorBase.putInt(mPrefix + key, value);
118 | return this;
119 | }
120 |
121 | @Override
122 | public Editor putLong(String key, long value) {
123 | mEditorBase.putLong(mPrefix + key, value);
124 | return this;
125 | }
126 |
127 | @Override
128 | public Editor putFloat(String key, float value) {
129 | mEditorBase.putFloat(mPrefix + key, value);
130 | return this;
131 | }
132 |
133 | @Override
134 | public Editor putBoolean(String key, boolean value) {
135 | mEditorBase.putBoolean(mPrefix + key, value);
136 | return this;
137 | }
138 |
139 | @Override
140 | public Editor remove(String key) {
141 | mEditorBase.remove(mPrefix + key);
142 | return this;
143 | }
144 |
145 | @Override
146 | public Editor clear() {
147 | mEditorBase.clear();
148 | return this;
149 | }
150 |
151 | @Override
152 | public boolean commit() {
153 | return mEditorBase.commit();
154 | }
155 |
156 | @Override
157 | public void apply() {
158 | mEditorBase.apply();
159 | }
160 | }
161 | }
162 |
--------------------------------------------------------------------------------
/src/de/robv/android/xposed/installer/XposedDropdownNavActivity.java:
--------------------------------------------------------------------------------
1 | package de.robv.android.xposed.installer;
2 |
3 | import java.util.ArrayList;
4 | import java.util.HashMap;
5 | import java.util.List;
6 | import java.util.Map;
7 |
8 | import android.app.ActionBar;
9 | import android.app.ActionBar.OnNavigationListener;
10 | import android.app.Fragment;
11 | import android.app.FragmentTransaction;
12 | import android.content.Intent;
13 | import android.os.Bundle;
14 | import android.view.MenuItem;
15 | import android.view.Window;
16 | import android.widget.SimpleAdapter;
17 | import de.robv.android.xposed.installer.util.NavUtil;
18 |
19 | public abstract class XposedDropdownNavActivity extends XposedBaseActivity {
20 | public static final int TAB_INSTALL = 0;
21 | public static final int TAB_MODULES = 1;
22 | public static final int TAB_DOWNLOAD = 2;
23 | public static final int TAB_SETTINGS = 3;
24 | public static final int TAB_LOGS = 4;
25 | public static final int TAB_ABOUT = 5;
26 | public static final int TAB_COUNT = TAB_ABOUT + 1;
27 |
28 | protected int currentNavItem = -1;
29 | protected static List