• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2013 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.settings.accessibility;
18 
19 import android.content.ContentResolver;
20 import android.content.Context;
21 import android.content.res.Resources;
22 import android.graphics.Point;
23 import android.media.AudioManager;
24 import android.media.MediaPlayer;
25 import android.media.MediaPlayer.OnPreparedListener;
26 import android.net.Uri;
27 import android.os.Bundle;
28 import android.provider.Settings;
29 import android.support.v7.preference.Preference;
30 import android.support.v7.preference.PreferenceScreen;
31 import android.support.v7.preference.PreferenceViewHolder;
32 import android.view.Display;
33 import android.view.ViewTreeObserver.OnGlobalLayoutListener;
34 import android.view.WindowManager;
35 import android.widget.ImageView;
36 import android.widget.RelativeLayout.LayoutParams;
37 import android.widget.Switch;
38 import android.widget.VideoView;
39 
40 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
41 import com.android.settings.R;
42 import com.android.settings.widget.SwitchBar;
43 
44 public class ToggleScreenMagnificationPreferenceFragment extends
45         ToggleFeaturePreferenceFragment implements SwitchBar.OnSwitchChangeListener {
46 
47     protected class VideoPreference extends Preference {
48         private ImageView mVideoBackgroundView;
49         private OnGlobalLayoutListener mLayoutListener;
50 
VideoPreference(Context context)51         public VideoPreference(Context context) {
52             super(context);
53         }
54 
55         @Override
onBindViewHolder(PreferenceViewHolder view)56         public void onBindViewHolder(PreferenceViewHolder view) {
57             super.onBindViewHolder(view);
58             Resources res = getPrefContext().getResources();
59             final int backgroundAssetWidth = res.getDimensionPixelSize(
60                     R.dimen.screen_magnification_video_background_width);
61             final int videoAssetWidth = res
62                     .getDimensionPixelSize(R.dimen.screen_magnification_video_width);
63             final int videoAssetHeight = res
64                     .getDimensionPixelSize(R.dimen.screen_magnification_video_height);
65             final int videoAssetMarginTop = res.getDimensionPixelSize(
66                     R.dimen.screen_magnification_video_margin_top);
67             view.setDividerAllowedAbove(false);
68             view.setDividerAllowedBelow(false);
69             mVideoBackgroundView = (ImageView) view.findViewById(R.id.video_background);
70             final VideoView videoView = (VideoView) view.findViewById(R.id.video);
71 
72             // Loop the video.
73             videoView.setOnPreparedListener(new OnPreparedListener() {
74                 @Override
75                 public void onPrepared(MediaPlayer mediaPlayer) {
76                     mediaPlayer.setLooping(true);
77                 }
78             });
79 
80             // Make sure the VideoView does not request audio focus.
81             videoView.setAudioFocusRequest(AudioManager.AUDIOFOCUS_NONE);
82 
83             // Resolve and set the video content
84             Bundle args = getArguments();
85             if ((args != null) && args.containsKey(
86                     AccessibilitySettings.EXTRA_VIDEO_RAW_RESOURCE_ID)) {
87                 videoView.setVideoURI(Uri.parse(String.format("%s://%s/%s",
88                         ContentResolver.SCHEME_ANDROID_RESOURCE,
89                         getPrefContext().getPackageName(),
90                         args.getInt(AccessibilitySettings.EXTRA_VIDEO_RAW_RESOURCE_ID))));
91             }
92 
93             // Make sure video controls (e.g. for pausing) are not displayed.
94             videoView.setMediaController(null);
95 
96             // LayoutListener for adjusting the position of the VideoView on the background image.
97             mLayoutListener = new OnGlobalLayoutListener() {
98                 @Override
99                 public void onGlobalLayout() {
100                     final int backgroundViewWidth = mVideoBackgroundView.getWidth();
101 
102                     LayoutParams videoLp = (LayoutParams) videoView.getLayoutParams();
103                     videoLp.width = videoAssetWidth * backgroundViewWidth / backgroundAssetWidth;
104                     videoLp.height = videoAssetHeight * backgroundViewWidth / backgroundAssetWidth;
105                     videoLp.setMargins(0,
106                             videoAssetMarginTop * backgroundViewWidth / backgroundAssetWidth, 0, 0);
107                     videoView.setLayoutParams(videoLp);
108                     videoView.invalidate();
109                     videoView.start();
110                     mVideoBackgroundView.getViewTreeObserver()
111                             .removeOnGlobalLayoutListener(mLayoutListener);
112                 }
113             };
114 
115             mVideoBackgroundView.getViewTreeObserver().addOnGlobalLayoutListener(mLayoutListener);
116         }
117 
118         @Override
onPrepareForRemoval()119         protected void onPrepareForRemoval() {
120             mVideoBackgroundView.getViewTreeObserver()
121                     .removeOnGlobalLayoutListener(mLayoutListener);
122         }
123     }
124 
125     protected VideoPreference mVideoPreference;
126     protected Preference mConfigWarningPreference;
127 
128     private boolean mLaunchFromSuw = false;
129     private boolean mInitialSetting = false;
130 
131     @Override
onCreate(Bundle savedInstanceState)132     public void onCreate(Bundle savedInstanceState) {
133         super.onCreate(savedInstanceState);
134 
135         mVideoPreference = new VideoPreference(getPrefContext());
136         mVideoPreference.setSelectable(false);
137         mVideoPreference.setPersistent(false);
138         mVideoPreference.setLayoutResource(R.layout.magnification_video_preference);
139 
140         mConfigWarningPreference = new Preference(getPrefContext());
141         mConfigWarningPreference.setSelectable(false);
142         mConfigWarningPreference.setPersistent(false);
143         mConfigWarningPreference.setVisible(false);
144         mConfigWarningPreference.setIcon(R.drawable.ic_warning_24dp);
145 
146         final PreferenceScreen preferenceScreen = getPreferenceManager().getPreferenceScreen();
147         preferenceScreen.setOrderingAsAdded(false);
148         mVideoPreference.setOrder(0);
149         mConfigWarningPreference.setOrder(2);
150         preferenceScreen.addPreference(mVideoPreference);
151         preferenceScreen.addPreference(mConfigWarningPreference);
152     }
153 
154     @Override
onResume()155     public void onResume() {
156         super.onResume();
157 
158         VideoView videoView = (VideoView) getView().findViewById(R.id.video);
159         if (videoView != null) {
160             videoView.start();
161         }
162 
163         updateConfigurationWarningIfNeeded();
164     }
165 
166     @Override
getMetricsCategory()167     public int getMetricsCategory() {
168         // TODO: Distinguish between magnification modes
169         return MetricsEvent.ACCESSIBILITY_TOGGLE_SCREEN_MAGNIFICATION;
170     }
171 
172     @Override
onSwitchChanged(Switch switchView, boolean isChecked)173     public void onSwitchChanged(Switch switchView, boolean isChecked) {
174         onPreferenceToggled(mPreferenceKey, isChecked);
175     }
176 
177     @Override
onPreferenceToggled(String preferenceKey, boolean enabled)178     protected void onPreferenceToggled(String preferenceKey, boolean enabled) {
179         Settings.Secure.putInt(getContentResolver(), preferenceKey, enabled ? 1 : 0);
180         updateConfigurationWarningIfNeeded();
181     }
182 
183     @Override
onInstallSwitchBarToggleSwitch()184     protected void onInstallSwitchBarToggleSwitch() {
185         super.onInstallSwitchBarToggleSwitch();
186 
187         mSwitchBar.setCheckedInternal(
188                 Settings.Secure.getInt(getContentResolver(), mPreferenceKey, 0) == 1);
189         mSwitchBar.addOnSwitchChangeListener(this);
190     }
191 
192     @Override
onRemoveSwitchBarToggleSwitch()193     protected void onRemoveSwitchBarToggleSwitch() {
194         super.onRemoveSwitchBarToggleSwitch();
195         mSwitchBar.removeOnSwitchChangeListener(this);
196     }
197 
198     @Override
onProcessArguments(Bundle arguments)199     protected void onProcessArguments(Bundle arguments) {
200         super.onProcessArguments(arguments);
201         if (arguments == null) {
202             return;
203         }
204 
205         if (arguments.containsKey(AccessibilitySettings.EXTRA_VIDEO_RAW_RESOURCE_ID)) {
206             mVideoPreference.setVisible(true);
207             final int resId = arguments.getInt(
208                     AccessibilitySettings.EXTRA_VIDEO_RAW_RESOURCE_ID);
209         } else {
210             mVideoPreference.setVisible(false);
211         }
212 
213         if (arguments.containsKey(AccessibilitySettings.EXTRA_LAUNCHED_FROM_SUW)) {
214             mLaunchFromSuw = arguments.getBoolean(AccessibilitySettings.EXTRA_LAUNCHED_FROM_SUW);
215         }
216 
217         if (arguments.containsKey(AccessibilitySettings.EXTRA_CHECKED)) {
218             mInitialSetting = arguments.getBoolean(AccessibilitySettings.EXTRA_CHECKED);
219         }
220     }
221 
updateConfigurationWarningIfNeeded()222     private void updateConfigurationWarningIfNeeded() {
223         final CharSequence warningMessage =
224                 MagnificationPreferenceFragment.getConfigurationWarningStringForSecureSettingsKey(
225                         mPreferenceKey, getPrefContext());
226         if (warningMessage != null) {
227             mConfigWarningPreference.setSummary(warningMessage);
228         }
229         mConfigWarningPreference.setVisible(warningMessage != null);
230     }
231 
getScreenWidth(Context context)232     private static int getScreenWidth(Context context) {
233         WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
234         Display display = wm.getDefaultDisplay();
235         Point size = new Point();
236         display.getSize(size);
237         return size.x;
238     }
239 }
240