summaryrefslogtreecommitdiffstats
path: root/packages/VpnDialogs
diff options
context:
space:
mode:
authorJeff Davidson <jpd@google.com>2014-08-21 04:08:55 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2014-08-21 04:08:55 +0000
commit7f133dce33dd97a7e82dc9d7e161251a8c635155 (patch)
treecfc2530726ff27e08b15021d7214ec598e7ee8ac /packages/VpnDialogs
parent561f7f438352f70fbefb9c7606269162527e7fe5 (diff)
parent814c033d38a856068a5f131f2abf13ea73cc500c (diff)
downloadframeworks_base-7f133dce33dd97a7e82dc9d7e161251a8c635155.zip
frameworks_base-7f133dce33dd97a7e82dc9d7e161251a8c635155.tar.gz
frameworks_base-7f133dce33dd97a7e82dc9d7e161251a8c635155.tar.bz2
am 1ff358ad: am d217efb9: am 709941fd: Merge "Less intrusive VPN dialog and other UX tweaks." into lmp-dev
* commit '1ff358ad2a0b2c0702fde65ff68f4656e55c545f': Less intrusive VPN dialog and other UX tweaks.
Diffstat (limited to 'packages/VpnDialogs')
-rw-r--r--packages/VpnDialogs/AndroidManifest.xml9
-rw-r--r--packages/VpnDialogs/res/drawable-hdpi/ic_vpn_dialog.pngbin0 -> 943 bytes
-rw-r--r--packages/VpnDialogs/res/drawable-mdpi/ic_vpn_dialog.pngbin0 -> 629 bytes
-rw-r--r--packages/VpnDialogs/res/drawable-xhdpi/ic_vpn_dialog.pngbin0 -> 1035 bytes
-rw-r--r--packages/VpnDialogs/res/drawable-xxhdpi/ic_vpn_dialog.pngbin0 -> 1257 bytes
-rw-r--r--packages/VpnDialogs/res/drawable-xxxhdpi/ic_vpn_dialog.pngbin0 -> 1884 bytes
-rw-r--r--packages/VpnDialogs/res/layout/confirm.xml43
-rw-r--r--packages/VpnDialogs/res/layout/manage.xml45
-rw-r--r--packages/VpnDialogs/res/values/strings.xml41
-rw-r--r--packages/VpnDialogs/src/com/android/vpndialogs/ConfirmDialog.java46
-rw-r--r--packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java204
11 files changed, 42 insertions, 346 deletions
diff --git a/packages/VpnDialogs/AndroidManifest.xml b/packages/VpnDialogs/AndroidManifest.xml
index 03d920a..1768400 100644
--- a/packages/VpnDialogs/AndroidManifest.xml
+++ b/packages/VpnDialogs/AndroidManifest.xml
@@ -28,14 +28,5 @@
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
-
- <activity android:name=".ManageDialog"
- android:theme="@*android:style/Theme.DeviceDefault.Light.Dialog.Alert"
- android:noHistory="true">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- <category android:name="android.intent.category.DEFAULT"/>
- </intent-filter>
- </activity>
</application>
</manifest>
diff --git a/packages/VpnDialogs/res/drawable-hdpi/ic_vpn_dialog.png b/packages/VpnDialogs/res/drawable-hdpi/ic_vpn_dialog.png
new file mode 100644
index 0000000..a0b4b61
--- /dev/null
+++ b/packages/VpnDialogs/res/drawable-hdpi/ic_vpn_dialog.png
Binary files differ
diff --git a/packages/VpnDialogs/res/drawable-mdpi/ic_vpn_dialog.png b/packages/VpnDialogs/res/drawable-mdpi/ic_vpn_dialog.png
new file mode 100644
index 0000000..df5dfe8
--- /dev/null
+++ b/packages/VpnDialogs/res/drawable-mdpi/ic_vpn_dialog.png
Binary files differ
diff --git a/packages/VpnDialogs/res/drawable-xhdpi/ic_vpn_dialog.png b/packages/VpnDialogs/res/drawable-xhdpi/ic_vpn_dialog.png
new file mode 100644
index 0000000..18d5a3a
--- /dev/null
+++ b/packages/VpnDialogs/res/drawable-xhdpi/ic_vpn_dialog.png
Binary files differ
diff --git a/packages/VpnDialogs/res/drawable-xxhdpi/ic_vpn_dialog.png b/packages/VpnDialogs/res/drawable-xxhdpi/ic_vpn_dialog.png
new file mode 100644
index 0000000..4d475dc
--- /dev/null
+++ b/packages/VpnDialogs/res/drawable-xxhdpi/ic_vpn_dialog.png
Binary files differ
diff --git a/packages/VpnDialogs/res/drawable-xxxhdpi/ic_vpn_dialog.png b/packages/VpnDialogs/res/drawable-xxxhdpi/ic_vpn_dialog.png
new file mode 100644
index 0000000..9d458b4
--- /dev/null
+++ b/packages/VpnDialogs/res/drawable-xxxhdpi/ic_vpn_dialog.png
Binary files differ
diff --git a/packages/VpnDialogs/res/layout/confirm.xml b/packages/VpnDialogs/res/layout/confirm.xml
index ee7f4b8..66fec59 100644
--- a/packages/VpnDialogs/res/layout/confirm.xml
+++ b/packages/VpnDialogs/res/layout/confirm.xml
@@ -18,41 +18,12 @@
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
- <LinearLayout android:layout_width="match_parent"
+ <TextView android:id="@+id/warning"
+ android:layout_width="fill_parent"
android:layout_height="wrap_content"
- android:orientation="vertical"
- android:padding="3mm">
-
- <LinearLayout android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:gravity="center_vertical">
-
- <ImageView android:id="@+id/icon"
- android:layout_width="@android:dimen/app_icon_size"
- android:layout_height="@android:dimen/app_icon_size"
- android:paddingRight="1mm"/>
-
- <TextView android:id="@+id/prompt"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:textSize="18sp"/>
- </LinearLayout>
-
- <TextView android:id="@+id/warning"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:paddingTop="1mm"
- android:paddingBottom="1mm"
- android:text="@string/warning"
- android:textSize="18sp"/>
-
- <CheckBox android:id="@+id/check"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="@string/accept"
- android:textSize="20sp"
- android:filterTouchesWhenObscured="true"
- android:checked="false"/>
- </LinearLayout>
+ android:textSize="18sp"
+ android:paddingTop="4mm"
+ android:paddingLeft="3mm"
+ android:paddingRight="3mm"
+ android:paddingBottom="4mm"/>
</ScrollView>
diff --git a/packages/VpnDialogs/res/layout/manage.xml b/packages/VpnDialogs/res/layout/manage.xml
deleted file mode 100644
index 56332c3..0000000
--- a/packages/VpnDialogs/res/layout/manage.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 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.
--->
-
-<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:padding="3mm"
- android:stretchColumns="0,1"
- android:shrinkColumns="1">
-
- <TableRow>
- <TextView android:text="@string/session" style="@style/label"/>
- <TextView android:id="@+id/session" style="@style/value"/>
- </TableRow>
-
- <TableRow>
- <TextView android:text="@string/duration" style="@style/label"/>
- <TextView android:id="@+id/duration" style="@style/value"/>
- </TableRow>
-
- <TableRow android:id="@+id/data_transmitted_row" android:visibility="gone">
- <TextView android:text="@string/data_transmitted" style="@style/label"/>
- <TextView android:id="@+id/data_transmitted" style="@style/value"/>
- </TableRow>
-
- <TableRow android:id="@+id/data_received_row" android:visibility="gone">
- <TextView android:text="@string/data_received" style="@style/label"/>
- <TextView android:id="@+id/data_received" style="@style/value"/>
- </TableRow>
-
-</TableLayout>
diff --git a/packages/VpnDialogs/res/values/strings.xml b/packages/VpnDialogs/res/values/strings.xml
index 3ff767a..84206a1 100644
--- a/packages/VpnDialogs/res/values/strings.xml
+++ b/packages/VpnDialogs/res/values/strings.xml
@@ -17,40 +17,15 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- Dialog title to identify the request from a VPN application. [CHAR LIMIT=60] -->
- <string name="prompt"><xliff:g id="app">%s</xliff:g>
- attempts to create a VPN connection.
- </string>
+ <string name="prompt">Connection request</string>
<!-- Dialog message to warn about the risk of using a VPN application. [CHAR LIMIT=NONE] -->
- <string name="warning">By proceeding, you are giving the application
- permission to intercept all network traffic.
- <b>Do NOT accept unless you trust the application.</b> Otherwise,
- you run the risk of having your data compromised by a malicious
- software.
- </string>
-
- <!-- Checkbox label to accept the request from a VPN application. [CHAR LIMIT=60] -->
- <string name="accept">I trust this application.</string>
-
- <!-- Dialog title for built-in VPN. [CHAR LIMIT=40] -->
- <string name="legacy_title">VPN is connected</string>
- <!-- Button label to configure the current VPN session. [CHAR LIMIT=20] -->
- <string name="configure">Configure</string>
- <!-- Button label to disconnect the current VPN session. [CHAR LIMIT=20] -->
- <string name="disconnect">Disconnect</string>
-
- <!-- Label for the name of the current VPN session. [CHAR LIMIT=20] -->
- <string name="session">Session:</string>
- <!-- Label for the duration of the current VPN session. [CHAR LIMIT=20] -->
- <string name="duration">Duration:</string>
- <!-- Label for the network usage of data transmitted over VPN. [CHAR LIMIT=20] -->
- <string name="data_transmitted">Sent:</string>
- <!-- Label for the network usage of data received over VPN. [CHAR LIMIT=20] -->
- <string name="data_received">Received:</string>
-
- <!-- Formatted string for the network usage over VPN. [CHAR LIMIT=40] -->
- <string name="data_value_format">
- <xliff:g id="number">%1$s</xliff:g> bytes /
- <xliff:g id="number">%2$s</xliff:g> packets
+ <string name="warning"><xliff:g id="app">%s</xliff:g> wants to set up a VPN connection
+ that allows it to monitor network traffic. Only accept if you trust the source.
+ <![CDATA[
+ <br />
+ <br />
+ <img src="vpn_icon" />
+ ]]> appears at the top of your screen when VPN is active.
</string>
</resources>
diff --git a/packages/VpnDialogs/src/com/android/vpndialogs/ConfirmDialog.java b/packages/VpnDialogs/src/com/android/vpndialogs/ConfirmDialog.java
index ddafc66..897c96cf 100644
--- a/packages/VpnDialogs/src/com/android/vpndialogs/ConfirmDialog.java
+++ b/packages/VpnDialogs/src/com/android/vpndialogs/ConfirmDialog.java
@@ -18,21 +18,28 @@ package com.android.vpndialogs;
import android.content.Context;
import android.content.DialogInterface;
+import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.graphics.drawable.Drawable;
import android.net.IConnectivityManager;
+import android.net.VpnService;
import android.os.ServiceManager;
+import android.text.Html;
+import android.text.Html.ImageGetter;
import android.util.Log;
import android.view.View;
import android.widget.Button;
-import android.widget.CompoundButton;
-import android.widget.ImageView;
import android.widget.TextView;
import com.android.internal.app.AlertActivity;
+import com.android.internal.net.VpnConfig;
-public class ConfirmDialog extends AlertActivity implements
- CompoundButton.OnCheckedChangeListener, DialogInterface.OnClickListener {
+import java.util.List;
+
+public class ConfirmDialog extends AlertActivity
+ implements DialogInterface.OnClickListener, ImageGetter {
private static final String TAG = "VpnConfirm";
private String mPackage;
@@ -56,27 +63,22 @@ public class ConfirmDialog extends AlertActivity implements
return;
}
- PackageManager pm = getPackageManager();
- ApplicationInfo app = pm.getApplicationInfo(mPackage, 0);
-
View view = View.inflate(this, R.layout.confirm, null);
- ((ImageView) view.findViewById(R.id.icon)).setImageDrawable(app.loadIcon(pm));
- ((TextView) view.findViewById(R.id.prompt)).setText(
- getString(R.string.prompt, app.loadLabel(pm)));
- ((CompoundButton) view.findViewById(R.id.check)).setOnCheckedChangeListener(this);
- mAlertParams.mIconAttrId = android.R.attr.alertDialogIcon;
- mAlertParams.mTitle = getText(android.R.string.dialog_alert_title);
+ ((TextView) view.findViewById(R.id.warning)).setText(
+ Html.fromHtml(
+ getString(R.string.warning, VpnConfig.getVpnLabel(this, mPackage)),
+ this, null /* tagHandler */));
+
+ mAlertParams.mTitle = getText(R.string.prompt);
mAlertParams.mPositiveButtonText = getText(android.R.string.ok);
mAlertParams.mPositiveButtonListener = this;
mAlertParams.mNegativeButtonText = getText(android.R.string.cancel);
- mAlertParams.mNegativeButtonListener = this;
mAlertParams.mView = view;
setupAlert();
getWindow().setCloseOnTouchOutside(false);
mButton = mAlert.getButton(DialogInterface.BUTTON_POSITIVE);
- mButton.setEnabled(false);
mButton.setFilterTouchesWhenObscured(true);
} catch (Exception e) {
Log.e(TAG, "onResume", e);
@@ -85,18 +87,24 @@ public class ConfirmDialog extends AlertActivity implements
}
@Override
- public void onBackPressed() {
+ public Drawable getDrawable(String source) {
+ // Should only reach this when fetching the VPN icon for the warning string.
+ Drawable icon = getDrawable(R.drawable.ic_vpn_dialog);
+ icon.setBounds(0, 0, icon.getIntrinsicWidth(), icon.getIntrinsicHeight());
+ return icon;
}
@Override
- public void onCheckedChanged(CompoundButton button, boolean checked) {
- mButton.setEnabled(checked);
+ public void onBackPressed() {
}
@Override
public void onClick(DialogInterface dialog, int which) {
try {
- if (which == DialogInterface.BUTTON_POSITIVE && mService.prepareVpn(null, mPackage)) {
+ if (mService.prepareVpn(null, mPackage)) {
+ // Authorize this app to initiate VPN connections in the future without user
+ // intervention.
+ mService.setVpnPackageAuthorization(true);
setResult(RESULT_OK);
}
} catch (Exception e) {
diff --git a/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java b/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java
deleted file mode 100644
index eb20995..0000000
--- a/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-package com.android.vpndialogs;
-
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.net.IConnectivityManager;
-import android.os.Handler;
-import android.os.Message;
-import android.os.ServiceManager;
-import android.os.SystemClock;
-import android.util.Log;
-import android.view.View;
-import android.widget.TextView;
-
-import com.android.internal.app.AlertActivity;
-import com.android.internal.net.VpnConfig;
-
-import java.io.DataInputStream;
-import java.io.FileInputStream;
-
-public class ManageDialog extends AlertActivity implements
- DialogInterface.OnClickListener, Handler.Callback {
- private static final String TAG = "VpnManage";
-
- private VpnConfig mConfig;
-
- private IConnectivityManager mService;
-
- private TextView mDuration;
- private TextView mDataTransmitted;
- private TextView mDataReceived;
- private boolean mDataRowsHidden;
-
- private Handler mHandler;
-
- @Override
- protected void onResume() {
- super.onResume();
-
- if (getCallingPackage() != null) {
- Log.e(TAG, getCallingPackage() + " cannot start this activity");
- finish();
- return;
- }
-
- try {
-
- mService = IConnectivityManager.Stub.asInterface(
- ServiceManager.getService(Context.CONNECTIVITY_SERVICE));
-
- mConfig = mService.getVpnConfig();
-
- // mConfig can be null if we are a restricted user, in that case don't show this dialog
- if (mConfig == null) {
- finish();
- return;
- }
-
- View view = View.inflate(this, R.layout.manage, null);
- if (mConfig.session != null) {
- ((TextView) view.findViewById(R.id.session)).setText(mConfig.session);
- }
- mDuration = (TextView) view.findViewById(R.id.duration);
- mDataTransmitted = (TextView) view.findViewById(R.id.data_transmitted);
- mDataReceived = (TextView) view.findViewById(R.id.data_received);
- mDataRowsHidden = true;
-
- if (mConfig.legacy) {
- mAlertParams.mIconId = android.R.drawable.ic_dialog_info;
- mAlertParams.mTitle = getText(R.string.legacy_title);
- } else {
- PackageManager pm = getPackageManager();
- ApplicationInfo app = pm.getApplicationInfo(mConfig.user, 0);
- mAlertParams.mIcon = app.loadIcon(pm);
- mAlertParams.mTitle = app.loadLabel(pm);
- }
- if (mConfig.configureIntent != null) {
- mAlertParams.mPositiveButtonText = getText(R.string.configure);
- mAlertParams.mPositiveButtonListener = this;
- }
- mAlertParams.mNeutralButtonText = getText(R.string.disconnect);
- mAlertParams.mNeutralButtonListener = this;
- mAlertParams.mNegativeButtonText = getText(android.R.string.cancel);
- mAlertParams.mNegativeButtonListener = this;
- mAlertParams.mView = view;
- setupAlert();
-
- if (mHandler == null) {
- mHandler = new Handler(this);
- }
- mHandler.sendEmptyMessage(0);
- } catch (Exception e) {
- Log.e(TAG, "onResume", e);
- finish();
- }
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- if (!isFinishing()) {
- finish();
- }
- }
-
- @Override
- public void onClick(DialogInterface dialog, int which) {
- try {
- if (which == DialogInterface.BUTTON_POSITIVE) {
- mConfig.configureIntent.send();
- } else if (which == DialogInterface.BUTTON_NEUTRAL) {
- if (mConfig.legacy) {
- mService.prepareVpn(VpnConfig.LEGACY_VPN, VpnConfig.LEGACY_VPN);
- } else {
- mService.prepareVpn(mConfig.user, VpnConfig.LEGACY_VPN);
- }
- }
- } catch (Exception e) {
- Log.e(TAG, "onClick", e);
- finish();
- }
- }
-
- @Override
- public boolean handleMessage(Message message) {
- mHandler.removeMessages(0);
-
- if (!isFinishing()) {
- if (mConfig.startTime != -1) {
- long seconds = (SystemClock.elapsedRealtime() - mConfig.startTime) / 1000;
- mDuration.setText(String.format("%02d:%02d:%02d",
- seconds / 3600, seconds / 60 % 60, seconds % 60));
- }
-
- String[] numbers = getNumbers();
- if (numbers != null) {
- // First unhide the related data rows.
- if (mDataRowsHidden) {
- findViewById(R.id.data_transmitted_row).setVisibility(View.VISIBLE);
- findViewById(R.id.data_received_row).setVisibility(View.VISIBLE);
- mDataRowsHidden = false;
- }
-
- // [1] and [2] are received data in bytes and packets.
- mDataReceived.setText(getString(R.string.data_value_format,
- numbers[1], numbers[2]));
-
- // [9] and [10] are transmitted data in bytes and packets.
- mDataTransmitted.setText(getString(R.string.data_value_format,
- numbers[9], numbers[10]));
- }
- mHandler.sendEmptyMessageDelayed(0, 1000);
- }
- return true;
- }
-
- private String[] getNumbers() {
- DataInputStream in = null;
- try {
- // See dev_seq_printf_stats() in net/core/dev.c.
- in = new DataInputStream(new FileInputStream("/proc/net/dev"));
- String prefix = mConfig.interfaze + ':';
-
- while (true) {
- String line = in.readLine().trim();
- if (line.startsWith(prefix)) {
- String[] numbers = line.substring(prefix.length()).split(" +");
- for (int i = 1; i < 17; ++i) {
- if (!numbers[i].equals("0")) {
- return numbers;
- }
- }
- break;
- }
- }
- } catch (Exception e) {
- // ignore
- } finally {
- try {
- in.close();
- } catch (Exception e) {
- // ignore
- }
- }
- return null;
- }
-}