Display the Orbot version in About → Version if installed. Implements https://redmin...
authorSoren Stoutner <soren@stoutner.com>
Wed, 26 Apr 2017 19:00:39 +0000 (12:00 -0700)
committerSoren Stoutner <soren@stoutner.com>
Wed, 26 Apr 2017 19:00:39 +0000 (12:00 -0700)
app/src/main/java/com/stoutner/privacybrowser/fragments/AboutTabFragment.java
app/src/main/res/layout/about_tab_version.xml
app/src/main/res/values/strings.xml

index ad0708dedcc7e44546afd9b5a815984252536c8a..ee36de63511bdcf7a935197e4bdb1acbf0f28ee6 100644 (file)
@@ -91,6 +91,7 @@ public class AboutTabFragment extends Fragment {
             TextView versionSecurityPatchTextView = (TextView) tabLayout.findViewById(R.id.about_version_securitypatch);
             TextView versionWebKitTextView = (TextView) tabLayout.findViewById(R.id.about_version_webkit);
             TextView versionChromeTextView = (TextView) tabLayout.findViewById(R.id.about_version_chrome);
+            TextView versionOrbotTextView = (TextView) tabLayout.findViewById(R.id.about_version_orbot);
             TextView certificateIssuerDNTextView = (TextView) tabLayout.findViewById(R.id.about_version_certificate_issuer_dn);
             TextView certificateSubjectDNTextView = (TextView) tabLayout.findViewById(R.id.about_version_certificate_subject_dn);
             TextView certificateStartDateTextView = (TextView) tabLayout.findViewById(R.id.about_version_certificate_start_date);
@@ -137,7 +138,16 @@ public class AboutTabFragment extends Fragment {
             // Select the substring that begins after "Chrome/" and goes until the next " ".
             String chrome = userAgentString.substring(userAgentString.indexOf("Chrome/") + 7, userAgentString.indexOf(" ", userAgentString.indexOf("Chrome/")));
 
-            // Create a `SpannableStringBuilder` for each `TextView` that needs multiple colors of text.
+            // Get the Orbot version name if Orbot is installed.
+            String orbot;
+            try {
+                // Store the version name.
+                orbot = getContext().getPackageManager().getPackageInfo("org.torproject.android", PackageManager.GET_CONFIGURATIONS).versionName;
+            } catch (PackageManager.NameNotFoundException e) {  // Orbot is not installed.
+                orbot = "";
+            }
+
+            // Create a `SpannableStringBuilder` for the hardware and software `TextViews` that needs multiple colors of text.
             SpannableStringBuilder brandStringBuilder = new SpannableStringBuilder(brandLabel + brand);
             SpannableStringBuilder manufacturerStringBuilder = new SpannableStringBuilder(manufacturerLabel + manufacturer);
             SpannableStringBuilder modelStringBuilder = new SpannableStringBuilder(modelLabel + model);
@@ -181,7 +191,7 @@ public class AboutTabFragment extends Fragment {
                 SpannableStringBuilder securityPatchStringBuilder = new SpannableStringBuilder(securityPatchLabel + securityPatch);
                 securityPatchStringBuilder.setSpan(blueColorSpan, securityPatchLabel.length(), securityPatchStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
                 versionSecurityPatchTextView.setText(securityPatchStringBuilder);
-            } else { // Hide `versionSecurityPatchTextView`.
+            } else {  // SDK_INT < 23, so `versionSecurityPatchTextView` should be hidden.
                 versionSecurityPatchTextView.setVisibility(View.GONE);
             }
 
@@ -191,10 +201,20 @@ public class AboutTabFragment extends Fragment {
                 SpannableStringBuilder radioStringBuilder = new SpannableStringBuilder(radioLabel + radio);
                 radioStringBuilder.setSpan(blueColorSpan, radioLabel.length(), radioStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
                 versionRadioTextView.setText(radioStringBuilder);
-            } else { // Hide `versionRadioTextView`.
+            } else {  // This device does not have a radio, so `versionRadioTextView` should be hidden.
                 versionRadioTextView.setVisibility(View.GONE);
             }
 
+            // Only populate `versionOrbotTextView` if Orbot is installed.
+            if (!orbot.equals("")) {
+                String orbotLabel = getString(R.string.orbot) + "  ";
+                SpannableStringBuilder orbotStringBuilder = new SpannableStringBuilder(orbotLabel + orbot);
+                orbotStringBuilder.setSpan(blueColorSpan, orbotLabel.length(), orbotStringBuilder.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
+                versionOrbotTextView.setText(orbotStringBuilder);
+            } else {  // Orbot is not installed, so the `versionOrbotTextView` should be hidden.
+                versionOrbotTextView.setVisibility(View.GONE);
+            }
+
             // Display the package signature.
             try {
                 // Get the first package signature.  Suppress the lint warning about the need to be careful in implementing comparison of certificates for security purposes.
index b94a7eda1964c0ad7067b39fb1fb2a2de5337ceb..172d74d40fa6c91eb92d574cccf111407d595599 100644 (file)
               which isn't needed in this case because the `ImageView` is only decorative. -->
             <ImageView
                 android:id="@+id/about_version_icon"
-                android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
                 android:src="@mipmap/privacy_browser"
                 android:paddingTop="10dp"
                 tools:ignore="ContentDescription" />
 
             <TextView
                 android:id="@+id/about_version_privacy_browser_textview"
-                android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
                 android:text="@string/privacy_browser"
                 android:textStyle="bold"
                 android:textSize="22sp"
@@ -58,8 +58,8 @@
 
             <TextView
                 android:id="@+id/about_version_number"
-                android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
                 android:textColor="@color/blue_700"
                 android:layout_below="@id/about_version_privacy_browser_textview"
                 android:layout_toEndOf="@id/about_version_icon" />
@@ -68,8 +68,8 @@
         <!-- The purpose of this `LinearLayout` is to provide padding on the start of the `TextViews` to make them line up with `about_version_icon`.
           Although we don't need it, we have to include `android:paddingEnd` to make lint happy. -->
         <LinearLayout
-            android:layout_width="match_parent"
             android:layout_height="wrap_content"
+            android:layout_width="match_parent"
             android:orientation="vertical"
             android:paddingTop="16dp"
             android:paddingStart="4dp"
@@ -77,8 +77,8 @@
 
             <!-- Hardware. -->
             <TextView
-                android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
                 android:text="@string/hardware"
                 android:textStyle="bold"
                 android:textSize="18sp"
 
             <TextView
                 android:id="@+id/about_version_brand"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content" />
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content" />
 
             <TextView
                 android:id="@+id/about_version_manufacturer"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content" />
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content" />
 
             <TextView
                 android:id="@+id/about_version_model"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content" />
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content" />
 
             <TextView
                 android:id="@+id/about_version_device"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"/>
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content" />
 
             <TextView
                 android:id="@+id/about_version_bootloader"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content" />
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content" />
 
             <TextView
                 android:id="@+id/about_version_radio"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"/>
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content" />
 
             <!-- Software. -->
             <TextView
-                android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
                 android:text="@string/software"
                 android:textStyle="bold"
                 android:textSize="18sp"
 
             <TextView
                 android:id="@+id/about_version_android"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"/>
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content" />
 
             <TextView
                 android:id="@+id/about_version_build"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"/>
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content" />
 
             <TextView
                 android:id="@+id/about_version_securitypatch"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content" />
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content" />
 
             <TextView
                 android:id="@+id/about_version_webkit"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"/>
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content" />
 
             <TextView
                 android:id="@+id/about_version_chrome"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content" />
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content" />
+
+            <TextView
+                android:id="@+id/about_version_orbot"
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content" />
 
             <!-- Package Signature. -->
             <TextView
             <TextView
                 android:id="@+id/about_version_certificate_issuer_dn"
                 android:layout_height="wrap_content"
-                android:layout_width="wrap_content"/>
+                android:layout_width="wrap_content" />
 
             <TextView
                 android:id="@+id/about_version_certificate_subject_dn"
                 android:layout_height="wrap_content"
-                android:layout_width="wrap_content"/>
+                android:layout_width="wrap_content" />
 
             <TextView
                 android:id="@+id/about_version_certificate_start_date"
                 android:layout_height="wrap_content"
-                android:layout_width="wrap_content"/>
+                android:layout_width="wrap_content" />
 
             <TextView
                 android:id="@+id/about_version_certificate_end_date"
                 android:layout_height="wrap_content"
-                android:layout_width="wrap_content"/>
+                android:layout_width="wrap_content" />
 
             <TextView
                 android:id="@+id/about_version_certificate_version"
                 android:layout_height="wrap_content"
-                android:layout_width="wrap_content"/>
+                android:layout_width="wrap_content" />
 
             <TextView
                 android:id="@+id/about_version_certificate_serial_number"
                 android:layout_height="wrap_content"
-                android:layout_width="wrap_content"/>
+                android:layout_width="wrap_content" />
 
             <TextView
                 android:id="@+id/about_version_certificate_signature_algorithm"
                 android:layout_height="wrap_content"
-                android:layout_width="wrap_content"/>
+                android:layout_width="wrap_content" />
         </LinearLayout>
     </LinearLayout>
 </ScrollView>
\ No newline at end of file
index f8dcdb2f3c0d287b322fc28b16e81e9381f55603..9264fbf66d9107b00317f1c7928fdfe83f8be4e2 100644 (file)
             <string name="security_patch">Security Patch:</string>
             <string name="webkit">WebKit:</string>
             <string name="chrome">Chrome:</string>
+            <string name="orbot">Orbot:</string>
         <string name="package_signature">Package Signature</string>
             <string name="issuer_dn">Issuer DN:</string>
             <string name="subject_dn">Subject DN:</string>