diff --git a/app/build.gradle b/app/build.gradle index 9027e08d0..d3d07e757 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,15 +1,14 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 25 - buildToolsVersion "25.0.3" + compileSdkVersion 27 defaultConfig { applicationId "de.robv.android.xposed.installer" minSdkVersion 15 targetSdkVersion 25 - versionCode 40 - versionName "3.1.2" + versionCode 43 + versionName "3.1.5" archivesBaseName = "XposedInstaller_${versionName}".replace(' ', '_') } @@ -25,14 +24,14 @@ android { } dependencies { - compile 'com.android.support:cardview-v7:25.3.1' - compile 'com.android.support:design:25.3.1' - compile 'com.android.support:customtabs:25.3.1' - compile 'com.android.support:support-v13:25.3.1' - compile 'com.afollestad.material-dialogs:commons:0.9.0.2' - compile 'se.emilsjolander:stickylistheaders:2.7.0' - compile 'eu.chainfire:libsuperuser:1.0.0.201608240809' - compile 'com.squareup.picasso:picasso:2.5.2' - compile 'de.psdev.licensesdialog:licensesdialog:1.8.1' - compile fileTree(dir: 'libs', include: ['*.jar']) + implementation 'com.android.support:cardview-v7:27.0.2' + implementation 'com.android.support:design:27.0.2' + implementation 'com.android.support:customtabs:27.0.2' + implementation 'com.android.support:support-v13:27.0.2' + implementation 'com.afollestad.material-dialogs:commons:0.9.0.2' + implementation 'se.emilsjolander:stickylistheaders:2.7.0' + implementation 'eu.chainfire:libsuperuser:1.0.0.201608240809' + implementation 'com.squareup.picasso:picasso:2.5.2' + implementation 'de.psdev.licensesdialog:licensesdialog:1.8.1' + compileOnly fileTree(dir: 'libs', include: ['*.jar']) } diff --git a/app/src/main/java/de/robv/android/xposed/installer/DownloadFragment.java b/app/src/main/java/de/robv/android/xposed/installer/DownloadFragment.java index f9806590b..8f2382737 100644 --- a/app/src/main/java/de/robv/android/xposed/installer/DownloadFragment.java +++ b/app/src/main/java/de/robv/android/xposed/installer/DownloadFragment.java @@ -7,6 +7,7 @@ import android.content.res.Resources; import android.database.Cursor; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.support.v4.view.MenuItemCompat; import android.support.v4.widget.SwipeRefreshLayout; @@ -93,6 +94,9 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa mModuleUtil.addListener(this); mListView = (StickyListHeadersListView) v.findViewById(R.id.listModules); + if (Build.VERSION.SDK_INT >= 26) { + mListView.setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS); + } mListView.setAdapter(mAdapter); mListView.setOnScrollListener(new AbsListView.OnScrollListener() { @Override diff --git a/app/src/main/java/de/robv/android/xposed/installer/LogsFragment.java b/app/src/main/java/de/robv/android/xposed/installer/LogsFragment.java index eb14c6aad..9897a0bfa 100644 --- a/app/src/main/java/de/robv/android/xposed/installer/LogsFragment.java +++ b/app/src/main/java/de/robv/android/xposed/installer/LogsFragment.java @@ -13,6 +13,7 @@ import android.support.annotation.NonNull; import android.support.v13.app.FragmentCompat; import android.support.v4.app.ActivityCompat; +import android.support.v4.content.FileProvider; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -175,9 +176,11 @@ private void clear() { } private void send() { + Uri uri = FileProvider.getUriForFile(getActivity(), "de.robv.android.xposed.installer.fileprovider", mFileErrorLog); Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); - sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(save())); + sendIntent.putExtra(Intent.EXTRA_STREAM, uri); + sendIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); sendIntent.setType("application/html"); startActivity(Intent.createChooser(sendIntent, getResources().getString(R.string.menuSend))); } diff --git a/app/src/main/java/de/robv/android/xposed/installer/installation/StatusInstallerFragment.java b/app/src/main/java/de/robv/android/xposed/installer/installation/StatusInstallerFragment.java index 4544acca2..29383f304 100644 --- a/app/src/main/java/de/robv/android/xposed/installer/installation/StatusInstallerFragment.java +++ b/app/src/main/java/de/robv/android/xposed/installer/installation/StatusInstallerFragment.java @@ -3,6 +3,7 @@ import android.annotation.SuppressLint; import android.app.Fragment; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.graphics.Color; @@ -32,6 +33,7 @@ import java.io.File; import java.io.IOException; +import java.lang.reflect.Method; import java.util.Set; import de.robv.android.xposed.installer.R; @@ -110,6 +112,8 @@ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { manufacturer.setText(getUIFramework()); cpu.setText(FrameworkZips.ARCH); + determineVerifiedBootState(v); + // Known issues refreshKnownIssue(v); @@ -190,6 +194,9 @@ public void onCreate(@Nullable Bundle savedInstanceState) { public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_installer, menu); menu.findItem(R.id.show_outdated).setChecked(mShowOutdated); + if (Build.VERSION.SDK_INT < 26) { + menu.findItem(R.id.dexopt_now).setVisible(false); + } } @Override @@ -207,6 +214,40 @@ public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) }); return true; + case R.id.dexopt_now: + new MaterialDialog.Builder(getActivity()) + .title(R.string.dexopt_now) + .content(R.string.this_may_take_a_while) + .progress(true, 0) + .cancelable(false) + .showListener(new DialogInterface.OnShowListener() { + @Override + public void onShow(final DialogInterface dialog) { + new Thread("dexopt") { + @Override + public void run() { + RootUtil rootUtil = new RootUtil(); + if (!rootUtil.startShell()) { + dialog.dismiss(); + NavUtil.showMessage(getActivity(), getString(R.string.root_failed)); + return; + } + + rootUtil.execute("cmd package bg-dexopt-job", null); + + dialog.dismiss(); + XposedApp.runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(getActivity(), R.string.done, Toast.LENGTH_LONG).show(); + } + }); + } + }.start(); + } + }).show(); + return true; + case R.id.show_outdated: mShowOutdated = !item.isChecked(); XposedApp.getPreferences().edit().putBoolean("framework_download_show_outdated", mShowOutdated).apply(); @@ -227,15 +268,36 @@ private void confirmReboot(int contentTextId, MaterialDialog.SingleButtonCallbac .show(); } + private File getCanonicalFile(File file) { + try { + return file.getCanonicalFile(); + } catch (IOException e) { + Log.e(XposedApp.TAG, "Failed to get canonical file for " + file.getAbsolutePath(), e); + return file; + } + } + + private String getPathWithCanonicalPath(File file, File canonical) { + if (file.equals(canonical)) { + return file.getAbsolutePath(); + } else { + return file.getAbsolutePath() + " \u2192 " + canonical.getAbsolutePath(); + } + } + @SuppressLint("StringFormatInvalid") private void refreshKnownIssue(View v) { final String issueName; final String issueLink; - final File baseDir = new File(XposedApp.BASE_DIR); final ApplicationInfo appInfo = getActivity().getApplicationInfo(); - final Set missingFeatures = XposedApp.getXposedProp().getMissingInstallerFeatures(); + final File baseDir = new File(XposedApp.BASE_DIR); + final File baseDirCanonical = getCanonicalFile(baseDir); + final File baseDirActual = new File(Build.VERSION.SDK_INT >= 24 ? appInfo.deviceProtectedDataDir : appInfo.dataDir); + final File baseDirActualCanonical = getCanonicalFile(baseDirActual); + final InstallZipUtil.XposedProp prop = XposedApp.getXposedProp(); + final Set missingFeatures = prop != null ? prop.getMissingInstallerFeatures() : null; - if (!missingFeatures.isEmpty()) { + if (missingFeatures != null && !missingFeatures.isEmpty()) { InstallZipUtil.reportMissingFeatures(missingFeatures); issueName = getString(R.string.installer_needs_update, getString(R.string.app_name)); issueLink = getString(R.string.about_support); @@ -248,15 +310,10 @@ private void refreshKnownIssue(View v) { } else if (Build.VERSION.SDK_INT < 24 && new File("/system/framework/twframework.jar").exists()) { issueName = "Samsung TouchWiz ROM"; issueLink = "https://forum.xda-developers.com/showthread.php?t=3034811"; - } else if (Build.VERSION.SDK_INT < 24 && !baseDir.equals(new File(appInfo.dataDir))) { - Log.e(XposedApp.TAG, "Base directory: " + appInfo.dataDir); - Log.e(XposedApp.TAG, "Expected: " + XposedApp.BASE_DIR); - issueName = getString(R.string.known_issue_wrong_base_directory); - issueLink = "https://github.com/rovo89/XposedInstaller/issues/395"; - } else if (Build.VERSION.SDK_INT >= 24 && !baseDir.equals(new File(appInfo.deviceProtectedDataDir))) { - Log.e(XposedApp.TAG, "Base directory: " + appInfo.deviceProtectedDataDir); - Log.e(XposedApp.TAG, "Expected: " + XposedApp.BASE_DIR); - issueName = getString(R.string.known_issue_wrong_base_directory); + } else if (!baseDirCanonical.equals(baseDirActualCanonical)) { + Log.e(XposedApp.TAG, "Base directory: " + getPathWithCanonicalPath(baseDir, baseDirCanonical)); + Log.e(XposedApp.TAG, "Expected: " + getPathWithCanonicalPath(baseDirActual, baseDirActualCanonical)); + issueName = getString(R.string.known_issue_wrong_base_directory, getPathWithCanonicalPath(baseDirActual, baseDirActualCanonical)); issueLink = "https://github.com/rovo89/XposedInstaller/issues/395"; } else if (!baseDir.exists()) { issueName = getString(R.string.known_issue_missing_base_directory); @@ -321,6 +378,34 @@ private String getUIFramework() { return manufacturer; } + private void determineVerifiedBootState(View v) { + try { + Class c = Class.forName("android.os.SystemProperties"); + Method m = c.getDeclaredMethod("get", String.class, String.class); + m.setAccessible(true); + + String propSystemVerified = (String) m.invoke(null, "partition.system.verified", "0"); + String propState = (String) m.invoke(null, "ro.boot.verifiedbootstate", ""); + File fileDmVerityModule = new File("/sys/module/dm_verity"); + + boolean verified = !propSystemVerified.equals("0"); + boolean detected = !propState.isEmpty() || fileDmVerityModule.exists(); + + TextView tv = v.findViewById(R.id.dmverity); + if (verified) { + tv.setText(R.string.verified_boot_active); + tv.setTextColor(getResources().getColor(R.color.warning)); + } else if (detected) { + tv.setText(R.string.verified_boot_deactivated); + v.findViewById(R.id.dmverity_explanation).setVisibility(View.GONE); + } else { + v.findViewById(R.id.dmverity_row).setVisibility(View.GONE); + } + } catch (Exception e) { + Log.e(XposedApp.TAG, "Could not detect Verified Boot state", e); + } + } + @UiThread private void refreshZipViews(View view) { LinearLayout zips = (LinearLayout) view.findViewById(R.id.zips); diff --git a/app/src/main/java/de/robv/android/xposed/installer/util/DownloadsUtil.java b/app/src/main/java/de/robv/android/xposed/installer/util/DownloadsUtil.java index 01d3addd6..46594565c 100644 --- a/app/src/main/java/de/robv/android/xposed/installer/util/DownloadsUtil.java +++ b/app/src/main/java/de/robv/android/xposed/installer/util/DownloadsUtil.java @@ -9,6 +9,7 @@ import android.database.Cursor; import android.net.Uri; import android.os.Environment; +import android.provider.MediaStore; import android.support.annotation.NonNull; import android.support.annotation.UiThread; import android.support.v4.content.ContextCompat; @@ -468,10 +469,23 @@ private static String getFilenameFromUri(String uriString) { return null; } Uri uri = Uri.parse(uriString); - if (!uri.getScheme().equals("file")) { - throw new UnsupportedOperationException("Not a file URI: " + uriString); + if (uri.getScheme().equals("file")) { + return uri.getPath(); + } else if (uri.getScheme().equals("content")) { + Context context = XposedApp.getInstance(); + Cursor c = null; + try { + c = context.getContentResolver().query(uri, new String[]{MediaStore.Files.FileColumns.DATA}, null, null, null); + c.moveToFirst(); + return c.getString(c.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATA)); + } finally { + if (c != null) { + c.close(); + } + } + } else { + throw new UnsupportedOperationException("Unexpected URI: " + uriString); } - return uri.getPath(); } public static SyncDownloadInfo downloadSynchronously(String url, File target) { diff --git a/app/src/main/java/de/robv/android/xposed/installer/util/NavUtil.java b/app/src/main/java/de/robv/android/xposed/installer/util/NavUtil.java index 511cd0ba6..2daca66b0 100644 --- a/app/src/main/java/de/robv/android/xposed/installer/util/NavUtil.java +++ b/app/src/main/java/de/robv/android/xposed/installer/util/NavUtil.java @@ -5,6 +5,7 @@ import android.content.Intent; import android.net.Uri; import android.provider.Browser; +import android.support.annotation.AnyThread; import android.support.annotation.NonNull; import android.support.customtabs.CustomTabsIntent; import android.text.Spannable; @@ -47,10 +48,16 @@ public static void startURL(Activity activity, String url) { startURL(activity, parseURL(url)); } - public static void showMessage(@NonNull Context context, CharSequence message) { - new MaterialDialog.Builder(context) - .content(message) - .positiveText(android.R.string.ok) - .show(); + @AnyThread + public static void showMessage(final @NonNull Context context, final CharSequence message) { + XposedApp.runOnUiThread(new Runnable() { + @Override + public void run() { + new MaterialDialog.Builder(context) + .content(message) + .positiveText(android.R.string.ok) + .show(); + } + }); } } diff --git a/app/src/main/res/drawable/ic_flash.xml b/app/src/main/res/drawable/ic_flash.xml new file mode 100644 index 000000000..a3c81cc38 --- /dev/null +++ b/app/src/main/res/drawable/ic_flash.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_verified.xml b/app/src/main/res/drawable/ic_verified.xml new file mode 100644 index 000000000..d136718a7 --- /dev/null +++ b/app/src/main/res/drawable/ic_verified.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/status_installer.xml b/app/src/main/res/layout/status_installer.xml index c26558c48..728b58b62 100644 --- a/app/src/main/res/layout/status_installer.xml +++ b/app/src/main/res/layout/status_installer.xml @@ -257,6 +257,49 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/res/menu/menu_installer.xml b/app/src/main/res/menu/menu_installer.xml index a6392f08f..037424240 100644 --- a/app/src/main/res/menu/menu_installer.xml +++ b/app/src/main/res/menu/menu_installer.xml @@ -20,6 +20,11 @@ + + Software-Neustart Geräte-Neustart Neustart ins Recovery + Apps jetzt optimieren + Das kann eine Weile dauern. + Fertig! Nicht jetzt Neustart fehlgeschlagen. Bitte verwende die normale Neustartfunktion des Geräts. %s sollte automatisch installiert werden, sobald du "OK" drückst. @@ -56,6 +59,9 @@ Heruntergeladene Datei löschen Konnte die verfügbaren ZIPs nicht laden. Ziehe nach unten, um es erneut zu versuchen. Keine passenden ZIPs gefunden, dein Gerät scheint derzeit nicht unterstützt zu sein. + Verified Boot ist deaktiviert + Verified Boot ist aktiv + Verified Boot (dm-verity) verhindert das Booten des Geräts, falls die System-Partition modifiziert ist.\nEs wird nicht empfohlen, Xposed zu installieren! Root-Zugriff fehlgeschlagen\n\nStelle sicher, dass das Gerät korrekt gerootet ist und Shell-Kommandos nicht blockiert werden. diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index c24ff8adf..20b23d885 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -3,144 +3,231 @@ Gönder - SD Karta kaydet - Xposed en son sürümü şu anda aktif değildir. Şimdi Frameworku kurmak ve yeniden başlatmak istermisiniz? + SD karta kaydet + Xposed\'ın son sürümü şu anda etkin değil. Framework\'ü kurdunuz ve yeniden başlattınız mı? - Xposed için kullanılabilir bir güncelleştirme var. + Xposed Framework için %s güncellemesi mevcut. + Modül güncelleştirmeleri var + Framework + Modüller + İndir + Ayarlar + Destek + Kayıtlar + Hakkında + Gezinti çekmecesini aç + Gezinti çekmecesini kapat Yükle/Güncelle Kaldır Hızlı yeniden başlat - Yeniden Başlat - Y.Başlatma hatası. Lütfen telefonu normal olarak yeniden başlatın. - %s işlemi otomatik olarak yapmak istiyorsanız "TAMAM" tuşuna basın. - Telefonu yeniden başlatmak istiyormusunuz? + Yeniden başlat + Kurtarma modunda yeniden başlat + Şimdi değil + Yeniden başlatılamıyor. Lütfen cihazın normal yeniden başlatma işlevini kullanın. + Tamama bastığınızda %s otomatik olarak yüklenmelidir. + Yeniden başlatmak istiyor musunuz? Dikkatli olun! - Bazı durumlarda Xposed yüklendikten sonra telefonunuz soft brick olabilir\n\nEğer \"soft brick\" veya \"bootloop\" gibi terimleri duymadıysanız\veya bunlar hakkında bilginiz yoksa Xposedi YÜKLEMEYİN Ya da yüklemeden önce\n\nMutlaka telefonunuzu yedekleyin. + Bazı durumlarda, Xposed yüklendikten sonra cihazınız artık açılmayabilir.\n\nDaha önce \"soft brick\" ve \"bootloop\" gibi terimleri duymadıysanız veya bunlar hakkında bilginiz yoksa, Xposed\'ı YÜKLEMEYİN!\n\nHer durumda, yeni bir yedekleme yapılması şiddetle önerilir. Bunu bir daha gösterme - Kullandığınız rom sürümü ile (\"%s\") Bilinen bir uyumsuzluk sorunu var gibi görünüyor. Muhtemelen Xposed yüklemeniz gerekir. Daha fazla bilgi için buraya tıklayın. + Kullandığınız rom sürümü ile (\"%s\") bilinen bir uyumsuzluk sorunu var gibi görünüyor. Xposed\'ı yüklemek işe yaramayabilir veya ağır problemlere neden olabilir. Konuyla ilgili ayrıntılar için burayı tıklayın. + %1$s güncellenmeli + yanlış taban dizini: %1$s + eksik ana dizin + Xposed Framework %s sürümü etkin. + Xposed Framework %s sürümü yüklendi, ancak etkin değil. Ayrıntılar için lütfen kayıtları kontrol edin. + Xposed Framework yüklü değil. + %1$s (%2$d) + Zaman aşımı oluştu + İşlem beklenmedik şekilde iptal edildi + Yüklenebilir bir ZIP dosyası değil + Bu dosya sadece kurtarma modu üzerinden yüklenebilir. + %d hatası oluştu + Xposed Durumu + Xposed Framework sonraki yeniden başlatmada etkinleştirilecek + Xposed Framework sonraki yeniden başlatmada devre dışı bırakılacak + Eski sürümleri göster + Cihazınız + Yükle + Kaldır + Kurtarma yoluyla yükle + Kurtarma yoluyla kaldır + İndirilen dosyayı sil + Kullanılabilir ZIP dosyaları yüklenemedi. Tekrar denemek için aşağı doğru çekin. + Eşleşen hiçbir zip bulunamadı, cihazınız şu anda desteklenmiyor gibi görünüyor. - Root erişimi alınamadı.\n\nLütfen cihazınının root erişiminin açık olduğuna ve komut alabildiğine emin olun. + Root erişimi alınamadı.\n\nCihazınızın doğru şekilde rootlandığından ve komut alabildiğinden emin olun. Kopyalanıyor %s… - Kopyalanamdı %1$s to %2$s - Klasör oluşturuluyor %s… - Klasör oluşturma hatası %s - Recovery yazma komutu… - Recovery komutu yazma başarısız oldu. Farklı bir kurulum yöntemini kullanın. - Bitti! Değişiklikler telefon yeniden başlatılınca aktif hale gelecektir. + %1$s %2$s içine kopyalanamadı + Dizin oluşturuluyor %s… + %s dizini oluşturulamıyor + Recovery komutu yazılıyor… + Recovery komutu yazılamıyor. Lütfen farklı bir yükleme yöntemi kullanın. + Bitti! Değişiklikler yeniden başlatıldığında etkinleşecek. - Xposed modülü henüz aktif değil - %s yüklendi,ama şu an aktif değil. - Aktifleştir ve yeniden başlat - Xposed modülü aktifleştirildi. - (hiçbir açıklama yok) + Xposed modülü henüz etkinleştirilmedi + %s yüklendi, ancak etkinleştirilmedi. + Etkinleştir ve yeniden başlat + Sadece etkinleştir + Xposed modulü etkinleştirildi + (açıklama yok) Bu modül bir kullanıcı arabirimi sağlamaz Xposed modülleri bulunamadı! - Xposed modül listesi güncellendi.Değişikliklerin aktif olması için telefonunuzu yeniden başlatın. + Xposed modül listesi güncellendi\nDeğişiklikler yeniden başlatıldığında etkinleşecektir Xposed modülü güncellendi - Değişiklikleri etkinleştirmek için yeniden başlatın - Bu modül yeni bir Xposed sürümü (%d) gerektirir ve aktive edilemez.. - Bu modül ihtiyacı olan Xposed sürümünü belirtmez. - Bu modül Xposed sürüm %1$d, için oluşturuldu, ancak bu sürüm ile uyumsuz değişiklikler var, %2$d, Bu yüzden evre dışı bırakıldı.. - UI Başlat - ındir/Güncelle + Değişiklikleri etkinleştirmek için yeniden başlat + Bu modül yeni bir Xposed sürümü (%d) gerektirir ve etkinleştirilemez. + Bu modül ihtiyaç duyduğu Xposed sürümünü belirtmemektedir. + Bu modül Xposed %1$d sürümü için oluşturuldu, ancak %2$d sürümündeki uyumsuz değişiklikler nedeniyle devre dışı bırakıldı. + Arayüzü başlat + İndir/Güncelle Destek - App Bilgileri + Uygulama bilgileri Kaldır - Arama + Ara Yenile Değişiklikler: Açıklama - Versiyonlar + Sürümler Ayarlar Kararlı - Kararlı (Düşük hatalar olabilir) + Kararlı (hata riski düşük) Beta Beta (bazı hatalar beklenebilir) Deneysel - Deneysel (Yüksek risk ve hatalar olabilir) + Deneysel (hata riski yüksek) Genel ayarları kullan - Yapımcı %s - Bilinmeyen yapımcı - Yüklenmiş (versiyon %s) - Güncelleme mevcut (versiyon %1$s \u2192 %2$s) - Eklenme tarihi %1$s \u00b7 Son güncelleme %2$s - Sıralama Düzeni - Duruma göre sırala + Yapımcı: %s + bilinmeyen yapımcı + Yüklendi (sürüm %s) + Güncelleme mevcut (sürüm %1$s \u2192 %2$s) + Eklenme %1$s \u00b7 Güncelleme %2$s + Sıralama düzeni + Duruma göre Son güncelleme tarihine göre - Eklenme tarihine göre + Oluşturulma tarihine göre Framework Güncelleme mevcut - Yüklenmiş Modüller - Yüklenmemiş Modüller - Son 24 Saat - Son 7 Gün - Son 30 Gün - 30 günden daha önce - Bu modül adı \"%s\" modül deposunda bulunamadı + Yüklendi + Yüklenmedi + Son 24 saat + Son 7 gün + Son 30 gün + 30 günden önce + Depoda paket adı \"%s\" olan hiçbir modül yok. Yapımcı henüz bir şey yüklemedi. - Bir test sürümü mevcut, ancak test olması nedeniyle genel veya modül özel ayarları gösterilmez. + Bir test sürümü mevcut, ancak genel veya modüle özgü ayarlarınız nedeniyle gösterilmez. İndir + İndirmeleri etkinleştir + Xposed Installer\'ın güncellemeleri ve yeni modülleri kontrol etmesine izin ver Gösterilecek sürümler Deneysel - Kaynak bilgiler engelli - Tema motoru ile çakışmalar için çözüm\nUYARI: Bu etkinleştirildiğinde kaynaklarını değiştirmeye çalışmayın modüller çalışmaz. + Kaynaklara erişimi kapat + Tema motorları ile çakışmalara geçici çözüm\nUYARI: Bu etkinleştirildiğinde, kaynakları değiştirmeye çalışan modüller çalışmaz. Uygulama Tema - Hafif + Aydınlık Karanlık Siyah (AMOLED ekranlar için yararlı) + Varsayılan görünüm + Başlangıçta gezinti çekmecesini otomatik aç + Gezinti çekmecesini otomatik aç + \'xposedminversion\' kontrolünü atla + Modüller için minimum xposed sürümü kontrolünü atla + Chrome Özel Sekmeler + Bağlantıları dahili tarayıcıda aç + Modül güncelleme bildirimini etkinleştir + Modül desteği + Modül listesinde herhangi bir modüle uzun basın ve \"%1$s\" seçeneğine tıklayın. + Framework/Yükleyici desteği + SSS/Bilinen sorunlar + Bağış yap + Xposed için teşekkür etmek isterseniz, buradan rovo89\'a bağış yapabilirsiniz - Log kayıtlarını SD karta yazamadı: + Kayıt okunamıyor: + Kayıtlar SD karta yazılamadı: SD kart yazılabilir değil veya bulunamadı - Kayıtları şimdi sil - Log kayıtları başarı ile silindi - Log kayıtları silinemesi: - Log kaydı boş + Kayıt dosyası %1$,d kB\'tan büyük, %2$,d kB\'tan öncesi atlandı + Kayıtları şimdi temizle + Kayıtlar başarıyla temizlendi + Kayıtlar temizlenemedi: + Kayıt boş + En üste kaydır + En alta kaydır - Ana Geliştiriciler: - rovo89 and Tungstwenty + Ana geliştiriciler + rovo89 ve Tungstwenty\n-BioHaZard- ve dvdandroid hata düzeltmeleri ve Materyal Tasarım Çevirmen: - TheNorth - Uygulama sürümü: - Kaynak kodu: - Kullanılan kütüphaneler: + Fatih Fırıncı + Sürüm + Kaynak kodu + Kullanılan kütüphaneler İndir Yükle İptal - İndirme URL adresi yok - İndirme sürüyor (%1$,d kalan %2$,d kB) + İndirme adresi mevcut değil + İndiriliyor (İnen: %1$,d Toplam: %2$,d kB) İndirme bekliyor - İndirme tamamlandı - İndirme tamamlanamadı (hata %d) + İndirme başarılı + İndirme başarısız (hata %d) + Boyut: %s KB MD5 toplamı yanlış (indirilen: %1$s, beklenen: %2$s) İndirilen dosya okunamadı: %s - İndirilen dosya geçerli Apk dosyası değil (veya uyumsuz) + İndirilen dosya geçerli bir Apk dosyası değil (veya uyumsuz) Paket adı yanlış (indirilen: %1$s, beklenen: %2$s) + İndirme çalışıyor + %1$,d / %2$,d kB - İndirme %1$s başarısız: %2$d (%3$s) - İndirme %1$s başarısız: %2$s - Depodan yüklenemiyor %1$s:\n%2$s + %1$s indirmesi başarısız: %2$d (%3$s) + %1$s indirmesi başarısız: %2$s + %1$s içinden depo yüklenemiyor:\n%2$s + Bu modül hafıza kartına yüklendiğinden başlatılamıyor, lütfen dahili hafızaya taşıyın. + Bu modül ileriye kilitli olduğu için yüklenemez, lütfen modülün geliştiricisine başvurun. + Etkin modül listesini dışa aktar + Etkin modül listesini içe aktar + GÖRÜNTÜLE + Dışa aktar… + İçe aktar… + Etkin modül listesini dışa aktar + Etkin modül listesini içe aktar + Yüklü modül listesini dışa aktar + Yüklü modül listesini içe aktar + Yüklü bir modül yok! + Yedek bulunamadı + Etkin modül yok + Şununla paylaş… + Bu özellik, harici depolama alanına yazmak için izin almadan çalışmaz. + Favorilere ekle + Favorilerden kaldır + Favoriler + Favori eklenmedi + Favorilere eklendi + Favorilerden kaldırıldı + Geri al + Dosya boş + Yükle ve kaldır + Yükleniyor… + Modül listesini yenilemek için aşağı çekin diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a8d0764d8..20947962c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -27,6 +27,9 @@ Soft reboot Reboot Reboot to recovery + Optimize apps now + This may take a while. + Done! Not now Reboot failed. Please use the device\'s normal reboot function. %s should be flashed automatically once you press "OK". @@ -36,7 +39,7 @@ Don\'t show this again There seems to be a known issue (\"%s\") with your ROM. Installing Xposed might not work or lead to severe problems. Click here for details about the issue. %1$s needs to be updated - wrong base directory + wrong base directory: %1$s missing base directory Xposed Framework version %s is active. Xposed Framework version %s is installed, but not active. Please check the logs for details. @@ -59,6 +62,9 @@ Delete downloaded file Could not load available ZIP files. Pull down to try again. No matching ZIPs were found, it seems like your device is currently not supported. + Verified Boot is deactivated + Verified Boot is active + Verified Boot (dm-verity) prevents the device from booting if the system partition is modified.\nInstalling Xposed is not recommended! Failed to get root access.\n\nMake sure your device is rooted properly and you have not blocked shell commands. diff --git a/app/src/main/res/xml/file_paths.xml b/app/src/main/res/xml/file_paths.xml index 43b53b88a..7af8fca17 100644 --- a/app/src/main/res/xml/file_paths.xml +++ b/app/src/main/res/xml/file_paths.xml @@ -1,4 +1,6 @@ + + diff --git a/build.gradle b/build.gradle index d287fe6fa..97d43c4dd 100644 --- a/build.gradle +++ b/build.gradle @@ -2,17 +2,16 @@ buildscript { repositories { jcenter() + google() } dependencies { - classpath 'com.android.tools.build:gradle:2.3.3' + classpath 'com.android.tools.build:gradle:3.0.1' } } allprojects { repositories { jcenter() - maven { - url "https://maven.google.com" - } + google() } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 5b1032f3c..47df716f2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sun Oct 01 09:25:45 CEST 2017 +#Sun Oct 29 16:17:02 CET 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip