diff options
| author | lubenard <lubenard@student.42.fr> | 2020-07-05 15:39:50 +0000 |
|---|---|---|
| committer | lubenard <lubenard@student.42.fr> | 2020-07-05 15:39:50 +0000 |
| commit | 4533294f76e05688dedfbae958edb5eade78b239 (patch) | |
| tree | b54f4d94dc0b23f051b5681b240b2eeb7c5b9cc9 /ime/app/src | |
| parent | 38bf8e3cad645244edaf906b8fd8f01565e8e72a (diff) | |
| download | AnySoftKeyboard-4533294f76e05688dedfbae958edb5eade78b239.tar.gz AnySoftKeyboard-4533294f76e05688dedfbae958edb5eade78b239.tar.bz2 | |
Fixed bugs, added option to refresh for fileExplorer + passed lint
Diffstat (limited to 'ime/app/src')
16 files changed, 197 insertions, 134 deletions
diff --git a/ime/app/src/main/java/com/anysoftkeyboard/prefs/GlobalPrefsBackup.java b/ime/app/src/main/java/com/anysoftkeyboard/prefs/GlobalPrefsBackup.java index 77b1c2445..b9e9e136d 100644 --- a/ime/app/src/main/java/com/anysoftkeyboard/prefs/GlobalPrefsBackup.java +++ b/ime/app/src/main/java/com/anysoftkeyboard/prefs/GlobalPrefsBackup.java @@ -6,7 +6,6 @@ import android.support.annotation.StringRes; import android.support.annotation.VisibleForTesting; import android.support.v4.util.Pair; import android.support.v7.preference.PreferenceManager; - import com.anysoftkeyboard.base.utils.Logger; import com.anysoftkeyboard.dictionaries.ExternalDictionaryFactory; import com.anysoftkeyboard.dictionaries.prefsprovider.UserDictionaryPrefsProvider; @@ -138,18 +137,16 @@ public class GlobalPrefsBackup { prefsRoot -> prefsRootFinalizer.accept(storage, prefsRoot)); } - public static void updateCustomFilename(File filename) - { + public static void updateCustomFilename(File filename) { customFilename = filename; } public static File getBackupFile() { File tempFilename; - if (customFilename == null) - return AnyApplication.getBackupFile(GLOBAL_BACKUP_FILENAME); + if (customFilename == null) return AnyApplication.getBackupFile(GLOBAL_BACKUP_FILENAME); else { - //We reset the customFilename + // We reset the customFilename tempFilename = customFilename; customFilename = null; return tempFilename; diff --git a/ime/app/src/main/java/com/anysoftkeyboard/ui/FileExplorerCreate.java b/ime/app/src/main/java/com/anysoftkeyboard/ui/FileExplorerCreate.java index d4a367620..4993a36df 100644 --- a/ime/app/src/main/java/com/anysoftkeyboard/ui/FileExplorerCreate.java +++ b/ime/app/src/main/java/com/anysoftkeyboard/ui/FileExplorerCreate.java @@ -1,10 +1,13 @@ package com.anysoftkeyboard.ui; +import android.content.DialogInterface; import android.os.Bundle; import android.os.Environment; import android.support.v4.util.Pair; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; +import android.view.Menu; +import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; @@ -12,58 +15,54 @@ import android.widget.ImageButton; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; - import com.anysoftkeyboard.base.utils.Logger; import com.anysoftkeyboard.prefs.GlobalPrefsBackup; import com.anysoftkeyboard.rx.RxSchedulers; import com.anysoftkeyboard.ui.settings.MainFragment; import com.menny.android.anysoftkeyboard.R; - -import net.evendanan.pixel.RxProgressDialog; - -import java.io.File; import io.reactivex.disposables.Disposable; +import java.io.File; +import net.evendanan.pixel.RxProgressDialog; public class FileExplorerCreate extends AppCompatActivity { private ListView listViewFiles; private File currentFolder; private File basePath; - public void listFile(File basePath) - { + public void listFile(File basePath) { File[] files = basePath.listFiles(); - ArrayAdapter<File> adapter = new ArrayAdapter<File>(this, - R.layout.file_explorer_single_item, files); + ArrayAdapter<File> adapter = + new ArrayAdapter<File>(this, R.layout.file_explorer_single_item, files); listViewFiles.setAdapter(adapter); - //Set onclickListener for all element of listView - listViewFiles.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView<?> parent, View view, int position, long id) { - Object o = listViewFiles.getItemAtPosition(position); - if (new File(o.toString()).isDirectory()) { - currentFolder = new File(o.toString()); - setTitle(o.toString()); - listFile(currentFolder); - } - } - }); + // Set onclickListener for all element of listView + listViewFiles.setOnItemClickListener( + new AdapterView.OnItemClickListener() { + @Override + public void onItemClick( + AdapterView<?> parent, View view, int position, long id) { + Object o = listViewFiles.getItemAtPosition(position); + if (new File(o.toString()).isDirectory()) { + currentFolder = new File(o.toString()); + setTitle(o.toString()); + listFile(currentFolder); + } else if (new File(o.toString()).isFile()) + create_builder(new File(o.toString())); + } + }); } @Override public void onBackPressed() { - if (!currentFolder.equals(basePath)) - { + if (!currentFolder.equals(basePath)) { int sep = currentFolder.toString().lastIndexOf("/"); setTitle(currentFolder.toString().substring(0, sep)); - listFile(new File(currentFolder.toString().substring(0, sep))); - } - else - finish(); + currentFolder = new File(currentFolder.toString().substring(0, sep)); + listFile(currentFolder); + } else finish(); } - public void emptyFilenameError() - { + public void emptyFilenameError() { AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); alertDialogBuilder.setMessage(R.string.file_explorer_filename_empty); alertDialogBuilder.setPositiveButton(android.R.string.ok, null); @@ -71,32 +70,85 @@ public class FileExplorerCreate extends AppCompatActivity { dialog.show(); } - public Disposable launch_backup(File fileOutput) - { + public Disposable launch_backup(String fileOutput) { return RxProgressDialog.create( - new Pair<>(MainFragment.supportedProviders, MainFragment.checked), - this, - getText(R.string.take_a_while_progress_message), - R.layout.progress_window) + new Pair<>(MainFragment.supportedProviders, MainFragment.checked), + this, + getText(R.string.take_a_while_progress_message), + R.layout.progress_window) .subscribeOn(RxSchedulers.background()) .flatMap(GlobalPrefsBackup::backup) .observeOn(RxSchedulers.mainThread()) .subscribe( providerDetails -> Logger.i( - "MainFragment", + "FileExplorerCreate", "Finished backing up %s", providerDetails.provider.providerId()), e -> { Logger.w( - "MainFragment", + "FileExplorerCreate", e, "Failed to do operation due to %s", e.getMessage()); - Toast.makeText(getApplicationContext(), "Your data have failed to be saved", Toast.LENGTH_LONG).show(); + Toast.makeText( + getApplicationContext(), + this.getString(R.string.file_explorer_backup_failed), + Toast.LENGTH_LONG) + .show(); }, () -> - Toast.makeText(getApplicationContext(), "Your data have been saved to " + fileOutput.toString(), Toast.LENGTH_LONG).show()); + Toast.makeText( + getApplicationContext(), + this.getString( + R.string + .file_explorer_backup_success) + + fileOutput, + Toast.LENGTH_LONG) + .show()); + } + + public void create_builder(File outputFile) { + new AlertDialog.Builder(this) + .setTitle(R.string.file_explorer_alert_title) + .setMessage(R.string.file_explorer_backup_alert_message) + .setPositiveButton( + android.R.string.ok, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + launch_backup(outputFile.toString()); + finish(); + } + }) + .setNegativeButton(android.R.string.cancel, null) + .setIcon(android.R.drawable.ic_dialog_alert) + .show(); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.file_explorer_create_menu, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.file_explorer_menu_add_folder: + new File(currentFolder.toString() + "/askBackup").mkdir(); + Toast.makeText( + getApplicationContext(), + "Folder askBackup has been created at " + currentFolder.toString(), + Toast.LENGTH_LONG) + .show(); + listFile(currentFolder); + return true; + case R.id.file_explorer_menu_refresh: + listFile(currentFolder); + return true; + } + return false; } @Override @@ -116,21 +168,26 @@ public class FileExplorerCreate extends AppCompatActivity { listFile(basePath); - filenameButton.setOnClickListener(new View.OnClickListener() { + filenameButton.setOnClickListener( + new View.OnClickListener() { @Override public void onClick(View v) { - if (filenameTextView.length() > 0) - { - final File fileOutput = new File(currentFolder + "/" + filenameTextView.getText().toString() + ".xml"); + if (filenameTextView.length() > 0) { + final File fileOutput = + new File( + currentFolder + + "/" + + filenameTextView.getText().toString() + + ".xml"); GlobalPrefsBackup.updateCustomFilename(fileOutput); - launch_backup(fileOutput); - - finish(); - } - else - emptyFilenameError(); + if (fileOutput.exists()) create_builder(fileOutput); + else { + launch_backup(fileOutput.toString()); + finish(); + } + } else emptyFilenameError(); } - }); + }); } } diff --git a/ime/app/src/main/java/com/anysoftkeyboard/ui/FileExplorerRestore.java b/ime/app/src/main/java/com/anysoftkeyboard/ui/FileExplorerRestore.java index 8eeb66741..420996f83 100644 --- a/ime/app/src/main/java/com/anysoftkeyboard/ui/FileExplorerRestore.java +++ b/ime/app/src/main/java/com/anysoftkeyboard/ui/FileExplorerRestore.java @@ -11,105 +11,108 @@ import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; - import com.anysoftkeyboard.base.utils.Logger; import com.anysoftkeyboard.prefs.GlobalPrefsBackup; import com.anysoftkeyboard.rx.RxSchedulers; import com.anysoftkeyboard.ui.settings.MainFragment; import com.menny.android.anysoftkeyboard.R; - -import net.evendanan.pixel.RxProgressDialog; - -import java.io.File; - import io.reactivex.disposables.Disposable; +import java.io.File; +import net.evendanan.pixel.RxProgressDialog; public class FileExplorerRestore extends AppCompatActivity { private ListView listViewFiles; private File basePath; private File currentFolder; - private Disposable launch_restore() { + private Disposable launch_restore(String fileName) { return RxProgressDialog.create( - new Pair<>(MainFragment.supportedProviders, MainFragment.checked), - this, - getText(R.string.take_a_while_progress_message), - R.layout.progress_window) + new Pair<>(MainFragment.supportedProviders, MainFragment.checked), + this, + getText(R.string.take_a_while_progress_message), + R.layout.progress_window) .subscribeOn(RxSchedulers.background()) .flatMap(GlobalPrefsBackup::restore) .observeOn(RxSchedulers.mainThread()) .subscribe( providerDetails -> Logger.i( - "MainFragment", + "FileExplorerRestore", "Finished restore up %s", providerDetails.provider.providerId()), e -> { Logger.w( - "MainFragment", + "FileExplorerRestore", e, "Failed to do operation due to %s", e.getMessage()); - Toast.makeText(getApplicationContext(), "Your data have failed to be restored", Toast.LENGTH_LONG).show(); + Toast.makeText( + getApplicationContext(), + this.getString(R.string.file_explorer_restore_failed), + Toast.LENGTH_LONG) + .show(); }, () -> - Toast.makeText(getApplicationContext(), "Your data have been restored", Toast.LENGTH_LONG).show()); + Toast.makeText( + getApplicationContext(), + this.getString( + R.string + .file_explorer_restore_success) + + fileName, + Toast.LENGTH_LONG) + .show()); } - public void create_builder(){ + public void create_builder(File fileOutput) { new AlertDialog.Builder(this) - .setTitle("Select this file ?") - .setMessage("Do you want to restore this file ?") - - // The dialog is automatically dismissed when a dialog button is clicked. - .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - launch_restore(); - finish(); - } - }) - - // A null listener allows the button to dismiss the dialog and take no further action. + .setTitle(R.string.file_explorer_alert_title) + .setMessage(R.string.file_explorer_restore_alert_message) + .setPositiveButton( + android.R.string.ok, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + GlobalPrefsBackup.updateCustomFilename(fileOutput); + launch_restore(fileOutput.toString()); + finish(); + } + }) .setNegativeButton(android.R.string.cancel, null) .setIcon(android.R.drawable.ic_dialog_alert) .show(); - } - public void listFile(File basePath) - { + public void listFile(File basePath) { File[] files = basePath.listFiles(); - ArrayAdapter<File> adapter = new ArrayAdapter<File>(this, - R.layout.file_explorer_single_item, files); + ArrayAdapter<File> adapter = + new ArrayAdapter<File>(this, R.layout.file_explorer_single_item, files); listViewFiles.setAdapter(adapter); - //Set onclickListener for all element of listView - listViewFiles.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView<?> parent, View view, int position, long id) { - Object o = listViewFiles.getItemAtPosition(position); - if (new File(o.toString()).isDirectory()) { - currentFolder = new File(o.toString()); - setTitle(o.toString()); - listFile(currentFolder); - } - else if (new File(o.toString()).isFile()) - create_builder(); - } - }); + // Set onclickListener for all element of listView + listViewFiles.setOnItemClickListener( + new AdapterView.OnItemClickListener() { + @Override + public void onItemClick( + AdapterView<?> parent, View view, int position, long id) { + Object o = listViewFiles.getItemAtPosition(position); + if (new File(o.toString()).isDirectory()) { + currentFolder = new File(o.toString()); + setTitle(o.toString()); + listFile(currentFolder); + } else if (new File(o.toString()).isFile()) + create_builder(new File(o.toString())); + } + }); } @Override public void onBackPressed() { - if (!currentFolder.equals(basePath)) - { + if (!currentFolder.equals(basePath)) { int sep = currentFolder.toString().lastIndexOf("/"); setTitle(currentFolder.toString().substring(0, sep)); - listFile(new File(currentFolder.toString().substring(0, sep))); - } - else - finish(); + currentFolder = new File(currentFolder.toString().substring(0, sep)); + listFile(currentFolder); + } else finish(); } @Override @@ -127,5 +130,4 @@ public class FileExplorerRestore extends AppCompatActivity { listFile(basePath); } - } diff --git a/ime/app/src/main/java/com/anysoftkeyboard/ui/settings/MainFragment.java b/ime/app/src/main/java/com/anysoftkeyboard/ui/settings/MainFragment.java index 51e79f919..f5f728af9 100644 --- a/ime/app/src/main/java/com/anysoftkeyboard/ui/settings/MainFragment.java +++ b/ime/app/src/main/java/com/anysoftkeyboard/ui/settings/MainFragment.java @@ -54,6 +54,7 @@ import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.Disposable; import io.reactivex.disposables.Disposables; import io.reactivex.functions.Function; +import java.io.File; import java.io.InputStream; import java.io.OutputStream; import java.lang.ref.WeakReference; @@ -76,7 +77,8 @@ public class MainFragment extends Fragment { static int failedDialog; public static List<GlobalPrefsBackup.ProviderDetails> supportedProviders; public static Boolean[] checked; - static Function<Pair<List<GlobalPrefsBackup.ProviderDetails>, Boolean[]>, + static Function< + Pair<List<GlobalPrefsBackup.ProviderDetails>, Boolean[]>, ObservableSource<GlobalPrefsBackup.ProviderDetails>> action; @@ -415,15 +417,14 @@ public class MainFragment extends Fragment { mDisposable.dispose(); mDisposable = new CompositeDisposable(); - mDisposable.add(launchBackupRestore()); + mDisposable.add(launchBackupRestore(0, null)); }); builder.setNeutralButton( choosePathString, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) - { + if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Intent dataToFileChooser = new Intent(); dataToFileChooser.setType("text/xml"); dataToFileChooser.setAction(actionCustomPath); @@ -433,18 +434,17 @@ public class MainFragment extends Fragment { } catch (ActivityNotFoundException e) { Logger.e(TAG, "Could not launch the custom path activity"); Toast.makeText( - getActivity().getApplicationContext(), - R.string.toast_error_custom_path_backup, - Toast.LENGTH_LONG) - .show(); + getActivity().getApplicationContext(), + R.string.toast_error_custom_path_backup, + Toast.LENGTH_LONG) + .show(); } } else { Intent intent = null; - if (optionId == R.id.backup_prefs){ + if (optionId == R.id.backup_prefs) { intent = new Intent(getContext(), FileExplorerCreate.class); - } - else if (optionId == R.id.restore_prefs){ + } else if (optionId == R.id.restore_prefs) { intent = new Intent(getContext(), FileExplorerRestore.class); } startActivity(intent); @@ -453,7 +453,11 @@ public class MainFragment extends Fragment { }); } - private Disposable launchBackupRestore() { + private Disposable launchBackupRestore(int custom, Uri customUri) { + File filePath; + if (custom == 1) filePath = new File(customUri.getPath()); + else filePath = GlobalPrefsBackup.getBackupFile(); + return RxProgressDialog.create( new Pair<>(supportedProviders, checked), getActivity(), @@ -476,9 +480,7 @@ public class MainFragment extends Fragment { e.getMessage()); mDialogController.showDialog(failedDialog, e.getMessage()); }, - () -> - mDialogController.showDialog( - successDialog, GlobalPrefsBackup.getBackupFile())); + () -> mDialogController.showDialog(successDialog, filePath)); } public void launchRestoreCustomFileData(InputStream inputStream) { @@ -512,7 +514,7 @@ public class MainFragment extends Fragment { Logger.d(TAG, "Launching Backup"); launchBackupCustomFileData(resolver.openOutputStream(data.getData())); } - launchBackupRestore(); + launchBackupRestore(1, data.getData()); } catch (Exception e) { e.printStackTrace(); Logger.d(TAG, "Error when getting inputStream on onActivityResult"); diff --git a/ime/app/src/main/res/drawable-hdpi/ic_menu_add.png b/ime/app/src/main/res/drawable-hdpi/ic_menu_add.png Binary files differnew file mode 100644 index 000000000..9375e30cd --- /dev/null +++ b/ime/app/src/main/res/drawable-hdpi/ic_menu_add.png diff --git a/ime/app/src/main/res/drawable-hdpi/ic_menu_refresh.png b/ime/app/src/main/res/drawable-hdpi/ic_menu_refresh.png Binary files differnew file mode 100644 index 000000000..7b58598fe --- /dev/null +++ b/ime/app/src/main/res/drawable-hdpi/ic_menu_refresh.png diff --git a/ime/app/src/main/res/drawable-mdpi/ic_menu_add.png b/ime/app/src/main/res/drawable-mdpi/ic_menu_add.png Binary files differnew file mode 100644 index 000000000..f3bf34a97 --- /dev/null +++ b/ime/app/src/main/res/drawable-mdpi/ic_menu_add.png diff --git a/ime/app/src/main/res/drawable-mdpi/ic_menu_refresh.png b/ime/app/src/main/res/drawable-mdpi/ic_menu_refresh.png Binary files differnew file mode 100644 index 000000000..4b9605ebe --- /dev/null +++ b/ime/app/src/main/res/drawable-mdpi/ic_menu_refresh.png diff --git a/ime/app/src/main/res/drawable-xhdpi/ic_menu_add.png b/ime/app/src/main/res/drawable-xhdpi/ic_menu_add.png Binary files differnew file mode 100644 index 000000000..fd8e0d8ca --- /dev/null +++ b/ime/app/src/main/res/drawable-xhdpi/ic_menu_add.png diff --git a/ime/app/src/main/res/drawable-xhdpi/ic_menu_refresh.png b/ime/app/src/main/res/drawable-xhdpi/ic_menu_refresh.png Binary files differnew file mode 100644 index 000000000..2d5addc8d --- /dev/null +++ b/ime/app/src/main/res/drawable-xhdpi/ic_menu_refresh.png diff --git a/ime/app/src/main/res/drawable-xxhdpi/ic_menu_add.png b/ime/app/src/main/res/drawable-xxhdpi/ic_menu_add.png Binary files differnew file mode 100644 index 000000000..e4380b31e --- /dev/null +++ b/ime/app/src/main/res/drawable-xxhdpi/ic_menu_add.png diff --git a/ime/app/src/main/res/drawable-xxhdpi/ic_menu_refresh.png b/ime/app/src/main/res/drawable-xxhdpi/ic_menu_refresh.png Binary files differnew file mode 100644 index 000000000..8df39b56a --- /dev/null +++ b/ime/app/src/main/res/drawable-xxhdpi/ic_menu_refresh.png diff --git a/ime/app/src/main/res/drawable-xxxhdpi/ic_menu_add.png b/ime/app/src/main/res/drawable-xxxhdpi/ic_menu_add.png Binary files differnew file mode 100644 index 000000000..405a672b7 --- /dev/null +++ b/ime/app/src/main/res/drawable-xxxhdpi/ic_menu_add.png diff --git a/ime/app/src/main/res/drawable-xxxhdpi/ic_menu_refresh.png b/ime/app/src/main/res/drawable-xxxhdpi/ic_menu_refresh.png Binary files differnew file mode 100644 index 000000000..4c0269eea --- /dev/null +++ b/ime/app/src/main/res/drawable-xxxhdpi/ic_menu_refresh.png diff --git a/ime/app/src/main/res/menu/file_explorer_create_menu.xml b/ime/app/src/main/res/menu/file_explorer_create_menu.xml index a869f2191..7c08d59cc 100644 --- a/ime/app/src/main/res/menu/file_explorer_create_menu.xml +++ b/ime/app/src/main/res/menu/file_explorer_create_menu.xml @@ -2,11 +2,9 @@ <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> - <item android:id="@+id/create_folder" android:icon="@android:drawable/ic_menu_add" - android:title="@string/file_explorer_menu_add_folder" app:showAsAction="never|withText" /> - - <item android:id="@+id/refresh_folder" android:icon="@android:drawable/ic_menu_view" - android:title="@string/file_explorer_menu_refresh" - app:showAsAction="never|withText" /> + <item android:id="@+id/file_explorer_menu_add_folder" android:icon="@drawable/ic_menu_add" + android:title="@string/file_explorer_menu_add_folder" app:showAsAction="ifRoom|never" /> + <item android:id="@+id/file_explorer_menu_refresh" android:icon="@drawable/ic_menu_refresh" + android:title="@string/file_explorer_menu_add_folder" app:showAsAction="ifRoom|never" /> </menu>
\ No newline at end of file diff --git a/ime/app/src/main/res/values/strings.xml b/ime/app/src/main/res/values/strings.xml index cfdba833c..b1307e588 100644 --- a/ime/app/src/main/res/values/strings.xml +++ b/ime/app/src/main/res/values/strings.xml @@ -740,9 +740,16 @@ <string name="file_explorer_menu_refresh">Refresh</string> <string name="file_explorer_filename">Backup filename...</string> <string name="file_explorer_filename_empty">Filename cannot be empty...</string> + <string name="file_explorer_alert_title">Select this file ?</string> + <string name="file_explorer_restore_alert_message">Do you want to restore this file ?</string> + <string name="file_explorer_backup_alert_message">This file will be overwritten.</string> - <string name="about_additional_software_licenses">Additional Software Licenses</string> + <string name="file_explorer_backup_success">Your data have been saved to\u0020</string> + <string name="file_explorer_backup_failed">Your data have failed to ba saved.</string> + <string name="file_explorer_restore_success">Your data have been restored from\u0020</string> + <string name="file_explorer_restore_failed">Your data have failed to be restored.</string> + <string name="about_additional_software_licenses">Additional Software Licenses</string> <string name="setup_wizard_step_one_title">Enable AnySoftKeyboard</string> <string name="setup_wizard_step_one_details">In this step, you\'ll need to enable <i> |
