commit 285d77e9e337e2ea5a53421411b5f989a3768fda Author: n8fr8 nathan@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>