From d1dd0d369bcbf6aa70730e0f637c1888ee7e41e1 Mon Sep 17 00:00:00 2001 From: Firefly Date: Thu, 24 Sep 2015 13:57:37 +0800 Subject: [PATCH] add dual screen function --- packages/apps/Settings/AndroidManifest.xml | 18 ++ .../res/drawable-mdpi/ic_dual_screen.png | Bin 0 -> 849 bytes .../Settings/res/values-zh-rCN/strings.xml | 8 + packages/apps/Settings/res/values/strings.xml | 8 + .../Settings/res/xml/display_settings.xml | 6 + packages/apps/Settings/res/xml/dualscreen.xml | 10 + .../src/com/android/settings/Settings.java | 1 + .../android/settings/SettingsActivity.java | 4 +- .../dualscreen/DualscreenSettings.java | 202 ++++++++++++++++++ 9 files changed, 256 insertions(+), 1 deletion(-) create mode 100755 packages/apps/Settings/res/drawable-mdpi/ic_dual_screen.png mode change 100644 => 100755 packages/apps/Settings/res/values-zh-rCN/strings.xml mode change 100644 => 100755 packages/apps/Settings/res/values/strings.xml mode change 100644 => 100755 packages/apps/Settings/res/xml/display_settings.xml create mode 100755 packages/apps/Settings/res/xml/dualscreen.xml create mode 100755 packages/apps/Settings/src/com/android/settings/dualscreen/DualscreenSettings.java diff --git a/packages/apps/Settings/AndroidManifest.xml b/packages/apps/Settings/AndroidManifest.xml index 9ec3d30f8f..021ae1ddea 100755 --- a/packages/apps/Settings/AndroidManifest.xml +++ b/packages/apps/Settings/AndroidManifest.xml @@ -1868,6 +1868,24 @@ + + + + + + + + + + + + + NS%G}U;vjb? zhIQv;UV>C6dj$D1FjT2AFf_CjA5L~c#`DCC7XMsm#F_88EW4Dvpb_@(mik>cxArXh)UbD^+2^3*_kYBDI$Swb1 z@iixI?$xZ-jvF@%a&tQhaQY^l@GWbFU-habxUyN@=<6)~6rISn z+0{a~sn4pX{iDSEi|5|d$W<50U+>D>zFOyWoP@ez``n7=#Rpxco~&%l-_cY%L1IV4 z_6kwy>KVLlbqijV?M|-NKfS5r>3NIjM%f*GcPj*5FaII(%`VE@C}pk3tnB5byMFI9 zm~+_k&VjiJi-fn;S*5PcnUXs5Ql8@9Ne3oPuFN^CyXSCc!JU5Fw-y@g(%noR8cnn8 zzC9M4_c)+t_3^|9{!9XlC5IyAkAH|NR^8pym=n6m_RzI!FBbQ9TgYzf^Z60W(D}); z=4j*{-e`X{k<&HaS?@El4%*&1Qog0=-v1)TFFY+jSf+neoS}8WTXKT-1Q7?Vt-`au z>~6_qb_^4YxyIwc81gWME!=cU{=vdM7hWt7J-@?LAu~_0yQ`pvP2TjWc;5q?d9DS2 zefBCC+UBni=h!7#a(Lb{Ww|3^Av0ISyH5^eZnwZPq37{}O%>}Re(f`qFcsadbjo%|udn07taVE-y~yyod?P68x|^(s@A5uoKgl!v zs~vmKR&;)!m9^{Rag*Y-Ma@Wn!*tU~Xk#@MqZqZxju=`6-!cmAEzZ{+9R-)F276 tAviy+q&%@GmBBG3KPgqgGdD3kH7GSPrLyp3Dky0)c)I$ztaD0e0s#AqSSkPj literal 0 HcmV?d00001 diff --git a/packages/apps/Settings/res/values-zh-rCN/strings.xml b/packages/apps/Settings/res/values-zh-rCN/strings.xml old mode 100644 new mode 100755 index 1e8eac9f64..b6c79b6459 --- a/packages/apps/Settings/res/values-zh-rCN/strings.xml +++ b/packages/apps/Settings/res/values-zh-rCN/strings.xml @@ -2539,6 +2539,14 @@ 截屏管理器版本 设置截屏图片存储位置 秒以后截屏 + + + 双屏显示 + 双屏显示手册 + 双屏显示 + "启用此功能,如果有连接hdmi,您可以在平板和电视两个屏幕上运行不同的应用,比如说您可以在电视上播放视频,而平板上运行其它应用程序。 + \n\n两屏显示模式切换:\n
    \n两屏显示不同内容:\n 手指触摸屏幕左边50个像素区域快速向右滑动或者触摸屏幕右边50个像素区域快速向左滑动,焦点应用窗口就只在电视上显示,而平板上可以操作其它的应用程序。 + \n\n两屏显示相同内容:\n 状态栏上有一个同步的按钮(在最近打开应用程序图标的右边),点击按钮即可让两屏显示相同内容。
"
以太网 diff --git a/packages/apps/Settings/res/values/strings.xml b/packages/apps/Settings/res/values/strings.xml old mode 100644 new mode 100755 index 59b9715ecd..c26730719f --- a/packages/apps/Settings/res/values/strings.xml +++ b/packages/apps/Settings/res/values/strings.xml @@ -6081,6 +6081,14 @@ Set the location of screenshot storage s later capture + + Dual-Screen + Dual-Screen Manual + Dual screen + "When this feature is turned on,If the pad have connected to the HDMI,you can run different applications in pad and TV two screens,for example, you can play video on TV, and run other applications on pad. + \n\nThe switching of two display mode:\n
    \nShow different content on two screen:\n Touch screen on the left side of the 50 pixel region and fast slide to the right or touch screen on the right side of the 50 pixel region and fast slide to the left, the focus application window will only display on TV, and the pad can operate other applications. + \n\nShow same content on two screen:\n There is a simultaneous button on the status bar (right of the recently application icon), click on the button to make the two screen display the same content.
"
+ Ethernet Connect diff --git a/packages/apps/Settings/res/xml/display_settings.xml b/packages/apps/Settings/res/xml/display_settings.xml old mode 100644 new mode 100755 index b65cd1c452..2211ff2473 --- a/packages/apps/Settings/res/xml/display_settings.xml +++ b/packages/apps/Settings/res/xml/display_settings.xml @@ -119,6 +119,12 @@ android:targetPackage="com.android.settings" android:targetClass="com.android.settings.screen.ScreenScaleActivity" /> + + + diff --git a/packages/apps/Settings/res/xml/dualscreen.xml b/packages/apps/Settings/res/xml/dualscreen.xml new file mode 100755 index 0000000000..0dca3eb25f --- /dev/null +++ b/packages/apps/Settings/res/xml/dualscreen.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/packages/apps/Settings/src/com/android/settings/Settings.java b/packages/apps/Settings/src/com/android/settings/Settings.java index 6795e313b0..92f5e1e7a5 100755 --- a/packages/apps/Settings/src/com/android/settings/Settings.java +++ b/packages/apps/Settings/src/com/android/settings/Settings.java @@ -104,5 +104,6 @@ public class Settings extends SettingsActivity { public static class HdmiSettingsActivity extends SettingsActivity { /* empty */ } public static class ScreenshotSettingsActivity extends SettingsActivity { /* empty */ } public static class UsbConnectSettingsActivity extends SettingsActivity { /* empty */ } + public static class DualscreenSettingsActivity extends SettingsActivity { /* empty */ } } diff --git a/packages/apps/Settings/src/com/android/settings/SettingsActivity.java b/packages/apps/Settings/src/com/android/settings/SettingsActivity.java index b2fa3b150e..611984fd28 100755 --- a/packages/apps/Settings/src/com/android/settings/SettingsActivity.java +++ b/packages/apps/Settings/src/com/android/settings/SettingsActivity.java @@ -115,6 +115,7 @@ import com.android.settings.wifi.p2p.WifiP2pSettings; import com.android.settings.HdmiSettings; import com.android.settings.ScreenshotSetting; import com.android.settings.UsbSetting; +import com.android.settings.dualscreen.DualscreenSettings; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; @@ -312,7 +313,8 @@ public class SettingsActivity extends Activity ApnSettings.class.getName(), HdmiSettings.class.getName(), ScreenshotSetting.class.getName(), - UsbSetting.class.getName() + UsbSetting.class.getName(), + DualscreenSettings.class.getName() }; diff --git a/packages/apps/Settings/src/com/android/settings/dualscreen/DualscreenSettings.java b/packages/apps/Settings/src/com/android/settings/dualscreen/DualscreenSettings.java new file mode 100755 index 0000000000..588cd29e0c --- /dev/null +++ b/packages/apps/Settings/src/com/android/settings/dualscreen/DualscreenSettings.java @@ -0,0 +1,202 @@ +/* + * Copyright (C) 2012 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.settings.dualscreen; + +import android.app.Activity; +import android.app.Dialog; +import android.app.DialogFragment; +import android.app.Fragment; +import android.content.ContentResolver; +import android.content.Context; +import android.content.DialogInterface; +import android.content.pm.PackageManager; +import android.database.DataSetObserver; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.preference.Preference; +import android.preference.PreferenceActivity; +import android.preference.PreferenceFragment; +import android.preference.PreferenceGroupAdapter; +import android.text.TextUtils; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.ListAdapter; +import android.widget.ListView; +import android.widget.Switch; +import android.widget.TextView; +import android.database.ContentObserver; +import android.os.Handler; +import android.provider.Settings; +import android.app.ActivityManagerNative; +import android.app.IActivityManager; +import android.content.res.Configuration; +import android.os.RemoteException; +import com.android.settings.R; +import android.view.Gravity; + +import com.android.settings.SettingsActivity; +import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.widget.SwitchBar; + + +public class DualscreenSettings extends SettingsPreferenceFragment implements SwitchBar.OnSwitchChangeListener { + private static final String TAG = DualscreenSettings.class.getSimpleName(); + static final boolean DEBUG = true; + + private static final String KEY_DUALSCREEN_MANUAL = "dualscreen_manual"; + private boolean mOpened; + + private final String store_key = Settings.System.DUAL_SCREEN_MODE; + private final String icon_key = Settings.System.DUAL_SCREEN_ICON_USED; + + private final int DUAL_SCREEN_CLOSE = 0; + private final int DUAL_SCREEN_OPEN = 1; + + private Context mContext; + private SwitchBar mSwitchBar; + + @Override + public void onAttach(Activity activity) { + logd("onAttach(%s)", activity.getClass().getSimpleName()); + super.onAttach(activity); + mContext = activity; + } + + @Override + public void onCreate(Bundle icicle) { + logd("onCreate(%s)", icicle); + super.onCreate(icicle); + + //mManual = (PreferenceScreen)findPreference(KEY_DUALSCREEN_MANUAL); + } + + @Override + public void onSwitchChanged(Switch switchView, boolean isChecked) { + logd("-----------------------------isChecked:"+isChecked); + int value = DUAL_SCREEN_CLOSE; + + mContext.getContentResolver().unregisterContentObserver(mValueObserver); + mContext.getContentResolver().registerContentObserver(Settings.System.getUriFor(store_key), false, mValueObserver); + if (isChecked) { + value = DUAL_SCREEN_OPEN; + } else { + Settings.System.putInt(mContext.getContentResolver(), icon_key, 0); + } + Settings.System.putInt(mContext.getContentResolver(), store_key, value); + handleStateChanged(value); + } + + @Override + public void onStart() { + logd("onStart()"); + super.onStart(); + } + + @Override + public void onDestroyView() { + logd("onDestroyView()"); + super.onDestroyView(); + + mSwitchBar.removeOnSwitchChangeListener(this); + mSwitchBar.hide(); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + logd("onActivityCreated(%s)", savedInstanceState); + super.onActivityCreated(savedInstanceState); + + ListView listView = getListView(); + listView.setItemsCanFocus(true); + + TextView emptyView = (TextView) getView().findViewById(android.R.id.empty); + emptyView.setText(R.string.dualscreen_manual_summary); + emptyView.setTextSize(24); + emptyView.setGravity(Gravity.LEFT); + listView.setEmptyView(emptyView); + + final SettingsActivity sa = (SettingsActivity) getActivity(); + mSwitchBar = sa.getSwitchBar(); + mSwitchBar.addOnSwitchChangeListener(this); + mSwitchBar.show(); + } + + @Override + public void onPause() { + logd("onPause()"); + super.onPause(); + + mContext.getContentResolver().unregisterContentObserver(mValueObserver); + } + + @Override + public void onResume() { + logd("onResume()"); + super.onResume(); + handleStateChanged(getDualScreenValue()); + mContext.getContentResolver().registerContentObserver(Settings.System.getUriFor(store_key), false, mValueObserver); + } + + private int getDualScreenValue(){ + return Settings.System.getInt(mContext.getContentResolver(), store_key, DUAL_SCREEN_CLOSE); + } + + void handleStateChanged(int state) { + switch (state) { + case DUAL_SCREEN_CLOSE: + mSwitchBar.setChecked(false); + break; + case DUAL_SCREEN_OPEN: + mSwitchBar.setChecked(true); + break; + } + } + + private final ContentObserver mValueObserver = new ContentObserver(new Handler()) { + @Override + public void onChange(boolean selfChange) { + final boolean enable = (DUAL_SCREEN_CLOSE != getDualScreenValue()); + Log.d(TAG, "onchagne enable=" + enable + ", selfChange=" + selfChange); + + try { + IActivityManager am = ActivityManagerNative.getDefault(); + Configuration config = am.getConfiguration(); + + // Will set userSetLocale to indicate this isn't some passing default - the user + // wants this remembered + config.setDualScreenFlag(enable); + + am.updateConfiguration(config); + + } catch (RemoteException e) { + // Intentionally left blank + } + } + }; + + private static void logd(String msg, Object... args) { + if (DEBUG) + Log.d(TAG, args == null || args.length == 0 ? msg : String.format(msg, args)); + } + +}