[
  {
    "path": ".gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n/.idea*\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2017 Yaroslav Berezanskyi\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# Changing the Language in Android Apps\n\nThe repository contains 2 approaches for changing a locale in android apps.\n`ignore_deprecation` branch is more easier and flexible approach despite using some deprecated API.\n\nArticle on Medium:\nhttps://proandroiddev.com/change-language-programmatically-at-runtime-on-android-5e6bc15c758\n"
  },
  {
    "path": "app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "app/build.gradle",
    "content": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 28\n    buildToolsVersion \"28.0.3\"\n    defaultConfig {\n        applicationId \"com.yariksoffice.languagetest\"\n        minSdkVersion 15\n        targetSdkVersion 28\n        versionCode 1\n        versionName \"1.0\"\n    }\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n        incremental true\n    }\n}\n\ndependencies {\n    implementation 'androidx.appcompat:appcompat:1.0.2'\n    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'\n}\n"
  },
  {
    "path": "app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /Users/yari/Library/Android/sdk/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile\n"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"com.yariksoffice.languagetest\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n\n    <application\n        android:name=\".App\"\n        android:allowBackup=\"true\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:roundIcon=\"@mipmap/ic_launcher_round\"\n        android:supportsRtl=\"false\"\n        android:theme=\"@style/AppTheme\">\n\n        <activity\n            android:name=\".ui.MainActivity\"\n            android:label=\"@string/app_name\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\".ui.SettingsActivity\"\n            android:label=\"@string/settings_label\" />\n        <activity\n            android:name=\".ui.TestActivity1\"\n            android:label=\"@string/activity_1_label\" />\n        <activity\n            android:name=\".ui.TestActivity2\"\n            android:label=\"@string/activity_2_label\" />\n        <activity\n            android:name=\".ui.WebViewActivity\"\n            android:label=\"@string/activity_web_view_label\" />\n\n        <service\n            android:name=\".TestService\"\n            android:exported=\"false\" />\n    </application>\n\n</manifest>"
  },
  {
    "path": "app/src/main/java/com/yariksoffice/languagetest/App.java",
    "content": "package com.yariksoffice.languagetest;\n\nimport android.app.Application;\nimport android.content.Context;\nimport android.content.res.Configuration;\nimport android.util.Log;\n\npublic class App extends Application {\n\n    public static final String TAG = \"App\";\n\n    // for the sake of simplicity. use DI in real apps instead\n    public static LocaleManager localeManager;\n\n    @Override\n    public void onCreate() {\n        super.onCreate();\n        Utility.bypassHiddenApiRestrictions();\n    }\n\n    @Override\n    protected void attachBaseContext(Context base) {\n        localeManager = new LocaleManager(base);\n        super.attachBaseContext(localeManager.setLocale(base));\n        Log.d(TAG, \"attachBaseContext\");\n    }\n\n    @Override\n    public void onConfigurationChanged(Configuration newConfig) {\n        super.onConfigurationChanged(newConfig);\n        localeManager.setLocale(this);\n        Log.d(TAG, \"onConfigurationChanged: \" + newConfig.locale.getLanguage());\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/yariksoffice/languagetest/LocaleManager.java",
    "content": "package com.yariksoffice.languagetest;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport android.content.res.Configuration;\nimport android.content.res.Resources;\nimport android.os.Build;\nimport android.os.LocaleList;\nimport android.preference.PreferenceManager;\n\nimport java.util.LinkedHashSet;\nimport java.util.Locale;\nimport java.util.Set;\n\nimport androidx.annotation.RequiresApi;\n\nimport static android.os.Build.VERSION_CODES.JELLY_BEAN_MR1;\nimport static android.os.Build.VERSION_CODES.N;\n\npublic class LocaleManager {\n\n    public static final  String LANGUAGE_ENGLISH   = \"en\";\n    public static final  String LANGUAGE_UKRAINIAN = \"uk\";\n    public static final  String LANGUAGE_RUSSIAN   = \"ru\";\n    private static final String LANGUAGE_KEY       = \"language_key\";\n\n    private final SharedPreferences prefs;\n\n    public LocaleManager(Context context) {\n        prefs = PreferenceManager.getDefaultSharedPreferences(context);\n    }\n\n    public Context setLocale(Context c) {\n        return updateResources(c, getLanguage());\n    }\n\n    public Context setNewLocale(Context c, String language) {\n        persistLanguage(language);\n        return updateResources(c, language);\n    }\n\n    public String getLanguage() {\n        return prefs.getString(LANGUAGE_KEY, LANGUAGE_ENGLISH);\n    }\n\n    @SuppressLint(\"ApplySharedPref\")\n    private void persistLanguage(String language) {\n        // use commit() instead of apply(), because sometimes we kill the application process\n        // immediately that prevents apply() from finishing\n        prefs.edit().putString(LANGUAGE_KEY, language).commit();\n    }\n\n    private Context updateResources(Context context, String language) {\n        Locale locale = new Locale(language);\n        Locale.setDefault(locale);\n\n        Resources res = context.getResources();\n        Configuration config = new Configuration(res.getConfiguration());\n        if (Utility.isAtLeastVersion(N)) {\n            setLocaleForApi24(config, locale);\n            context = context.createConfigurationContext(config);\n        } else if (Utility.isAtLeastVersion(JELLY_BEAN_MR1)) {\n            config.setLocale(locale);\n            context = context.createConfigurationContext(config);\n        } else {\n            config.locale = locale;\n            res.updateConfiguration(config, res.getDisplayMetrics());\n        }\n        return context;\n    }\n\n    @RequiresApi(api = N)\n    private void setLocaleForApi24(Configuration config, Locale target) {\n        Set<Locale> set = new LinkedHashSet<>();\n        // bring the target locale to the front of the list\n        set.add(target);\n\n        LocaleList all = LocaleList.getDefault();\n        for (int i = 0; i < all.size(); i++) {\n            // append other locales supported by the user\n            set.add(all.get(i));\n        }\n\n        Locale[] locales = set.toArray(new Locale[0]);\n        config.setLocales(new LocaleList(locales));\n    }\n\n    public static Locale getLocale(Resources res) {\n        Configuration config = res.getConfiguration();\n        return Utility.isAtLeastVersion(N) ? config.getLocales().get(0) : config.locale;\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/yariksoffice/languagetest/TestService.java",
    "content": "package com.yariksoffice.languagetest;\n\nimport android.app.Service;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.os.IBinder;\nimport androidx.annotation.Nullable;\nimport android.util.Log;\nimport android.widget.Toast;\n\nimport java.util.Locale;\n\npublic class TestService extends Service {\n\n    private final String TAG = \"TestService\";\n\n    @Override\n    protected void attachBaseContext(Context base) {\n        super.attachBaseContext(App.localeManager.setLocale(base));\n        Log.d(TAG, \"attachBaseContext\");\n    }\n\n    @Override\n    public void onCreate() {\n        super.onCreate();\n        Log.d(TAG, \"onCreate\");\n\n        Locale locale = LocaleManager.getLocale(getResources());\n        String message = locale.getLanguage() + \" \" + Utility.hexString(getResources());\n        Toast.makeText(this, message, Toast.LENGTH_LONG).show();\n\n        stopSelf();\n    }\n\n    @Nullable\n    @Override\n    public IBinder onBind(Intent intent) {\n        return null;\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/yariksoffice/languagetest/Utility.java",
    "content": "package com.yariksoffice.languagetest;\n\nimport android.app.Activity;\nimport android.content.pm.ActivityInfo;\nimport android.content.pm.PackageManager.NameNotFoundException;\nimport android.content.res.Resources;\nimport android.os.Build;\nimport android.util.Log;\n\nimport java.lang.ref.WeakReference;\nimport java.lang.reflect.Field;\nimport java.lang.reflect.Method;\nimport java.util.Map;\nimport java.util.Map.Entry;\n\nimport static android.content.pm.PackageManager.GET_META_DATA;\nimport static android.os.Build.VERSION_CODES.P;\nimport static com.yariksoffice.languagetest.App.TAG;\n\npublic class Utility {\n\n    public static String hexString(Resources res) {\n        Object resImpl = getPrivateField(\"android.content.res.Resources\", \"mResourcesImpl\", res);\n        Object o = resImpl != null ? resImpl : res;\n        return \"@\" + Integer.toHexString(o.hashCode());\n    }\n\n    public static Object getPrivateField(String className, String fieldName, Object object) {\n        try {\n            Class c = Class.forName(className);\n            Field f = c.getDeclaredField(fieldName);\n            f.setAccessible(true);\n            return f.get(object);\n        } catch (Throwable e) {\n            e.printStackTrace();\n            return null;\n        }\n    }\n\n    public static void bypassHiddenApiRestrictions() {\n        // http://weishu.me/2019/03/16/another-free-reflection-above-android-p/\n        if (!isAtLeastVersion(P)) return;\n        try {\n            Method forName = Class.class.getDeclaredMethod(\"forName\", String.class);\n            Method getDeclaredMethod = Class.class.getDeclaredMethod(\"getDeclaredMethod\",\n                    String.class, Class[].class);\n\n            Class<?> vmRuntimeClass = (Class<?>) forName.invoke(null, \"dalvik.system.VMRuntime\");\n            Method getRuntime = (Method) getDeclaredMethod.invoke(vmRuntimeClass, \"getRuntime\",\n                    null);\n            Method setHiddenApiExemptions = (Method) getDeclaredMethod.invoke(vmRuntimeClass,\n                    \"setHiddenApiExemptions\", new Class[]{ String[].class });\n            Object sVmRuntime = getRuntime.invoke(null);\n\n            setHiddenApiExemptions.invoke(sVmRuntime, new Object[]{ new String[]{ \"L\" } });\n        } catch (Throwable e) {\n            Log.e(TAG, \"Reflect bootstrap failed:\", e);\n        }\n    }\n\n\n    public static void resetActivityTitle(Activity a) {\n        try {\n            ActivityInfo info = a.getPackageManager().getActivityInfo(a.getComponentName(), GET_META_DATA);\n            if (info.labelRes != 0) {\n                a.setTitle(info.labelRes);\n            }\n        } catch (NameNotFoundException e) {\n            e.printStackTrace();\n        }\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    public static String getTitleCache() {\n        try {\n            Object o = Utility.getPrivateField(\"android.app.ApplicationPackageManager\", \"sStringCache\", null);\n            Map<?, WeakReference<CharSequence>> cache = (Map<?, WeakReference<CharSequence>>) o;\n            if (cache == null) return \"\";\n\n            StringBuilder builder = new StringBuilder(\"Cache:\").append(\"\\n\");\n            for (Entry<?, WeakReference<CharSequence>> e : cache.entrySet()) {\n                CharSequence title = e.getValue().get();\n                if (title != null) {\n                    builder.append(title).append(\"\\n\");\n                }\n            }\n            return builder.toString();\n        } catch (Exception e) {\n            // https://developer.android.com/about/versions/pie/restrictions-non-sdk-interfaces\n            return \"Can't access title cache\";\n        }\n    }\n\n    public static Resources getTopLevelResources(Activity a) {\n        try {\n            return a.getPackageManager().getResourcesForApplication(a.getApplicationInfo());\n        } catch (NameNotFoundException e) {\n            throw new RuntimeException(e);\n        }\n    }\n\n    public static boolean isAtLeastVersion(int version) {\n        return Build.VERSION.SDK_INT >= version;\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/yariksoffice/languagetest/WebViewLocaleHelper.java",
    "content": "package com.yariksoffice.languagetest;\n\nimport android.content.Context;\nimport android.webkit.WebView;\n\n/**\n * WebViewLocaleHelper implements a workaround that fixes the unwanted side effect while\n * using a WebView introduced in Android N.\n *\n * For unknown reasons, the very first creation of a WebView (either programmatically\n * or via inflation) resets an application locale to the device default.\n * More on that: https://issuetracker.google.com/issues/37113860\n */\npublic class WebViewLocaleHelper {\n\n    private boolean requireWorkaround = true;\n\n    public void implementWorkaround(Context context) {\n        if (requireWorkaround) {\n            requireWorkaround = false;\n            new WebView(context).destroy();\n            App.localeManager.setLocale(context);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/yariksoffice/languagetest/ui/BaseActivity.java",
    "content": "package com.yariksoffice.languagetest.ui;\n\nimport android.content.Context;\nimport android.content.res.Resources;\nimport android.graphics.drawable.Drawable;\nimport android.os.Bundle;\nimport androidx.annotation.Nullable;\nimport androidx.core.content.ContextCompat;\nimport androidx.appcompat.app.AppCompatActivity;\nimport android.util.Log;\nimport android.view.MenuItem;\nimport android.widget.TextView;\n\nimport com.yariksoffice.languagetest.App;\nimport com.yariksoffice.languagetest.LocaleManager;\nimport com.yariksoffice.languagetest.R;\nimport com.yariksoffice.languagetest.Utility;\n\nimport java.util.Locale;\n\nimport static com.yariksoffice.languagetest.LocaleManager.LANGUAGE_ENGLISH;\nimport static com.yariksoffice.languagetest.LocaleManager.LANGUAGE_RUSSIAN;\nimport static com.yariksoffice.languagetest.LocaleManager.LANGUAGE_UKRAINIAN;\n\npublic abstract class BaseActivity extends AppCompatActivity {\n\n    private static final String TAG = \"BaseActivity\";\n\n    @Override\n    protected void attachBaseContext(Context base) {\n        super.attachBaseContext(App.localeManager.setLocale(base));\n        Log.d(TAG, \"attachBaseContext\");\n    }\n\n    @Override\n    protected void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        Log.d(TAG, \"onCreate\");\n        Utility.resetActivityTitle(this);\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        if (item.getItemId() == android.R.id.home) {\n            finish();\n            return true;\n        } else {\n            return super.onOptionsItemSelected(item);\n        }\n    }\n\n    @Override\n    protected void onResume() {\n        super.onResume();\n        showResourcesInfo();\n\n        TextView tv = findViewById(R.id.cache);\n        tv.setText(Utility.getTitleCache());\n    }\n\n    private void showResourcesInfo() {\n        Resources topLevelRes = Utility.getTopLevelResources(this);\n        updateInfo(\"Top level  \", findViewById(R.id.tv1), topLevelRes);\n\n        Resources appRes = getApplication().getResources();\n        updateInfo(\"Application  \", findViewById(R.id.tv2), appRes);\n\n        Resources actRes = getResources();\n        updateInfo(\"Activity  \", findViewById(R.id.tv3), actRes);\n\n        TextView tv4 = findViewById(R.id.tv4);\n        String defLanguage = Locale.getDefault().getLanguage();\n        tv4.setText(String.format(\"Locale.getDefault() - %s\", defLanguage));\n        tv4.setCompoundDrawablesWithIntrinsicBounds(null, null, getLanguageDrawable(defLanguage), null);\n    }\n\n    private void updateInfo(String title, TextView tv, Resources res) {\n        Locale l = LocaleManager.getLocale(res);\n        tv.setText(title + Utility.hexString(res) + String.format(\" - %s\", l.getLanguage()));\n        Drawable icon = getLanguageDrawable(l.getLanguage());\n        tv.setCompoundDrawablesWithIntrinsicBounds(null, null, icon, null);\n    }\n\n    private Drawable getLanguageDrawable(String language) {\n        switch (language) {\n            case LANGUAGE_ENGLISH:\n                return ContextCompat.getDrawable(this, R.drawable.language_en);\n            case LANGUAGE_UKRAINIAN:\n                return ContextCompat.getDrawable(this, R.drawable.language_uk);\n            case LANGUAGE_RUSSIAN:\n                return ContextCompat.getDrawable(this, R.drawable.language_ru);\n            default:\n                Log.w(TAG, \"Unsupported language\");\n                return null;\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/yariksoffice/languagetest/ui/MainActivity.java",
    "content": "package com.yariksoffice.languagetest.ui;\n\nimport android.content.Intent;\nimport android.os.Bundle;\nimport androidx.annotation.Nullable;\nimport android.widget.TextView;\n\nimport com.yariksoffice.languagetest.R;\nimport com.yariksoffice.languagetest.TestService;\nimport com.yariksoffice.languagetest.WebViewLocaleHelper;\n\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\n\npublic class MainActivity extends BaseActivity {\n\n    @Override\n    protected void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.main_activity);\n\n        WebViewLocaleHelper helper = new WebViewLocaleHelper();\n\n        findViewById(R.id.activity_1).setOnClickListener(v -> startActivity(new Intent(this, TestActivity1.class)));\n        findViewById(R.id.activity_2).setOnClickListener(v -> startActivity(new Intent(this, TestActivity2.class)));\n        findViewById(R.id.web_view).setOnClickListener(v -> {\n            helper.implementWorkaround(this);\n            startActivity(new Intent(this, WebViewActivity.class));\n        });\n        findViewById(R.id.service).setOnClickListener(v -> startService(new Intent(this, TestService.class)));\n        findViewById(R.id.settings).setOnClickListener(v -> startActivity(new Intent(this, SettingsActivity.class)));\n\n        TextView tv = findViewById(R.id.hello);\n        String date = SimpleDateFormat.getDateInstance().format(new Date());\n        tv.setText(getString(R.string.hello, date));\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/yariksoffice/languagetest/ui/SettingsActivity.java",
    "content": "package com.yariksoffice.languagetest.ui;\n\nimport android.content.Intent;\nimport android.os.Bundle;\nimport androidx.annotation.Nullable;\nimport android.widget.Toast;\n\nimport com.yariksoffice.languagetest.App;\nimport com.yariksoffice.languagetest.R;\n\nimport static com.yariksoffice.languagetest.LocaleManager.LANGUAGE_ENGLISH;\nimport static com.yariksoffice.languagetest.LocaleManager.LANGUAGE_RUSSIAN;\nimport static com.yariksoffice.languagetest.LocaleManager.LANGUAGE_UKRAINIAN;\n\npublic class SettingsActivity extends BaseActivity {\n\n    @Override\n    protected void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.settings_activity);\n        //noinspection ConstantConditions\n        getSupportActionBar().setDisplayHomeAsUpEnabled(true);\n\n        findViewById(R.id.en).setOnClickListener(v -> setNewLocale(LANGUAGE_ENGLISH, false));\n        findViewById(R.id.en).setOnLongClickListener(v -> setNewLocale(LANGUAGE_ENGLISH, true));\n        findViewById(R.id.ukr).setOnClickListener(v -> setNewLocale(LANGUAGE_UKRAINIAN, false));\n        findViewById(R.id.ukr).setOnLongClickListener(v -> setNewLocale(LANGUAGE_UKRAINIAN, true));\n        findViewById(R.id.ru).setOnClickListener(v -> setNewLocale(LANGUAGE_RUSSIAN, false));\n        findViewById(R.id.ru).setOnLongClickListener(v -> setNewLocale(LANGUAGE_RUSSIAN, true));\n    }\n\n    private boolean setNewLocale(String language, boolean restartProcess) {\n        App.localeManager.setNewLocale(this, language);\n\n        Intent i = new Intent(this, MainActivity.class);\n        startActivity(i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK));\n\n        if (restartProcess) {\n            System.exit(0);\n        } else {\n            Toast.makeText(this, \"Activity restarted\", Toast.LENGTH_SHORT).show();\n        }\n        return true;\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/yariksoffice/languagetest/ui/TestActivity1.java",
    "content": "package com.yariksoffice.languagetest.ui;\n\nimport android.os.Bundle;\nimport androidx.annotation.Nullable;\n\nimport com.yariksoffice.languagetest.R;\n\npublic class TestActivity1 extends BaseActivity {\n\n    @Override\n    protected void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.test_activity_1);\n        //noinspection ConstantConditions\n        getSupportActionBar().setDisplayHomeAsUpEnabled(true);\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/yariksoffice/languagetest/ui/TestActivity2.java",
    "content": "package com.yariksoffice.languagetest.ui;\n\nimport android.os.Bundle;\nimport androidx.annotation.Nullable;\n\nimport com.yariksoffice.languagetest.R;\n\npublic class TestActivity2 extends BaseActivity {\n\n    @Override\n    protected void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.test_activity_2);\n        //noinspection ConstantConditions\n        getSupportActionBar().setDisplayHomeAsUpEnabled(true);\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/yariksoffice/languagetest/ui/WebViewActivity.java",
    "content": "package com.yariksoffice.languagetest.ui;\n\nimport android.os.Bundle;\nimport android.webkit.WebView;\n\nimport com.yariksoffice.languagetest.R;\n\nimport androidx.annotation.Nullable;\n\npublic class WebViewActivity extends BaseActivity {\n\n    @Override\n    protected void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.web_view_activity);\n        //noinspection ConstantConditions\n        getSupportActionBar().setDisplayHomeAsUpEnabled(true);\n\n        WebView webView = findViewById(R.id.web_view);\n        webView.loadUrl(\"https://www.google.com/\");\n    }\n}"
  },
  {
    "path": "app/src/main/res/drawable/language_en.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"16dp\"\n    android:height=\"16dp\"\n    android:viewportHeight=\"50.0\"\n    android:viewportWidth=\"50.0\">\n    <path\n        android:fillColor=\"#292F6F\"\n        android:pathData=\"M42.5,7.67C39.21,4.2 34.87,1.73 30.07,0.67L30.07,16.13L42.5,7.67ZM47.37,35.13C47.9,33.93 48.29,32.73 48.62,31.47L42.04,31.47L47.37,35.13L47.37,35.13ZM48.62,18.67C48.29,17.47 47.9,16.27 47.37,15.13L42.1,18.67L48.62,18.67ZM19.54,0.67C14.83,1.72 10.53,4.13 7.17,7.6L19.54,16L19.54,0.67ZM2.24,15C1.71,16.2 1.32,17.4 0.99,18.67L7.57,18.67L2.24,15L2.24,15ZM7.11,42.47C10.4,45.93 14.74,48.4 19.54,49.47L19.54,34.07L7.11,42.47ZM30.07,49.47C34.78,48.42 39.08,46.01 42.43,42.53L30.07,34.07L30.07,49.47L30.07,49.47ZM0.92,31.47C1.25,32.67 1.64,33.87 2.17,35L7.43,31.47L0.92,31.47Z\" />\n    <path\n        android:fillColor=\"#FFF\"\n        android:pathData=\"M30.07,31.47L30.07,34.07L42.43,42.53C43.57,41.37 44.58,40.1 45.46,38.73L34.93,31.47L30.07,31.47L30.07,31.47ZM39.74,31.47L46.78,36.33C46.97,35.93 47.17,35.53 47.37,35.07L42.04,31.4L39.74,31.4L39.74,31.47L39.74,31.47ZM7.37,31.47L2.11,35C2.7,36.33 3.36,37.67 4.14,38.87L15.13,31.47L7.37,31.47ZM19.54,31.8L5.85,41.07C6.25,41.53 6.71,42 7.1,42.47L19.54,34L19.54,31.8ZM10.4,18.67L2.89,13.6C2.63,14.07 2.43,14.53 2.24,15.07L7.57,18.73L10.4,18.73L10.4,18.67ZM42.17,18.67L47.43,15.13C46.84,13.8 46.18,12.53 45.39,11.33L34.47,18.67L42.17,18.67ZM19.54,18.67L19.54,16L7.17,7.53C6.12,8.67 5.13,9.87 4.28,11.13L15.26,18.67L19.54,18.67L19.54,18.67ZM30.07,18.4L43.75,9.07C43.35,8.6 42.9,8.07 42.5,7.67L30.07,16.07L30.07,18.4L30.07,18.4Z\" />\n    <path\n        android:fillColor=\"#E21013\"\n        android:pathData=\"M19.54,31.47L15.13,31.47L4.21,38.87C4.74,39.67 5.26,40.4 5.86,41.07L19.54,31.8L19.54,31.47L19.54,31.47ZM30.07,18.67L34.54,18.67L45.4,11.27C44.87,10.47 44.34,9.73 43.75,9.07L30.07,18.4L30.07,18.67L30.07,18.67ZM34.93,31.47L45.46,38.73C45.99,37.93 46.38,37.13 46.84,36.33L39.8,31.47L34.93,31.47ZM15.26,18.67L4.28,11.2C3.74,11.95 3.28,12.76 2.89,13.6L10.4,18.67L15.26,18.67Z\" />\n    <path\n        android:fillColor=\"#FFF\"\n        android:pathData=\"M0.4,28.87C0.53,29.73 0.72,30.6 0.92,31.47L19.54,31.47L19.54,49.53C20.2,49.67 20.92,49.8 21.65,49.87L21.65,28.87L0.4,28.87ZM49.15,21.2C49.01,20.33 48.81,19.53 48.62,18.73L30,18.73L30,0.67C29.34,0.53 28.68,0.4 28.03,0.33L28.03,21.2L49.15,21.2L49.15,21.2ZM28.03,49.87C28.68,49.8 29.34,49.67 30,49.53L30,31.47L48.55,31.47C48.75,30.6 48.95,29.73 49.08,28.87L28.03,28.87L28.03,49.87ZM21.65,0.27C20.92,0.33 20.26,0.47 19.54,0.6L19.54,18.67L0.99,18.67C0.79,19.47 0.59,20.33 0.46,21.13L21.65,21.13L21.65,0.27Z\" />\n    <path\n        android:fillColor=\"#E21013\"\n        android:pathData=\"M28.03,28.87L49.15,28.87C49.34,27.67 49.41,26.4 49.41,25.07C49.41,23.73 49.28,22.47 49.08,21.2L28.03,21.2L28.03,0.27C26.94,0.13 25.84,0.07 24.74,0.07C23.68,0.07 22.63,0.13 21.58,0.27L21.58,21.13L0.4,21.13C0.2,22.4 0.06,23.73 0.06,25C0.06,26.27 0.2,27.53 0.33,28.8L21.58,28.8L21.58,49.8C22.63,49.93 23.68,50 24.74,50C25.85,50 26.91,49.93 28.03,49.8L28.03,28.87L28.03,28.87Z\" />\n</vector>"
  },
  {
    "path": "app/src/main/res/drawable/language_ru.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"16dp\"\n    android:height=\"16dp\"\n    android:viewportWidth=\"512\"\n    android:viewportHeight=\"512\">\n    <path\n        android:fillColor=\"#F0F0F0\"\n        android:pathData=\"M256,256m-256,0a256,256 0,1 1,512 0a256,256 0,1 1,-512 0\" />\n    <path\n        android:fillColor=\"#0052B4\"\n        android:pathData=\"M496.077,345.043C506.368,317.31 512,287.314 512,256s-5.632,-61.31 -15.923,-89.043H15.923C5.633,194.69 0,224.686 0,256s5.633,61.31 15.923,89.043L256,367.304L496.077,345.043z\" />\n    <path\n        android:fillColor=\"#D80027\"\n        android:pathData=\"M256,512c110.071,0 203.906,-69.472 240.077,-166.957H15.923C52.094,442.528 145.929,512 256,512z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/language_uk.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"16dp\"\n    android:height=\"16dp\"\n    android:viewportHeight=\"50.0\"\n    android:viewportWidth=\"50.0\">\n    <path\n        android:fillColor=\"#FFD500\"\n        android:pathData=\"M0.4,25C0.4,38.62 11.45,49.67 25.07,49.67L25.13,49.67C38.75,49.67 49.74,38.62 49.74,25L0.4,25Z\" />\n    <path\n        android:fillColor=\"#4A90E2\"\n        android:pathData=\"M0.4,25L49.74,25C49.74,11.38 38.68,0.33 25.13,0.33L25.07,0.33C11.45,0.33 0.4,11.38 0.4,25Z\" />\n</vector>"
  },
  {
    "path": "app/src/main/res/layout/locale_info.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<merge xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    tools:showIn=\"@layout/main_activity\">\n\n    <TextView\n        android:id=\"@+id/cache\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginLeft=\"8dp\"\n        android:layout_marginTop=\"8dp\"\n        android:textSize=\"12sp\"\n        app:layout_constraintLeft_toLeftOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:text=\"Cache\" />\n\n    <TextView\n        android:id=\"@+id/resources\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginRight=\"8dp\"\n        android:layout_marginTop=\"8dp\"\n        android:text=\"Resources:\"\n        android:textSize=\"12sp\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <TextView\n        android:id=\"@+id/tv1\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginRight=\"8dp\"\n        android:drawablePadding=\"8dp\"\n        android:textSize=\"12sp\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/resources\"\n        tools:drawableRight=\"@drawable/language_en\"\n        tools:text=\"Test\" />\n\n    <TextView\n        android:id=\"@+id/tv2\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginRight=\"8dp\"\n        android:drawablePadding=\"8dp\"\n        android:textSize=\"12sp\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/tv1\"\n        tools:drawableRight=\"@drawable/language_en\"\n        tools:text=\"Test\" />\n\n    <TextView\n        android:id=\"@+id/tv3\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginRight=\"8dp\"\n        android:drawablePadding=\"8dp\"\n        android:textSize=\"12sp\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/tv2\"\n        tools:drawableRight=\"@drawable/language_en\"\n        tools:text=\"Test\" />\n\n    <TextView\n        android:id=\"@+id/tv4\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginRight=\"8dp\"\n        android:layout_marginTop=\"8dp\"\n        android:drawablePadding=\"8dp\"\n        android:textSize=\"12sp\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/tv3\"\n        tools:drawableRight=\"@drawable/language_en\"\n        tools:text=\"Test\" />\n\n</merge>"
  },
  {
    "path": "app/src/main/res/layout/main_activity.xml",
    "content": "<ScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:fillViewport=\"true\">\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n\n        <TextView\n            android:id=\"@+id/hello\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginBottom=\"16dp\"\n            android:gravity=\"center\"\n            app:layout_constraintBottom_toTopOf=\"@+id/activity_1\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintVertical_chainStyle=\"packed\"\n            tools:text=\"Hello\" />\n\n        <Button\n            android:id=\"@+id/activity_1\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:minWidth=\"180dp\"\n            android:text=\"@string/activity_1_label\"\n            app:layout_constraintBottom_toTopOf=\"@+id/activity_2\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@+id/hello\" />\n\n        <Button\n            android:id=\"@+id/activity_2\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:minWidth=\"180dp\"\n            android:text=\"@string/activity_2_label\"\n            app:layout_constraintBottom_toTopOf=\"@+id/web_view\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@+id/activity_1\" />\n\n        <Button\n            android:id=\"@+id/web_view\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:minWidth=\"180dp\"\n            android:text=\"@string/activity_web_view_label\"\n            app:layout_constraintBottom_toTopOf=\"@+id/service\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@+id/activity_2\" />\n\n        <Button\n            android:id=\"@+id/service\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:minWidth=\"180dp\"\n            android:text=\"@string/start_service\"\n            app:layout_constraintBottom_toTopOf=\"@+id/settings\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@+id/web_view\"  />\n\n        <Button\n            android:id=\"@+id/settings\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:minWidth=\"180dp\"\n            android:text=\"@string/settings_label\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintLeft_toLeftOf=\"parent\"\n            app:layout_constraintRight_toRightOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@+id/service\" />\n\n        <include layout=\"@layout/locale_info\" />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n\n</ScrollView>\n\n"
  },
  {
    "path": "app/src/main/res/layout/settings_activity.xml",
    "content": "<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <TextView\n        android:id=\"@+id/title\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"8dp\"\n        android:gravity=\"center\"\n        android:text=\"@string/settings_tips\"\n        app:layout_constraintBottom_toTopOf=\"@+id/en\"\n        app:layout_constraintLeft_toLeftOf=\"parent\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintVertical_chainStyle=\"packed\" />\n\n    <Button\n        android:id=\"@+id/en\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:minWidth=\"150dp\"\n        android:text=\"@string/english\"\n        app:layout_constraintBottom_toTopOf=\"@+id/ukr\"\n        app:layout_constraintLeft_toLeftOf=\"parent\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/title\" />\n\n    <Button\n        android:id=\"@+id/ukr\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:minWidth=\"150dp\"\n        android:text=\"@string/ukrainian\"\n        app:layout_constraintBottom_toTopOf=\"@id/ru\"\n        app:layout_constraintLeft_toLeftOf=\"parent\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/en\" />\n\n    <Button\n        android:id=\"@+id/ru\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:minWidth=\"150dp\"\n        android:text=\"@string/russian\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintLeft_toLeftOf=\"parent\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/ukr\" />\n\n    <include layout=\"@layout/locale_info\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/test_activity_1.xml",
    "content": "<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <include layout=\"@layout/locale_info\" />\n\n    <TextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/activity_1_text\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/test_activity_2.xml",
    "content": "<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <TextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/activity_2_text\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintLeft_toLeftOf=\"parent\"\n        app:layout_constraintRight_toRightOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <include layout=\"@layout/locale_info\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/web_view_activity.xml",
    "content": "<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <WebView\n        android:id=\"@+id/web_view\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <include layout=\"@layout/locale_info\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"colorPrimaryDark\">#303F9F</color>\n    <color name=\"colorAccent\">#FF4081</color>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">Language Test</string>\n\n    <string name=\"ukrainian\">Ukrainian</string>\n    <string name=\"english\">English</string>\n    <string name=\"russian\">Russian</string>\n\n    <string name=\"hello\">Hello\\n%s</string>\n\n    <string name=\"settings_label\">Settings</string>\n\n    <string name=\"activity_1_label\">Screen 1</string>\n    <string name=\"activity_2_label\">Screen 2</string>\n    <string name=\"activity_web_view_label\">WebView</string>\n    <string name=\"activity_1_text\">Random text 1</string>\n    <string name=\"activity_2_text\">Random text 2</string>\n    <string name=\"start_service\">Start a service</string>\n    <string name=\"settings_tips\">Click for activity restart\\nLong click for application restart</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.DarkActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-ru/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">Тест локализации</string>\n    <string name=\"hello\">Привет\\n%s</string>\n\n    <string name=\"ukrainian\">Украинский</string>\n    <string name=\"english\">Английский</string>\n    <string name=\"russian\">Русский</string>\n\n    <string name=\"settings_label\">Настройки</string>\n\n    <string name=\"activity_1_label\">Экран 1</string>\n    <string name=\"activity_2_label\">Экран 2</string>\n    <string name=\"activity_web_view_label\">Браузер</string>\n    <string name=\"activity_1_text\">Какой-нибудь текст 1</string>\n    <string name=\"activity_2_text\">Какой-нибудь текст 2</string>\n    <string name=\"start_service\">Запустить Service</string>\n    <string name=\"settings_tips\">Клик для перезагрузки activity \\nДолгий клик для перезагрузки application</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-uk/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">Тест локалізації</string>\n    <string name=\"hello\">Привіт\\n%s</string>\n\n    <string name=\"ukrainian\">Українська</string>\n    <string name=\"english\">Англійська</string>\n    <string name=\"russian\">Російська</string>\n\n    <string name=\"settings_label\">Налаштування</string>\n\n    <string name=\"activity_1_label\">Екран 1</string>\n    <string name=\"activity_2_label\">Екран 2</string>\n    <string name=\"activity_web_view_label\">Браузер</string>\n    <string name=\"activity_1_text\">Який-небудь текст 1</string>\n    <string name=\"activity_2_text\">Який-небудь текст 2</string>\n    <string name=\"start_service\">Запустити Service</string>\n    <string name=\"settings_tips\">Клік для перезапуску activity \\nДовгий клік для перезапуску application</string>\n</resources>\n"
  },
  {
    "path": "build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    \n    repositories {\n        google()\n        jcenter()\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:3.2.1'\n    }\n}\n\nallprojects {\n    repositories {\n        google()\n        jcenter()\n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Thu Nov 15 11:55:15 EET 2018\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-4.6-all.zip\n"
  },
  {
    "path": "gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\nandroid.enableJetifier=true\nandroid.useAndroidX=true\norg.gradle.jvmargs=-Xmx1536m\n\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn ( ) {\n    echo \"$*\"\n}\n\ndie ( ) {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\nesac\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules\nfunction splitJvmOpts() {\n    JVM_OPTS=(\"$@\")\n}\neval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\nJVM_OPTS[${#JVM_OPTS[*]}]=\"-Dorg.gradle.appname=$APP_BASE_NAME\"\n\nexec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:init\r\n@rem Get command-line arguments, handling Windowz variants\r\n\r\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\r\nif \"%@eval[2+2]\" == \"4\" goto 4NT_args\r\n\r\n:win9xME_args\r\n@rem Slurp the command line arguments.\r\nset CMD_LINE_ARGS=\r\nset _SKIP=2\r\n\r\n:win9xME_args_slurp\r\nif \"x%~1\" == \"x\" goto execute\r\n\r\nset CMD_LINE_ARGS=%*\r\ngoto execute\r\n\r\n:4NT_args\r\n@rem Get arguments from the 4NT Shell from JP Software\r\nset CMD_LINE_ARGS=%$\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "settings.gradle",
    "content": "include ':app'\n"
  }
]