diff options
author | Jeff Davidson <jpd@google.com> | 2014-08-21 04:08:55 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-08-21 04:08:55 +0000 |
commit | 7f133dce33dd97a7e82dc9d7e161251a8c635155 (patch) | |
tree | cfc2530726ff27e08b15021d7214ec598e7ee8ac /packages/VpnDialogs | |
parent | 561f7f438352f70fbefb9c7606269162527e7fe5 (diff) | |
parent | 814c033d38a856068a5f131f2abf13ea73cc500c (diff) | |
download | frameworks_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.xml | 9 | ||||
-rw-r--r-- | packages/VpnDialogs/res/drawable-hdpi/ic_vpn_dialog.png | bin | 0 -> 943 bytes | |||
-rw-r--r-- | packages/VpnDialogs/res/drawable-mdpi/ic_vpn_dialog.png | bin | 0 -> 629 bytes | |||
-rw-r--r-- | packages/VpnDialogs/res/drawable-xhdpi/ic_vpn_dialog.png | bin | 0 -> 1035 bytes | |||
-rw-r--r-- | packages/VpnDialogs/res/drawable-xxhdpi/ic_vpn_dialog.png | bin | 0 -> 1257 bytes | |||
-rw-r--r-- | packages/VpnDialogs/res/drawable-xxxhdpi/ic_vpn_dialog.png | bin | 0 -> 1884 bytes | |||
-rw-r--r-- | packages/VpnDialogs/res/layout/confirm.xml | 43 | ||||
-rw-r--r-- | packages/VpnDialogs/res/layout/manage.xml | 45 | ||||
-rw-r--r-- | packages/VpnDialogs/res/values/strings.xml | 41 | ||||
-rw-r--r-- | packages/VpnDialogs/src/com/android/vpndialogs/ConfirmDialog.java | 46 | ||||
-rw-r--r-- | packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java | 204 |
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 Binary files differnew file mode 100644 index 0000000..a0b4b61 --- /dev/null +++ b/packages/VpnDialogs/res/drawable-hdpi/ic_vpn_dialog.png diff --git a/packages/VpnDialogs/res/drawable-mdpi/ic_vpn_dialog.png b/packages/VpnDialogs/res/drawable-mdpi/ic_vpn_dialog.png Binary files differnew file mode 100644 index 0000000..df5dfe8 --- /dev/null +++ b/packages/VpnDialogs/res/drawable-mdpi/ic_vpn_dialog.png diff --git a/packages/VpnDialogs/res/drawable-xhdpi/ic_vpn_dialog.png b/packages/VpnDialogs/res/drawable-xhdpi/ic_vpn_dialog.png Binary files differnew file mode 100644 index 0000000..18d5a3a --- /dev/null +++ b/packages/VpnDialogs/res/drawable-xhdpi/ic_vpn_dialog.png diff --git a/packages/VpnDialogs/res/drawable-xxhdpi/ic_vpn_dialog.png b/packages/VpnDialogs/res/drawable-xxhdpi/ic_vpn_dialog.png Binary files differnew file mode 100644 index 0000000..4d475dc --- /dev/null +++ b/packages/VpnDialogs/res/drawable-xxhdpi/ic_vpn_dialog.png diff --git a/packages/VpnDialogs/res/drawable-xxxhdpi/ic_vpn_dialog.png b/packages/VpnDialogs/res/drawable-xxxhdpi/ic_vpn_dialog.png Binary files differnew file mode 100644 index 0000000..9d458b4 --- /dev/null +++ b/packages/VpnDialogs/res/drawable-xxxhdpi/ic_vpn_dialog.png 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; - } -} |