/* * 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. */ package com.android.systemui.statusbar.phone; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.content.Context; import android.content.res.Resources; import android.os.ServiceManager; import android.util.AttributeSet; import android.util.Slog; import android.view.animation.AccelerateInterpolator; import android.view.Display; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.Surface; import android.view.WindowManager; import android.widget.LinearLayout; import android.content.Intent; import android.view.View.OnClickListener; import android.view.View.OnLongClickListener; import android.app.Activity; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.util.Log; import android.content.pm.PackageManager; import java.util.HashMap; import android.widget.Toast; // for ViewPager import android.support.v4.viewpager.ViewPager; import android.support.v4.viewpager.ViewPager.OnPageChangeListener; import android.support.v4.viewpager.PagerAdapter; import android.view.LayoutInflater; import android.os.Parcelable; import android.widget.FrameLayout; // for toggle setting import android.content.BroadcastReceiver; import android.content.IntentFilter; import android.net.wifi.WifiManager; import android.net.wifi.WifiConfiguration; import android.bluetooth.BluetoothAdapter; import android.widget.ImageView; import android.provider.Settings; import android.provider.Settings.SettingNotFoundException; import android.net.Uri; import android.media.AudioManager; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; // for onClick import android.os.SystemClock; import android.os.RemoteException; import android.view.IWindowManager; import android.view.KeyCharacterMap; import android.view.KeyEvent; import com.android.internal.statusbar.IStatusBarService; import com.android.systemui.R; public class NavigationBarView extends LinearLayout implements OnPageChangeListener { final static boolean DEBUG = false; final static String TAG = "PhoneStatusBar/NavigationBarView"; final static boolean DEBUG_DEADZONE = false; final static boolean NAVBAR_ALWAYS_AT_RIGHT = true; final static boolean ANIMATE_HIDE_TRANSITION = false; // turned off because it introduces unsightly delay when videos goes to full screen protected IStatusBarService mBarService; final Display mDisplay; View mCurrentView = null; View[] mRotatedViews = new View[4]; HashMap<String, View> mViewHashMap = new HashMap<String, View>(); ViewPager mViewPager; ViewAdapter mAdapter; SettingChangedReceiver mSettingChangedReceiver; OnViewPagerItemInstantiatedListener mListener; // for toggle setting WifiReceiver mWifiReceiver; BluetoothReceiver mBluetoothReceiver; GpsReceiver mGpsReceiver; SoundReceiver mSoundReceiver; WifiApReceiver mWifiApReceiver; boolean mAlwaysShowMenu = true; boolean mOpenStatusBarLeft = false; boolean mOpenStatusBarRight = false; int mBarSize; boolean mVertical; boolean mHidden, mLowProfile, mShowMenu; int mDisabledFlags = 0; public View getRecentsButton() { return mCurrentView.findViewById(R.id.recent_apps); } public View getMenuButton() { return mCurrentView.findViewById(R.id.menu); } public View getBackButton() { return mCurrentView.findViewById(R.id.back); } public View getHomeButton() { return mCurrentView.findViewById(R.id.home); } public View getSearchButton() { return mCurrentView.findViewById(R.id.search); } public View getOptionalButton() { return mCurrentView.findViewById(R.id.optional); } public NavigationBarView(Context context, AttributeSet attrs) { super(context, attrs); mHidden = false; mDisplay = ((WindowManager)context.getSystemService( Context.WINDOW_SERVICE)).getDefaultDisplay(); mBarService = IStatusBarService.Stub.asInterface( ServiceManager.getService(Context.STATUS_BAR_SERVICE)); final Resources res = mContext.getResources(); mBarSize = res.getDimensionPixelSize(R.dimen.navigation_bar_size); mVertical = false; mShowMenu = true; } View.OnTouchListener mLightsOutListener = new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { // even though setting the systemUI visibility below will turn these views // on, we need them to come up faster so that they can catch this motion // event setLowProfile(false, false, false); try { mBarService.setSystemUiVisibility(0); } catch (android.os.RemoteException ex) { } } return false; } }; public void setDisabledFlags(int disabledFlags) { setDisabledFlags(disabledFlags, false); } public void setDisabledFlags(int disabledFlags, boolean force) { if (!force && mDisabledFlags == disabledFlags) return; mDisabledFlags = disabledFlags; final boolean disableHome = ((disabledFlags & View.STATUS_BAR_DISABLE_HOME) != 0); final boolean disableRecent = ((disabledFlags & View.STATUS_BAR_DISABLE_RECENT) != 0); final boolean disableBack = ((disabledFlags & View.STATUS_BAR_DISABLE_BACK) != 0); View backView = getBackButton(); if (backView != null) backView.setVisibility(disableBack ? View.INVISIBLE : View.VISIBLE); View homeView = getHomeButton(); if (homeView != null) homeView.setVisibility(disableHome ? View.INVISIBLE : View.VISIBLE); View recentsView = getRecentsButton(); if (recentsView != null) recentsView.setVisibility(disableRecent ? View.INVISIBLE : View.VISIBLE); // メニューキー・サーチキー・オプショナルキーの表示・非表示をホームキーと同期させる View menuView = getMenuButton(); if (menuView != null) menuView.setVisibility(disableHome ? View.INVISIBLE : View.VISIBLE); View searchView = getSearchButton(); if (searchView != null) searchView.setVisibility(disableHome ? View.INVISIBLE : View.VISIBLE); View optionalView = getOptionalButton(); if (optionalView != null) optionalView.setVisibility(disableHome ? View.INVISIBLE : View.VISIBLE); View centerPage = mAdapter.getView(1); if (centerPage != null) centerPage.setVisibility(disableHome ? View.INVISIBLE : View.VISIBLE); } public void setMenuVisibility(final boolean show) { setMenuVisibility(show, false); } public void setMenuVisibility(final boolean show, final boolean force) { // SharedPreferences pref = getSharedPreferences(); // if (pref == null) return; // boolean alwaysShowMenu = pref.getBoolean("always_show_menu", true); setMenuVisibility(show, force, mAlwaysShowMenu); } public void setMenuVisibility(final boolean show, final boolean force, final boolean alwaysShowMenu) { if (alwaysShowMenu && mShowMenu == true) return; if (!force && mShowMenu == show) return; mShowMenu = show; //getMenuButton().setVisibility(mShowMenu ? View.VISIBLE : View.INVISIBLE); View menu = mViewHashMap.get("Menu"); if (menu != null && menu.getVisibility() != View.GONE) menu.setVisibility(mShowMenu ? View.VISIBLE : View.INVISIBLE); menu = mViewHashMap.get("Menu2"); if (menu != null && menu.getVisibility() != View.GONE) menu.setVisibility(mShowMenu ? View.VISIBLE : View.INVISIBLE); menu = mViewHashMap.get("Menu3"); if (menu != null && menu.getVisibility() != View.GONE) menu.setVisibility(mShowMenu ? View.VISIBLE : View.INVISIBLE); } public void setLowProfile(final boolean lightsOut) { setLowProfile(lightsOut, true, false); } public void setLowProfile(final boolean lightsOut, final boolean animate, final boolean force) { if (!force && lightsOut == mLowProfile) return; mLowProfile = lightsOut; if (DEBUG) Slog.d(TAG, "setting lights " + (lightsOut?"out":"on")); final View navButtons = mCurrentView.findViewById(R.id.nav_buttons); final View lowLights = mCurrentView.findViewById(R.id.lights_out); // ok, everyone, stop it right there navButtons.animate().cancel(); lowLights.animate().cancel(); if (!animate) { navButtons.setAlpha(lightsOut ? 0f : 1f); lowLights.setAlpha(lightsOut ? 1f : 0f); lowLights.setVisibility(lightsOut ? View.VISIBLE : View.GONE); } else { navButtons.animate() .alpha(lightsOut ? 0f : 1f) .setDuration(lightsOut ? 600 : 200) .start(); lowLights.setOnTouchListener(mLightsOutListener); if (lowLights.getVisibility() == View.GONE) { lowLights.setAlpha(0f); lowLights.setVisibility(View.VISIBLE); } lowLights.animate() .alpha(lightsOut ? 1f : 0f) .setStartDelay(lightsOut ? 500 : 0) .setDuration(lightsOut ? 1000 : 300) .setInterpolator(new AccelerateInterpolator(2.0f)) .setListener(lightsOut ? null : new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator _a) { lowLights.setVisibility(View.GONE); } }) .start(); } } public void setHidden(final boolean hide) { if (hide == mHidden) return; mHidden = hide; Slog.d(TAG, (hide ? "HIDING" : "SHOWING") + " navigation bar"); // bring up the lights no matter what setLowProfile(false); } public void onFinishInflate() { mRotatedViews[Surface.ROTATION_0] = mRotatedViews[Surface.ROTATION_180] = findViewById(R.id.rot0); mRotatedViews[Surface.ROTATION_90] = findViewById(R.id.rot90); mRotatedViews[Surface.ROTATION_270] = NAVBAR_ALWAYS_AT_RIGHT ? findViewById(R.id.rot90) : findViewById(R.id.rot270); for (View v : mRotatedViews) { // this helps avoid drawing artifacts with glowing navigation keys ViewGroup group = (ViewGroup) v.findViewById(R.id.nav_buttons); group.setMotionEventSplittingEnabled(false); } mCurrentView = mRotatedViews[Surface.ROTATION_0]; mSettingChangedReceiver = new SettingChangedReceiver(); IntentFilter settingChangedFilter = new IntentFilter(); settingChangedFilter.addAction("com.android.systemui.statusbar.NAVIGATION_BAR_SETTING_CHANGED"); settingChangedFilter.addAction("com.android.systemui.statusbar.TOGGLE_BAR_SETTING_CHANGED"); settingChangedFilter.addAction("com.android.systemui.statusbar.MAIN_SETTING_CHANGED"); settingChangedFilter.addAction("com.android.systemui.statusbar.ON_NOTIFICATION_CLICKED"); mContext.registerReceiver(mSettingChangedReceiver, settingChangedFilter); // toggle settings mWifiReceiver = new WifiReceiver(); mBluetoothReceiver = new BluetoothReceiver(); mGpsReceiver = new GpsReceiver(); mSoundReceiver = new SoundReceiver(); mWifiApReceiver = new WifiApReceiver(); mAdapter = new ViewAdapter(mContext); mViewPager = (ViewPager)((FrameLayout) findViewById(R.id.rot02)).findViewById(R.id.viewpager); mViewPager.setAdapter(mAdapter); mViewPager.setOnPageChangeListener(this); mViewPager.setCurrentItem(1); IntentFilter wifiFilter = new IntentFilter("android.net.wifi.WIFI_STATE_CHANGED"); mContext.registerReceiver(mWifiReceiver, wifiFilter); IntentFilter bluetoothFilter = new IntentFilter("android.bluetooth.adapter.action.STATE_CHANGED"); mContext.registerReceiver(mBluetoothReceiver, bluetoothFilter); IntentFilter gpsFilter = new IntentFilter("android.location.PROVIDERS_CHANGED"); mContext.registerReceiver(mGpsReceiver, gpsFilter); IntentFilter soundFilter = new IntentFilter("android.media.RINGER_MODE_CHANGED"); mContext.registerReceiver(mSoundReceiver, soundFilter); IntentFilter wifiApFilter = new IntentFilter("android.net.wifi.WIFI_AP_STATE_CHANGED"); mContext.registerReceiver(mWifiApReceiver, wifiApFilter); } public void reorient() { View viewPagerView = findViewById(R.id.rot02); final int rot = mDisplay.getRotation(); for (int i=0; i<4; i++) { mRotatedViews[i].setVisibility(View.GONE); } mCurrentView = mRotatedViews[rot]; if (rot == 0) { viewPagerView.setVisibility(View.VISIBLE); } else { mCurrentView.setVisibility(View.VISIBLE); viewPagerView.setVisibility(View.GONE); } mVertical = (rot == Surface.ROTATION_90 || rot == Surface.ROTATION_270); // force the low profile & disabled states into compliance setLowProfile(mLowProfile, false, true /* force */); setDisabledFlags(mDisabledFlags, true /* force */); setMenuVisibility(mShowMenu, true /* force */); if (DEBUG_DEADZONE) { mCurrentView.findViewById(R.id.deadzone).setBackgroundColor(0x808080FF); } if (DEBUG) { Slog.d(TAG, "reorient(): rot=" + mDisplay.getRotation()); } } private class ViewAdapter extends PagerAdapter { private static final int VIEWCOUNT = 3; private final LayoutInflater mInflater; private View[] views = new View[VIEWCOUNT]; public ViewAdapter(Context context) { mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public void destroyItem(final View collection, final int position, final Object view) { ((ViewPager) collection).removeView((View) view); } @Override public void finishUpdate(final View collection) { } @Override public int getCount() { return VIEWCOUNT; } @Override public Object instantiateItem(final View collection, final int position) { final ViewPager pager = (ViewPager) collection; View view; if (position == 0) { views[position] = mInflater.inflate(R.layout.navigation_bar_left_page, pager, false); View clock = views[position].findViewById(R.id.clock); clock.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClassName("com.google.android.deskclock", "com.android.deskclock.AlarmClock"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); try { mContext.startActivity(intent); } catch (android.content.ActivityNotFoundException e) { e.printStackTrace(); } mViewPager.setCurrentItem(1); } }); } else if (position == 1) { final View centerView = mInflater.inflate(R.layout.navigation_bar_center_page, pager, false); setUpNavigationBarKeys(centerView); // for optionalButton action View optionalButton = centerView.findViewById(R.id.optional); if (optionalButton != null) { optionalButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent("com.android.systemui.statusbar.OPTIONAL_BUTTON_CLICKED"); mContext.sendBroadcast(intent); } }); } mListener.onItemInstantiated(centerView.findViewById(R.id.recent_apps)); views[position] = centerView; } else { View settingView = mInflater.inflate(R.layout.navigation_bar_right_page, pager, false); mWifiReceiver.onItemInstantiated(settingView); mBluetoothReceiver.onItemInstantiated(settingView); mGpsReceiver.onItemInstantiated(settingView); mSoundReceiver.onItemInstantiated(settingView); mWifiApReceiver.onItemInstantiated(settingView); setUpRotationButton(settingView); views[position] = settingView; } pager.addView(views[position]); SharedPreferences pref = getSharedPreferences(); if (pref != null) { if (pref.getBoolean("always_show_menu", true)) { setMenuVisibility(true, true, true); } if (pref.getBoolean("open_statusbar_left", false)) { mOpenStatusBarLeft = true; } else { mOpenStatusBarLeft = false; } if (pref.getBoolean("open_statusbar_right", false)) { mOpenStatusBarRight = true; } else { mOpenStatusBarRight = false; } } return views[position]; } @Override public boolean isViewFromObject(final View view, final Object object) { return view == (View) object; } @Override public void restoreState(final Parcelable parcel, final ClassLoader classLoader) { } @Override public Parcelable saveState() { return null; } @Override public void startUpdate(final View collection) { } public View getView(int position) { return views[position]; } } private void setUpNavigationBarKeys(View view) { SharedPreferences pref = getSharedPreferences(); if (pref == null) { Log.d("setUpNavigationBarKeys", "pref is null"); return; } if (pref.getString("keyname1", null) == null) { Log.d("setUpNavigationBarKeys", "keyname1 is null"); return; } ViewGroup group = (ViewGroup) view.findViewById(R.id.nav_buttons); if (mViewHashMap.size() == 0) { View menuView = group.findViewById(R.id.menu); mViewHashMap.put("Menu", menuView); View backView = group.findViewById(R.id.back); mViewHashMap.put("Back", backView); View homeView = group.findViewById(R.id.home); mViewHashMap.put("Home", homeView); View searchView = group.findViewById(R.id.search); mViewHashMap.put("Search", searchView); View recentView = group.findViewById(R.id.recent_apps); mViewHashMap.put("RecentApps", recentView); View optionalView = group.findViewById(R.id.optional); mViewHashMap.put("Optional", optionalView); View menu2View = group.findViewById(R.id.menu2); mViewHashMap.put("Menu2", menu2View); View menu3View = group.findViewById(R.id.menu3); mViewHashMap.put("Menu3", menu3View); View spacer1View = group.findViewById(R.id.spacer1); mViewHashMap.put("Spacer1", spacer1View); View spacer2View = group.findViewById(R.id.spacer2); mViewHashMap.put("Spacer2", spacer2View); } group.removeAllViews(); final int FP = LinearLayout.LayoutParams.FILL_PARENT; int showKeyCount = pref.getInt("showKeyCount", 10); int keyCount = 10; int showedCount = 0; for (int i = 0; i < keyCount; i++) { String keyName = pref.getString("keyname" + String.valueOf(i), null); if (keyName == null) continue; View currentView = mViewHashMap.get(keyName); if (currentView == null) continue; int dpWidth = pref.getInt("size" + String.valueOf(i), -1); if (dpWidth < 0) dpWidth = 40; final float scale = getResources().getDisplayMetrics().density; int pxWidth = (int)(dpWidth * scale + 0.5f); currentView.setLayoutParams(new LinearLayout.LayoutParams(pxWidth, FP, 0)); group.addView(currentView); boolean show = pref.getBoolean("show" + String.valueOf(i), true); if (!show) { currentView.setVisibility(View.GONE); } else { currentView.setVisibility(View.VISIBLE); } if (show) showedCount++; if (showedCount != showKeyCount && show) { View padView = new View(mContext); LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(FP, FP, (float)1.0); padView.setLayoutParams(layoutParams); padView.setVisibility(View.INVISIBLE); group.addView(padView); } } } public void setListener(OnViewPagerItemInstantiatedListener listener) { mListener = listener; } public interface OnViewPagerItemInstantiatedListener { public void onItemInstantiated(View view); } public class SettingChangedReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //Log.d("SettingChangedReceiver", "intent received"); String action = intent.getAction(); if ("com.android.systemui.statusbar.NAVIGATION_BAR_SETTING_CHANGED".equals(action)) { View view = mAdapter.getView(1); if (view == null) return; setUpNavigationBarKeys(view); mViewPager.setCurrentItem(1); } else if ("com.android.systemui.statusbar.TOGGLE_BAR_SETTING_CHANGED".equals(action)) { } else if ("com.android.systemui.statusbar.MAIN_SETTING_CHANGED".equals(action)) { //Log.d("SettingChangedReceiver", "main_setting_changed intent received"); if (intent.getBooleanExtra("always_show_menu", false)) { //Log.d("SettingChangedReceiver", "always_show_menu received"); mAlwaysShowMenu = intent.getBooleanExtra("value", true); if (mAlwaysShowMenu) { setMenuVisibility(true, true, true); } else { setMenuVisibility(mShowMenu, true, false); } } if (intent.getBooleanExtra("open_statusbar_left", false)) { mOpenStatusBarLeft = intent.getBooleanExtra("value", true); } if (intent.getBooleanExtra("open_statusbar_right", false)) { mOpenStatusBarRight = intent.getBooleanExtra("value", true); } } else if ("com.android.systemui.statusbar.ON_NOTIFICATION_CLICKED".equals(action)) { //Log.d("SettingChangedReceiver", "ON_NOTIFICATION_CLICKED"); mViewPager.setCurrentItem(1); } } } private void setUpRotationButton(View view) { final View rotationSetting = view.findViewById(R.id.rot_setting); if (rotationSetting == null) return; final View rotationIndView = view.findViewById(R.id.rot_setting_ind); if (rotationIndView == null) return; rotationSetting.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { try { int rotationState = Settings.System.getInt(mContext.getContentResolver(), "accelerometer_rotation"); if (rotationState == 1) { Settings.System.putInt(mContext.getContentResolver(), "accelerometer_rotation", 0); rotationIndView.setBackgroundResource(android.R.color.darker_gray); } else { Settings.System.putInt(mContext.getContentResolver(), "accelerometer_rotation", 1); rotationIndView.setBackgroundResource(android.R.color.holo_blue_bright); } } catch (SettingNotFoundException e) { e.printStackTrace(); } } }); try { int rotationState = Settings.System.getInt(mContext.getContentResolver(), "accelerometer_rotation"); if (rotationState == 1) { rotationIndView.setBackgroundResource(android.R.color.holo_blue_bright); } else { rotationIndView.setBackgroundResource(android.R.color.darker_gray); } } catch (SettingNotFoundException e) { e.printStackTrace(); } } public class WifiReceiver extends BroadcastReceiver implements OnViewPagerItemInstantiatedListener { ImageView wifiIndView = null; @Override public void onReceive(Context context, Intent intent) { changeWifiIndState(); } public void onItemInstantiated(View view) { View wifiSetting = view.findViewById(R.id.wifi_setting); if (wifiSetting == null) return; wifiIndView = (ImageView) wifiSetting.findViewById(R.id.wifi_setting_ind); changeWifiIndState(); wifiSetting.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { WifiManager wifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); if (wifiManager == null) return; if (wifiManager.isWifiEnabled()) { wifiManager.setWifiEnabled(false); } else { wifiManager.setWifiEnabled(true); } } }); } private void changeWifiIndState() { WifiManager wifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); if (wifiManager == null) { Log.d("WifiReceiver", "wifiManager is null"); return; } if (wifiIndView == null) { Log.d("WifiReceiver", "wifiIndView is null"); return; } if (wifiManager.isWifiEnabled()) { wifiIndView.setBackgroundResource(android.R.color.holo_blue_bright); } else { wifiIndView.setBackgroundResource(android.R.color.darker_gray); } } } public class BluetoothReceiver extends BroadcastReceiver implements OnViewPagerItemInstantiatedListener { ImageView bluetoothIndView = null; @Override public void onReceive(Context context, Intent intent) { changeBluetoothIndState(); } public void onItemInstantiated(View view) { View bluetoothSetting = view.findViewById(R.id.bluetooth_setting); if (bluetoothSetting == null) return; bluetoothIndView = (ImageView) bluetoothSetting.findViewById(R.id.bluetooth_setting_ind); changeBluetoothIndState(); bluetoothSetting.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { BluetoothAdapter ba = BluetoothAdapter.getDefaultAdapter(); if (ba == null) { return; } if (bluetoothIndView == null) { return; } if (ba.isEnabled()) { ba.disable(); } else { ba.enable(); } } }); } private void changeBluetoothIndState() { BluetoothAdapter ba = BluetoothAdapter.getDefaultAdapter(); if (ba == null) { return; } if (bluetoothIndView == null) { return; } if (ba.isEnabled()) { bluetoothIndView.setBackgroundResource(android.R.color.holo_blue_bright); } else { bluetoothIndView.setBackgroundResource(android.R.color.darker_gray); } } } public class GpsReceiver extends BroadcastReceiver implements OnViewPagerItemInstantiatedListener { ImageView gpsIndView = null; @Override public void onReceive(Context context, Intent intent) { changeGpsIndState(); } public void onItemInstantiated(View view) { View gpsSetting = view.findViewById(R.id.gps_setting); if (gpsSetting == null) return; gpsIndView = (ImageView) gpsSetting.findViewById(R.id.gps_setting_ind); changeGpsIndState(); gpsSetting.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String provider = Settings.Secure.getString(mContext.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED); if(!provider.contains("gps")){ //if gps is disabled final Intent poke = new Intent(); poke.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider"); poke.addCategory(Intent.CATEGORY_ALTERNATIVE); poke.setData(Uri.parse("3")); mContext.sendBroadcast(poke); } else { final Intent poke = new Intent(); poke.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider"); poke.addCategory(Intent.CATEGORY_ALTERNATIVE); poke.setData(Uri.parse("3")); mContext.sendBroadcast(poke); } } }); } private void changeGpsIndState() { String gpsStatus = Settings.Secure.getString(mContext.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED); if (gpsIndView == null) { return; } if (gpsStatus.contains("gps")) { gpsIndView.setBackgroundResource(android.R.color.holo_blue_bright); } else { gpsIndView.setBackgroundResource(android.R.color.darker_gray); } } } public class SoundReceiver extends BroadcastReceiver implements OnViewPagerItemInstantiatedListener { ImageView soundIndView = null; ImageView soundButton = null; @Override public void onReceive(Context context, Intent intent) { changeSoundIndState(); } public void onItemInstantiated(View view) { View soundSetting = view.findViewById(R.id.sound_setting); if (soundSetting == null) return; soundIndView = (ImageView) soundSetting.findViewById(R.id.sound_setting_ind); soundButton = (ImageView) soundSetting.findViewById(R.id.sound_setting_icon); changeSoundIndState(); soundSetting.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); if (audioManager == null) return; int mode = audioManager.getRingerMode(); if (mode == AudioManager.RINGER_MODE_NORMAL) { audioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE); } else if (mode == AudioManager.RINGER_MODE_VIBRATE) { audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT); } else if (mode == AudioManager.RINGER_MODE_SILENT) { audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL); } } }); } private void changeSoundIndState() { AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); if (audioManager == null) return; if (soundIndView == null) return; if (soundButton == null) return; int mode = audioManager.getRingerMode(); if (mode == AudioManager.RINGER_MODE_NORMAL) { soundButton.setImageResource(R.drawable.ic_sound); soundIndView.setBackgroundResource(android.R.color.holo_blue_bright); } else if (mode == AudioManager.RINGER_MODE_VIBRATE) { soundButton.setImageResource(R.drawable.ic_sound_v); soundIndView.setBackgroundResource(android.R.color.holo_blue_dark); } else if (mode == AudioManager.RINGER_MODE_SILENT) { soundButton.setImageResource(R.drawable.ic_sound_s); soundIndView.setBackgroundResource(android.R.color.darker_gray); } } } public class WifiApReceiver extends BroadcastReceiver implements OnViewPagerItemInstantiatedListener { ImageView wifiApIndView = null; boolean prevWifiState = false; @Override public void onReceive(Context context, Intent intent) { changeWifiApIndState(); } public void onItemInstantiated(View view) { View wifiApSetting = view.findViewById(R.id.wifi_ap_setting); if (wifiApSetting == null) return; wifiApIndView = (ImageView) wifiApSetting.findViewById(R.id.wifi_ap_setting_ind); changeWifiApIndState(); wifiApSetting.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { WifiManager wifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); if (wifiManager == null) return; try { Method method = wifiManager.getClass().getMethod("isWifiApEnabled"); boolean isWifiApEnabled = ((Boolean)method.invoke(wifiManager)).booleanValue(); method = wifiManager.getClass().getMethod("getWifiApConfiguration"); //WifiConfiguration config = (WifiConfiguration) method.invoke(wifiManager); method = wifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class); if (isWifiApEnabled) { if (!((Boolean)method.invoke(wifiManager, null, false)).booleanValue()) { Toast.makeText(mContext, "cannot turn wifi tethering off", Toast.LENGTH_LONG).show(); } if (prevWifiState) { wifiManager.setWifiEnabled(true); } } else { if (wifiManager.isWifiEnabled()) { prevWifiState = true; wifiManager.setWifiEnabled(false); } else { prevWifiState = false; } if (!((Boolean)method.invoke(wifiManager, null, true)).booleanValue()) { Toast.makeText(mContext, "cannot turn wifi tethering on", Toast.LENGTH_LONG).show(); } } } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } }); } private void changeWifiApIndState() { WifiManager wifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); if (wifiManager == null) return; if (wifiApIndView == null) return; boolean isWifiApEnabled = false; try { Method method = wifiManager.getClass().getMethod("isWifiApEnabled"); isWifiApEnabled = ((Boolean)method.invoke(wifiManager)).booleanValue(); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } if (isWifiApEnabled) { wifiApIndView.setBackgroundResource(android.R.color.holo_blue_bright); } else { wifiApIndView.setBackgroundResource(android.R.color.darker_gray); } } } private SharedPreferences getSharedPreferences() { Context packageContext = null; try { packageContext = mContext.createPackageContext("net.virifi.android.navigationbarsettings", Context.CONTEXT_RESTRICTED); } catch (PackageManager.NameNotFoundException e) { //e.printStackTrace(); return null; } SharedPreferences pref = packageContext.getSharedPreferences("NavigationBarSettings", Activity.MODE_WORLD_READABLE | Activity.MODE_MULTI_PROCESS); return pref; } int mPrevPosition = 1; @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int paramPosition) { try { Object service = mContext.getSystemService("statusbar"); Class statusBarManager = Class.forName("android.app.StatusBarManager"); Method expand = statusBarManager.getMethod("expand"); Method collapse = statusBarManager.getMethod("collapse"); if (mPrevPosition == 1 && paramPosition == 0 && mOpenStatusBarLeft) { expand.invoke(service); } else if (mPrevPosition == 0 && paramPosition == 1 && mOpenStatusBarLeft) { collapse.invoke(service); } else if (mPrevPosition == 1 && paramPosition == 2 && mOpenStatusBarRight) { expand.invoke(service); } else if (mPrevPosition == 2 && paramPosition == 1 && mOpenStatusBarRight) { collapse.invoke(service); } } catch (ClassNotFoundException e) { } catch (SecurityException e) { } catch (NoSuchMethodException e) { } catch (IllegalArgumentException e) { } catch (IllegalAccessException e) { } catch (InvocationTargetException e) { } mPrevPosition = paramPosition; } @Override public void onPageScrollStateChanged(int state) { } }