X-Git-Url: https://gitweb.stoutner.com/?a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacybrowser%2Factivities%2FAboutActivity.kt;fp=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacybrowser%2Factivities%2FAboutActivity.kt;h=94023b37028070ddba86b477e018cc9922602bff;hb=aa121d6d6df14a0425ac3b5603765dbae7e8d156;hp=0000000000000000000000000000000000000000;hpb=39fd3a6664fe15f9e050e6bb8c0ca0e125fd2f0f;p=PrivacyBrowserAndroid.git diff --git a/app/src/main/java/com/stoutner/privacybrowser/activities/AboutActivity.kt b/app/src/main/java/com/stoutner/privacybrowser/activities/AboutActivity.kt new file mode 100644 index 00000000..94023b37 --- /dev/null +++ b/app/src/main/java/com/stoutner/privacybrowser/activities/AboutActivity.kt @@ -0,0 +1,193 @@ +/* + * Copyright © 2016-2021 Soren Stoutner . + * + * This file is part of Privacy Browser . + * + * Privacy Browser is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Privacy Browser is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Privacy Browser. If not, see . + */ + +package com.stoutner.privacybrowser.activities + +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.view.WindowManager +import android.widget.EditText +import android.widget.LinearLayout + +import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.widget.Toolbar +import androidx.fragment.app.DialogFragment +import androidx.preference.PreferenceManager +import androidx.viewpager.widget.ViewPager + +import com.google.android.material.snackbar.Snackbar +import com.google.android.material.tabs.TabLayout + +import com.stoutner.privacybrowser.R +import com.stoutner.privacybrowser.adapters.AboutPagerAdapter +import com.stoutner.privacybrowser.asynctasks.SaveAboutVersionImage +import com.stoutner.privacybrowser.dialogs.SaveDialog +import com.stoutner.privacybrowser.dialogs.SaveDialog.SaveListener +import com.stoutner.privacybrowser.fragments.AboutVersionFragment + +import java.io.ByteArrayInputStream +import java.io.InputStream +import java.lang.Exception +import java.nio.charset.StandardCharsets + +class AboutActivity : AppCompatActivity(), SaveListener { + // Declare the class variables. + private lateinit var aboutPagerAdapter: AboutPagerAdapter + + companion object { + // Define the companion object constants. These can be move to being public constants once MainWebViewActivity has been converted to Kotlin. + const val BLOCKLIST_VERSIONS = "blocklist_versions" + } + + override fun onCreate(savedInstanceState: Bundle?) { + // Get a handle for the shared preferences. + val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this) + + // Get the screenshot preference. + val allowScreenshots = sharedPreferences.getBoolean(getString(R.string.allow_screenshots_key), false) + + // Disable screenshots if not allowed. + if (!allowScreenshots) { + window.addFlags(WindowManager.LayoutParams.FLAG_SECURE) + } + + // Set the theme. + setTheme(R.style.PrivacyBrowser) + + // Run the default commands. + super.onCreate(savedInstanceState) + + // Get the intent that launched the activity. + val launchingIntent = intent + + // Store the blocklist versions. + val blocklistVersions = launchingIntent.getStringArrayExtra(BLOCKLIST_VERSIONS)!! + + // Set the content view. + setContentView(R.layout.about_coordinatorlayout) + + // Get handles for the views. + val toolbar = findViewById(R.id.about_toolbar) + val aboutTabLayout = findViewById(R.id.about_tablayout) + val aboutViewPager = findViewById(R.id.about_viewpager) + + // Set the action bar. `SupportActionBar` must be used until the minimum API is >= 21. + setSupportActionBar(toolbar) + + // Get a handle for the action bar. + val actionBar = supportActionBar!! + + // Display the home arrow on action bar. + actionBar.setDisplayHomeAsUpEnabled(true) + + // Initialize the about pager adapter. + aboutPagerAdapter = AboutPagerAdapter(supportFragmentManager, applicationContext, blocklistVersions) + + // Set the view pager adapter. + aboutViewPager.adapter = aboutPagerAdapter + + // Keep all the tabs in memory. This prevents the memory usage updater from running multiple times. + aboutViewPager.offscreenPageLimit = 10 + + // Connect the tab layout to the view pager. + aboutTabLayout.setupWithViewPager(aboutViewPager) + } + + // The activity result is called after browsing for a file in the save alert dialog. + public override fun onActivityResult(requestCode: Int, resultCode: Int, returnedIntent: Intent?) { + // Run the default commands. + super.onActivityResult(requestCode, resultCode, returnedIntent) + + // Only do something if the user didn't press back from the file picker. + if (resultCode == RESULT_OK) { + // Get a handle for the save dialog fragment. + val saveDialogFragment = supportFragmentManager.findFragmentByTag(getString(R.string.save_dialog)) as DialogFragment? + + // Only update the file name if the dialog still exists. + if (saveDialogFragment != null) { + // Get a handle for the save dialog. + val saveDialog = saveDialogFragment.dialog!! + + // Get a handle for the file name edit text. + val fileNameEditText = saveDialog.findViewById(R.id.file_name_edittext) + + // Get the file name URI from the intent. + val fileNameUri = returnedIntent!!.data + + // Get the file name string from the URI. + val fileNameString = fileNameUri.toString() + + // Set the file name text. + fileNameEditText.setText(fileNameString) + + // Move the cursor to the end of the file name edit text. + fileNameEditText.setSelection(fileNameString.length) + } + } + } + + override fun onSave(saveType: Int, dialogFragment: DialogFragment) { + // Get a handle for the dialog. + val dialog = dialogFragment.dialog!! + + // Get a handle for the file name edit text. + val fileNameEditText = dialog.findViewById(R.id.file_name_edittext) + + // Get the file name string. + val fileNameString = fileNameEditText.text.toString() + + // Get a handle for the about version linear layout. + val aboutVersionLinearLayout = findViewById(R.id.about_version_linearlayout) + + // Process the save event according to the type. + when (saveType) { + SaveDialog.SAVE_ABOUT_VERSION_TEXT -> try { + // Get a handle for the about version fragment. + val aboutVersionFragment = aboutPagerAdapter.getTabFragment(0) as AboutVersionFragment + + // Get the about version text. + val aboutVersionString = aboutVersionFragment.aboutVersionString + + // Create an input stream with the contents of about version. + val aboutVersionInputStream: InputStream = ByteArrayInputStream(aboutVersionString.toByteArray(StandardCharsets.UTF_8)) + + // Open an output stream. + val outputStream = contentResolver.openOutputStream(Uri.parse(fileNameString))!! + + // Copy the input stream to the output stream. + aboutVersionInputStream.copyTo(outputStream, 2048) + + // Close the streams. + aboutVersionInputStream.close() + outputStream.close() + + // Display a snackbar with the saved about version information. + Snackbar.make(aboutVersionLinearLayout, getString(R.string.file_saved) + " " + fileNameString, Snackbar.LENGTH_SHORT).show() + } catch (exception: Exception) { + // Display a snackbar with the error message. + Snackbar.make(aboutVersionLinearLayout, getString(R.string.error_saving_file) + " " + exception.toString(), Snackbar.LENGTH_INDEFINITE).show() + } + + SaveDialog.SAVE_ABOUT_VERSION_IMAGE -> + // Save the about version image. + SaveAboutVersionImage(this, fileNameString, aboutVersionLinearLayout).execute() + } + } +} \ No newline at end of file