[tor-commits] [orbot/master] implement app configuration screens

n8fr8 at torproject.org n8fr8 at torproject.org
Tue Apr 28 21:05:00 UTC 2020


commit 285d77e9e337e2ea5a53421411b5f989a3768fda
Author: n8fr8 <nathan at guardianproject.info>
Date:   Wed Sep 4 11:45:39 2019 -0400

    implement app configuration screens
---
 app-mini/build.gradle                              |   6 +-
 app-mini/src/main/AndroidManifest.xml              |  92 +++++++++--------
 .../torproject/android/mini/MiniMainActivity.java  |  64 +++++++-----
 .../android/mini/ui/AppConfigActivity.java         | 102 +++++++++++++++++++
 .../android/mini/ui/AppManagerActivity.java        |  21 +---
 .../mini/ui/onboarding/OnboardingActivity.java     |   8 +-
 .../src/main/res/layout/activity_app_config.xml    |  26 +++++
 .../src/main/res/layout/content_app_config.xml     | 111 +++++++++++++++++++++
 app-mini/src/main/res/menu/app_config.xml          |  32 ++++++
 app-mini/src/main/res/values/strings.xml           |  15 ++-
 app-mini/src/main/res/values/styles.xml            |   5 +
 11 files changed, 380 insertions(+), 102 deletions(-)

diff --git a/app-mini/build.gradle b/app-mini/build.gradle
index 0ffb405d..ea8a8d22 100644
--- a/app-mini/build.gradle
+++ b/app-mini/build.gradle
@@ -11,7 +11,7 @@ def keystoreProperties = new Properties()
 keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
 
 android {
-   signingConfigs {
+    signingConfigs {
         release {
             keyAlias keystoreProperties['keyAlias']
             keyPassword keystoreProperties['keyPassword']
@@ -100,11 +100,12 @@ dependencies {
     implementation 'com.github.apl-devs:appintro:v4.2.2'
     implementation 'com.android.support:palette-v7:28.0.0'
     implementation 'com.github.javiersantos:AppUpdater:2.7'
+    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
     androidTestImplementation "tools.fastlane:screengrab:1.2.0"
 }
 
 // Map for the version code that gives each ABI a value.
-ext.abiCodes = ['armeabi-v7a':'1', 'arm64-v8a':'2', 'mips':'3', 'x86':'4', 'x86_64':'5']
+ext.abiCodes = ['armeabi-v7a': '1', 'arm64-v8a': '2', 'mips': '3', 'x86': '4', 'x86_64': '5']
 
 import com.android.build.OutputFile
 
@@ -119,4 +120,3 @@ android.applicationVariants.all { variant ->
         }
     }
 }
-
diff --git a/app-mini/src/main/AndroidManifest.xml b/app-mini/src/main/AndroidManifest.xml
index 18b8a6f2..23db19d7 100644
--- a/app-mini/src/main/AndroidManifest.xml
+++ b/app-mini/src/main/AndroidManifest.xml
@@ -4,16 +4,6 @@
     package="org.torproject.android.mini"
     android:installLocation="internalOnly">
 
-    <uses-permission android:name="android.permission.INTERNET" />
-    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
-    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
-    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
-    <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
-    <!-- Some Chromebooks don't support touch. Although not essential,
-         it's a good idea to explicitly include this declaration. -->
-    <uses-feature android:name="android.hardware.touchscreen"
-        android:required="false" />
-
     <application
         android:name=".OrbotMiniApp"
         android:allowBackup="false"
@@ -24,8 +14,10 @@
         android:icon="@mipmap/ic_launcher"
         android:label="@string/app_name"
         android:theme="@style/DefaultTheme"
-        tools:replace="android:allowBackup"
-        >
+        tools:replace="android:allowBackup">
+        <activity
+            android:name=".ui.AppConfigActivity"
+            android:label="@string/title_activity_app_config"></activity>
         <activity
             android:name=".MiniMainActivity"
             android:excludeFromRecents="false"
@@ -43,11 +35,10 @@
                 <category android:name="android.intent.category.BROWSABLE" />
 
                 <data android:scheme="bridge" />
-            </intent-filter>-->
-
-        </activity>
+            </intent-filter>
+            -->
 
-        <!--         This is for ensuring the background service still runs when/if the app is swiped away -->
+        </activity> <!-- This is for ensuring the background service still runs when/if the app is swiped away -->
         <activity
             android:name="org.torproject.android.service.util.DummyActivity"
             android:allowTaskReparenting="true"
@@ -71,20 +62,18 @@
             android:label="@string/app_name"
             android:theme="@style/Theme.AppCompat.Light" />
 
-        <service
-            android:name="org.torproject.android.service.TorService"
-            android:enabled="true"
-            android:permission="android.permission.BIND_VPN_SERVICE"
-            android:stopWithTask="false"></service>
-        <service
-            android:name="org.torproject.android.service.vpn.TorVpnService"
-            android:enabled="true"
-            android:permission="android.permission.BIND_VPN_SERVICE">
-            <intent-filter>
-                <action android:name="android.net.VpnService" />
-            </intent-filter>
-        </service>
+        <activity android:name=".ui.onboarding.OnboardingActivity" />
+        <activity android:name=".ui.onboarding.BridgeWizardActivity" />
 
+        <provider
+            android:name="android.support.v4.content.FileProvider"
+            android:authorities="org.torproject.android.mini.ui.hiddenservices.storage"
+            android:exported="false"
+            android:grantUriPermissions="true">
+            <meta-data
+                android:name="android.support.FILE_PROVIDER_PATHS"
+                android:resource="@xml/hidden_services_paths" />
+        </provider>
         <receiver
             android:name="org.torproject.android.service.StartTorReceiver"
             android:exported="true">
@@ -92,6 +81,7 @@
                 <action android:name="org.torproject.android.intent.action.START" />
             </intent-filter>
         </receiver>
+
         <receiver
             android:name=".OnBootReceiver"
             android:enabled="true"
@@ -113,25 +103,33 @@
             </intent-filter>
         </receiver>
 
+        <service
+            android:name="org.torproject.android.service.TorService"
+            android:enabled="true"
+            android:permission="android.permission.BIND_VPN_SERVICE"
+            android:stopWithTask="false" />
+        <service
+            android:name="org.torproject.android.service.vpn.TorVpnService"
+            android:enabled="true"
+            android:permission="android.permission.BIND_VPN_SERVICE">
+            <intent-filter>
+                <action android:name="android.net.VpnService" />
+            </intent-filter>
+        </service>
+    </application>
+    <uses-feature
+        android:name="android.hardware.touchscreen"
+        android:required="false" />
+    <!--
+ Some Chromebooks don't support touch. Although not essential,
+         it's a good idea to explicitly include this declaration.
+    -->
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
+    <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
 
+    <uses-permission android:name="android.permission.INTERNET" />
 
-
-        <provider
-            android:name="android.support.v4.content.FileProvider"
-            android:authorities="org.torproject.android.mini.ui.hiddenservices.storage"
-            android:exported="false"
-            android:grantUriPermissions="true">
-            <meta-data
-                android:name="android.support.FILE_PROVIDER_PATHS"
-                android:resource="@xml/hidden_services_paths" />
-        </provider>
-
-
-
-        <activity android:name=".ui.onboarding.OnboardingActivity"/>
-        <activity android:name=".ui.onboarding.BridgeWizardActivity"/>
-
-
-    </application>
+    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
 
 </manifest>
\ No newline at end of file
diff --git a/app-mini/src/main/java/org/torproject/android/mini/MiniMainActivity.java b/app-mini/src/main/java/org/torproject/android/mini/MiniMainActivity.java
index c495a6a5..e6f33ba0 100644
--- a/app-mini/src/main/java/org/torproject/android/mini/MiniMainActivity.java
+++ b/app-mini/src/main/java/org/torproject/android/mini/MiniMainActivity.java
@@ -60,6 +60,7 @@ import org.json.JSONArray;
 import org.torproject.android.mini.settings.Languages;
 import org.torproject.android.mini.settings.LocaleHelper;
 import org.torproject.android.mini.settings.SettingsPreferences;
+import org.torproject.android.mini.ui.AppConfigActivity;
 import org.torproject.android.mini.ui.AppManagerActivity;
 import org.torproject.android.mini.ui.Rotate3dAnimation;
 import org.torproject.android.mini.ui.onboarding.OnboardingActivity;
@@ -631,7 +632,7 @@ public class MiniMainActivity extends AppCompatActivity
                     torStatus == TorServiceConstants.STATUS_ON) {
                 refreshVPNApps();
 
-                String newPkgId = data.getStringExtra("package");
+                String newPkgId = data.getStringExtra(Intent.EXTRA_PACKAGE_NAME);
                 //add new entry
 
             }
@@ -1070,12 +1071,12 @@ public class MiniMainActivity extends AppCompatActivity
 
 
             if (i < getItemCount()-1) {
-                String pkgId = pkgIds.get(i);
+                final String pkgId = pkgIds.get(i);
 
                 ApplicationInfo aInfo = null;
                 try {
                     aInfo = getPackageManager().getApplicationInfo(pkgId, 0);
-                    TorifiedApp app = getApp(aInfo);
+                    TorifiedApp app = getApp(MiniMainActivity.this, aInfo);
 
                     avh.tv.setText(app.getName());
                     avh.iv.setImageDrawable(app.getIcon());
@@ -1096,6 +1097,7 @@ public class MiniMainActivity extends AppCompatActivity
                         @Override
                         public void onClick(View v) {
 
+                            showAppConfig(pkgId);
 
                         }
                     });
@@ -1118,49 +1120,57 @@ public class MiniMainActivity extends AppCompatActivity
             }
         }
 
-        private TorifiedApp getApp (ApplicationInfo aInfo)
-        {
-            TorifiedApp app = new TorifiedApp();
 
+    }
 
+    public static TorifiedApp getApp (Context context, ApplicationInfo aInfo)
+    {
+        TorifiedApp app = new TorifiedApp();
 
+        PackageManager pMgr = context.getPackageManager();
 
-            try
-            {
-                app.setName(getPackageManager().getApplicationLabel(aInfo).toString());
-            }
-            catch (Exception e)
-            {
-               return null;
-            }
 
+        try
+        {
+            app.setName(pMgr.getApplicationLabel(aInfo).toString());
+        }
+        catch (Exception e)
+        {
+            return null;
+        }
 
-            app.setEnabled(aInfo.enabled);
-            app.setUid(aInfo.uid);
-            app.setUsername(getPackageManager().getNameForUid(app.getUid()));
-            app.setProcname(aInfo.processName);
-            app.setPackageName(aInfo.packageName);
 
-            app.setTorified(true);
+        app.setEnabled(aInfo.enabled);
+        app.setUid(aInfo.uid);
+        app.setUsername(pMgr.getNameForUid(app.getUid()));
+        app.setProcname(aInfo.processName);
+        app.setPackageName(aInfo.packageName);
 
-            try {
-                app.setIcon(getPackageManager().getApplicationIcon(app.getPackageName()));
+        app.setTorified(true);
 
+        try {
+            app.setIcon(pMgr.getApplicationIcon(app.getPackageName()));
 
-            } catch (NameNotFoundException e) {
-                e.printStackTrace();
-            }
-            return app;
-        }
 
+        } catch (NameNotFoundException e) {
+            e.printStackTrace();
+        }
+        return app;
     }
 
+
     public void showAppPicker ()
     {
         startActivityForResult(new Intent(MiniMainActivity.this, AppManagerActivity.class), REQUEST_VPN_APPS_SELECT);
 
     }
 
+    public void showAppConfig (String pkgId)
+    {
+        Intent data = new Intent(this, AppConfigActivity.class);
+        data.putExtra(Intent.EXTRA_PACKAGE_NAME,pkgId);
+        startActivity(data);
+    }
 
 
     public static Bitmap drawableToBitmap (Drawable drawable) {
diff --git a/app-mini/src/main/java/org/torproject/android/mini/ui/AppConfigActivity.java b/app-mini/src/main/java/org/torproject/android/mini/ui/AppConfigActivity.java
new file mode 100644
index 00000000..f4dcc6c6
--- /dev/null
+++ b/app-mini/src/main/java/org/torproject/android/mini/ui/AppConfigActivity.java
@@ -0,0 +1,102 @@
+package org.torproject.android.mini.ui;
+
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.pm.ApplicationInfo;
+import android.os.Bundle;
+import android.support.design.widget.FloatingActionButton;
+import android.support.design.widget.Snackbar;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+
+import org.torproject.android.mini.MiniMainActivity;
+import org.torproject.android.mini.R;
+import org.torproject.android.service.util.TorServiceUtils;
+import org.torproject.android.service.vpn.TorifiedApp;
+
+import static org.torproject.android.mini.MiniMainActivity.getApp;
+import static org.torproject.android.service.vpn.VpnPrefs.PREFS_KEY_TORIFIED;
+
+public class AppConfigActivity extends AppCompatActivity {
+
+    TorifiedApp mApp;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_app_config);
+        Toolbar toolbar = findViewById(R.id.toolbar);
+        setSupportActionBar(toolbar);
+
+        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+
+        String pkgId = getIntent().getStringExtra(Intent.EXTRA_PACKAGE_NAME);
+
+        ApplicationInfo aInfo = null;
+        try {
+            aInfo = getPackageManager().getApplicationInfo(pkgId, 0);
+            mApp = getApp(this, aInfo);
+
+            getSupportActionBar().setIcon(mApp.getIcon());
+
+            setTitle(mApp.getName());
+        }
+        catch (Exception e){}
+
+    }
+
+
+    private void removeApp ()
+    {
+        mApp.setTorified(false);
+
+        SharedPreferences prefs = TorServiceUtils.getSharedPrefs(getApplicationContext());
+
+        String tordAppString = prefs.getString(PREFS_KEY_TORIFIED, "");
+
+        tordAppString = tordAppString.replace(mApp.getPackageName()+"|","");
+
+        SharedPreferences.Editor edit = prefs.edit();
+        edit.putString(PREFS_KEY_TORIFIED, tordAppString);
+        edit.commit();
+
+        Intent response = new Intent();
+        setResult(RESULT_OK,response);
+
+        finish();
+    }
+
+    /*
+     * Create the UI Options Menu (non-Javadoc)
+     * @see android.app.Activity#onCreateOptionsMenu(android.view.Menu)
+     */
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        super.onCreateOptionsMenu(menu);
+        MenuInflater inflater = getMenuInflater();
+        inflater.inflate(R.menu.app_config, menu);
+        return true;
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+
+        if (item.getItemId() == android.R.id.home) {
+            finish();
+            return true;
+        }
+        else if (item.getItemId() == R.id.menu_remove_app) {
+            removeApp();
+        }
+
+        return super.onOptionsItemSelected(item);
+    }
+
+
+
+
+}
diff --git a/app-mini/src/main/java/org/torproject/android/mini/ui/AppManagerActivity.java b/app-mini/src/main/java/org/torproject/android/mini/ui/AppManagerActivity.java
index 30a43779..ea66d7f2 100644
--- a/app-mini/src/main/java/org/torproject/android/mini/ui/AppManagerActivity.java
+++ b/app-mini/src/main/java/org/torproject/android/mini/ui/AppManagerActivity.java
@@ -126,15 +126,6 @@ public class AppManagerActivity extends AppCompatActivity implements OnClickList
         if (mApps == null)
             mApps = getApps(prefs);
 
-        /**
-        Collections.sort(mApps,new Comparator<TorifiedApp>() {
-            public int compare(TorifiedApp o1, TorifiedApp o2) {
-                if (o1.isTorified() == o2.isTorified())
-                    return o1.getName().compareToIgnoreCase(o2.getName());
-                if (o1.isTorified()) return -1;
-                return 1;
-            }
-        });**/
 
         final LayoutInflater inflater = getLayoutInflater();
 
@@ -177,16 +168,6 @@ public class AppManagerActivity extends AppCompatActivity implements OnClickList
                     entry.text.setText(app.getName());
                 }
 
-                if (app.isTorified())
-                {
-                    convertView.setBackgroundColor(getResources().getColor(R.color.dark_purple));
-
-                }
-                else
-                {
-                    convertView.setBackgroundColor(getResources().getColor(android.R.color.transparent));
-
-                }
 
                 return convertView;
             }
@@ -327,7 +308,7 @@ public class AppManagerActivity extends AppCompatActivity implements OnClickList
 
 
             Intent data = new Intent();
-            data.putExtra("package",app.getPackageName());
+            data.putExtra(Intent.EXTRA_PACKAGE_NAME,app.getPackageName());
             setResult(RESULT_OK,data);
             saveAppSettings();
 
diff --git a/app-mini/src/main/java/org/torproject/android/mini/ui/onboarding/OnboardingActivity.java b/app-mini/src/main/java/org/torproject/android/mini/ui/onboarding/OnboardingActivity.java
index 1c1b9927..f6531a7d 100644
--- a/app-mini/src/main/java/org/torproject/android/mini/ui/onboarding/OnboardingActivity.java
+++ b/app-mini/src/main/java/org/torproject/android/mini/ui/onboarding/OnboardingActivity.java
@@ -19,13 +19,13 @@ public class OnboardingActivity extends AppIntro {
         // Instead of fragments, you can also use our default slide
         // Just set a title, description, background and image. AppIntro will do the rest.
         CustomSlideBigText welcome = CustomSlideBigText.newInstance(R.layout.custom_slide_big_text);
-        welcome.setTitle("The power of tor made simple for your life");
-        welcome.setSubTitle("orbot mini");
+        welcome.setTitle(getString(R.string.mini_onboarding_1));
+        welcome.setSubTitle(getString(R.string.app_name));
         addSlide(welcome);
 
         CustomSlideBigText intro2 = CustomSlideBigText.newInstance(R.layout.custom_slide_big_text);
-        intro2.setTitle("unblock any app with a few taps");
-        intro2.setSubTitle("so easy");
+        intro2.setTitle(getString(R.string.mini_onboarding_2));
+        intro2.setSubTitle(getString(R.string.mini_onboarding_2_title));
         addSlide(intro2);
 
         // OPTIONAL METHODS
diff --git a/app-mini/src/main/res/layout/activity_app_config.xml b/app-mini/src/main/res/layout/activity_app_config.xml
new file mode 100644
index 00000000..accb290b
--- /dev/null
+++ b/app-mini/src/main/res/layout/activity_app_config.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".ui.AppConfigActivity">
+
+    <android.support.design.widget.AppBarLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:theme="@style/DefaultTheme.AppBarOverlay">
+
+        <android.support.v7.widget.Toolbar
+            android:id="@+id/toolbar"
+            android:layout_width="match_parent"
+            android:layout_height="?attr/actionBarSize"
+            android:background="@color/dark_green"
+            app:popupTheme="@style/DefaultTheme.PopupOverlay" />
+
+    </android.support.design.widget.AppBarLayout>
+
+
+    <include layout="@layout/content_app_config" />
+
+</android.support.design.widget.CoordinatorLayout>
\ No newline at end of file
diff --git a/app-mini/src/main/res/layout/content_app_config.xml b/app-mini/src/main/res/layout/content_app_config.xml
new file mode 100644
index 00000000..8e7b727e
--- /dev/null
+++ b/app-mini/src/main/res/layout/content_app_config.xml
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    app:layout_behavior="@string/appbar_scrolling_view_behavior"
+    tools:context=".ui.AppConfigActivity"
+    android:orientation="vertical"
+    tools:showIn="@layout/activity_app_config"
+    android:padding="20dp"
+    >
+
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/title_boost_your_privacy"
+        android:textStyle="bold"
+        android:textSize="20dp"
+        android:id="@+id/privacy_title"
+        />
+
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/send_your_app_traffic_over_tor"
+        android:textSize="16dp"
+        android:layout_below="@+id/privacy_title"
+        />
+
+        <Switch
+            android:layout_alignParentEnd="true"
+            android:layout_alignParentRight="true"
+
+            android:layout_toRightOf="@+id/privacy_title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+    </RelativeLayout>
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="20dp"
+        >
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/turn_off_apps"
+            android:textStyle="bold"
+            android:textSize="20dp"
+            android:id="@+id/off_apps_title"
+            />
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/stop_apps_from_using_the_network"
+            android:textSize="16dp"
+            android:layout_below="@+id/off_apps_title"
+            />
+        <Switch
+            android:layout_alignParentEnd="true"
+            android:layout_alignParentRight="true"
+
+            android:layout_toRightOf="@+id/off_apps_title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+    </RelativeLayout>
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="20dp"
+        >
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/wifi_only"
+            android:textStyle="bold"
+            android:textSize="20dp"
+            android:id="@+id/wifi_title"
+            />
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/keep_your_apps_from_using_mobile_data"
+            android:textSize="16dp"
+            android:layout_below="@+id/wifi_title"
+            />
+
+        <Switch
+            android:layout_alignParentEnd="true"
+            android:layout_alignParentRight="true"
+
+            android:layout_toRightOf="@+id/wifi_title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+
+    </RelativeLayout>
+
+
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app-mini/src/main/res/menu/app_config.xml b/app-mini/src/main/res/menu/app_config.xml
new file mode 100644
index 00000000..d0a75569
--- /dev/null
+++ b/app-mini/src/main/res/menu/app_config.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2008 Esmertec AG.
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:yourapp="http://schemas.android.com/apk/res-auto"
+    >
+
+
+    <item android:id="@+id/menu_remove_app"
+        android:title="@string/remove"
+        yourapp:showAsAction="never"
+        />
+
+
+ 
+</menu>
diff --git a/app-mini/src/main/res/values/strings.xml b/app-mini/src/main/res/values/strings.xml
index 42bc1674..c7ae3edd 100644
--- a/app-mini/src/main/res/values/strings.xml
+++ b/app-mini/src/main/res/values/strings.xml
@@ -124,7 +124,7 @@
     <string name="newnym">You\'ve switched to a new Tor identity!</string>
 
     <string name="pref_open_proxy_on_all_interfaces_title">Open Proxy on All Interfaces</string>
-  <string name="pref_open_proxy_on_all_interfaces_summary">Allow Wi-Fi peers, tethered devices and anyone else who can connect to your IP, to access Tor</string>
+    <string name="pref_open_proxy_on_all_interfaces_summary">Allow Wi-Fi peers, tethered devices and anyone else who can connect to your IP, to access Tor</string>
 
     <string name="no_network_connectivity_putting_tor_to_sleep_">No network connectivity. Putting Tor to sleep…</string>
     <string name="network_connectivity_is_good_waking_tor_up_">Network connectivity is good. Waking Tor up…</string>
@@ -255,4 +255,17 @@
     <string name="app_services">App services</string>
     <string name="default_socks_http">SOCKS: - HTTP: -</string>
     <string name="refresh_apps">Refresh Apps</string>
+
+    <!-- Orbot Mini Strings -->
+    <string name="mini_onboarding_1">The power of tor made mini to fit your life</string>
+    <string name="mini_onboarding_2">unblock any app with a few taps</string>
+    <string name="mini_onboarding_2_title">so easy!</string>
+    <string name="title_activity_app_config">AppConfigActivity</string>
+    <string name="title_boost_your_privacy">Boost Your Privacy</string>
+    <string name="send_your_app_traffic_over_tor">Send app data over Tor</string>
+    <string name="turn_off_apps">Turn off app data</string>
+    <string name="stop_apps_from_using_the_network">Stop app from using the network</string>
+    <string name="wifi_only">Wifi only</string>
+    <string name="keep_your_apps_from_using_mobile_data">Only allow connection over wifi</string>
+    <string name="remove">Remove</string>
 </resources>
diff --git a/app-mini/src/main/res/values/styles.xml b/app-mini/src/main/res/values/styles.xml
index b2e69a53..428c097c 100644
--- a/app-mini/src/main/res/values/styles.xml
+++ b/app-mini/src/main/res/values/styles.xml
@@ -4,4 +4,9 @@
     <style name="DefaultTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
 
     <style name="DefaultTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
+
+    <style name="DefaultTheme.NoActionBar">
+        <item name="windowActionBar">false</item>
+        <item name="windowNoTitle">true</item>
+    </style>
 </resources>





More information about the tor-commits mailing list