/* * Copyright (C) 2013 75py * * 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.nagopy.android.xposed.utilities; import java.util.List; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.os.Bundle; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.PreferenceActivity; import android.preference.PreferenceFragment; import android.preference.PreferenceManager; import android.view.MenuItem; import com.google.analytics.tracking.android.EasyTracker; import com.google.analytics.tracking.android.GoogleAnalytics; import com.nagopy.android.xposed.ProcessorStringUtil; import com.nagopy.android.xposed.utilities.util.AnalyticsUtil; import com.nagopy.android.xposed.utilities.util.Const; import com.nagopy.android.xposed.utilities.util.Logger; /** * 設定画面を表示するアクティビティ. */ public class PrefActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SharedPreferences sp = PreferenceManager .getDefaultSharedPreferences(getApplicationContext()); GoogleAnalytics.getInstance(getApplicationContext()).setAppOptOut( sp.getBoolean(Const.KEY_GA_OPTOUT, true)); } @Override public void onStart() { super.onStart(); EasyTracker.getInstance(this).activityStart(this); } @Override public void onStop() { super.onStop(); EasyTracker.getInstance(this).activityStop(this); } @Override public void onBuildHeaders(List<Header> target) { super.onBuildHeaders(target); // ヘッダー読み込み loadHeadersFromResource(R.xml.pref_header, target); } @Override protected void onResume() { super.onResume(); SharedPreferences defaultSharedPreferences = PreferenceManager .getDefaultSharedPreferences(getApplicationContext()); defaultSharedPreferences.registerOnSharedPreferenceChangeListener(this); // 初回起動ならダイアログを表示 if (defaultSharedPreferences.getBoolean(Const.KEY_FIRST_FLAG, true)) { // フラグを消す defaultSharedPreferences.edit().putBoolean(Const.KEY_FIRST_FLAG, false).apply(); GASettingDialogFragment dialogFragment = new GASettingDialogFragment(); dialogFragment.show(getFragmentManager(), "dialog"); } } @Override protected void onPause() { super.onPause(); PreferenceManager.getDefaultSharedPreferences(getApplicationContext()) .unregisterOnSharedPreferenceChangeListener(this); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: // Navi up onBackPressed(); return true; } return super.onOptionsItemSelected(item); } @Override protected boolean isValidFragment(String fragmentName) { return true; } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { // 変更された値によってブロードキャストを送信するか調べる Object newValue = sharedPreferences.getAll().get(key); Logger.d("changed:" + key + "," + newValue); Intent intent = new Intent(); intent.putExtra("target", ProcessorStringUtil.snakeToCamel(key)); intent.putExtra("value", newValue instanceof String ? (String) newValue : newValue instanceof Integer ? (Integer) newValue : newValue instanceof Boolean ? (Boolean) newValue : ""); // Preferenceのタイトルのリソースは全てR.string.title_キーにしているので、それを使用してタイトルのリソースIDを取得 int titleId = getResources().getIdentifier("title_" + key, "string", getPackageName()); switch (titleId) { case R.string.title_master_mod_status_bar_enable: case R.string.title_status_bar_clock_text_size: case R.string.title_status_bar_clock_text_color: case R.string.title_status_bar_clock_force_english: case R.string.title_status_bar_clock_format: case R.string.title_status_bar_clock_gravity_horizontal: case R.string.title_status_bar_clock_gravity_vertical: case R.string.title_status_bar_clock_position: intent.setAction(Const.ACTION_STATUS_BAR_CLOCK_SETTING_CHANGED); break; case R.string.title_master_mod_lockscreen_clock_enable: case R.string.title_lockscreen_clock_date_format: case R.string.title_lockscreen_clock_date_text_color: case R.string.title_lockscreen_clock_date_text_size: case R.string.title_lockscreen_clock_date_force_english: case R.string.title_lockscreen_clock_time_format: case R.string.title_lockscreen_clock_time_text_color: case R.string.title_lockscreen_clock_time_text_size: case R.string.title_lockscreen_clock_time_force_english: intent.setAction(Const.ACTION_LOCKSCREEN_CLOCK_SETTING_CHANGED); break; case R.string.title_master_mod_notification_expanded_clock_enable: case R.string.title_notification_expanded_clock_date_format: case R.string.title_notification_expanded_clock_date_text_color: case R.string.title_notification_expanded_clock_date_text_size: case R.string.title_notification_expanded_clock_date_force_english: case R.string.title_notification_expanded_clock_time_format: case R.string.title_notification_expanded_clock_time_text_color: case R.string.title_notification_expanded_clock_time_text_size: case R.string.title_notification_expanded_clock_time_force_english: intent.setAction(Const.ACTION_NOTIFICATION_EXPANDED_CLOCK_SETTING_CHANGED); break; case R.string.ga_dllow_anonymous_usage_reports: // OptOut GoogleAnalytics.getInstance(getApplicationContext()).setAppOptOut( sharedPreferences.getBoolean(Const.KEY_GA_OPTOUT, false)); return; } // フォント選択で変更があったとき用の処理 if (key.startsWith("status_bar_clock_typeface")) { intent.setAction(Const.ACTION_STATUS_BAR_CLOCK_SETTING_CHANGED); } if (key.startsWith("lockscreen_clock_date_typeface") || key.startsWith("lockscreen_clock_time_typeface")) { intent.setAction(Const.ACTION_LOCKSCREEN_CLOCK_SETTING_CHANGED); } if (key.startsWith("notification_expanded_clock_date_typeface") || key.startsWith("notification_expanded_clock_time_typeface")) { intent.setAction(Const.ACTION_NOTIFICATION_EXPANDED_CLOCK_SETTING_CHANGED); } if (intent.getAction() != null) { // ブロードキャストを送信 Logger.d("sendBroadcast:" + key + "," + sharedPreferences.getAll().get(key)); sendBroadcast(intent); } // 設定変更をGAでトラッキング AnalyticsUtil.pushSettingChengedEvent(getApplicationContext(), key, newValue); } /** * 各モジュールの設定画面用フラグメント.<br> * XMLのextraで、name="xml_name"、value="@xml/resource"として使用する。 */ public static class ModPreferenceFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // XMLのリソースを取得してセット // extraで渡される値は「res/xml/abc.xml」なので、前後を削除 // TODO これで良いのか確認? String name = getArguments().getString("xml_name").replace("res/xml/", "") .replace(".xml", ""); int id = getActivity().getResources().getIdentifier(name, "xml", getActivity().getPackageName()); addPreferencesFromResource(id); } @Override public void onResume() { super.onResume(); // ナビの戻るボタンを表示 getActivity().getActionBar().setDisplayShowHomeEnabled(true); getActivity().getActionBar().setDisplayHomeAsUpEnabled(true); } @Override public void onStart() { super.onStart(); // 設定画面名をGAでトラッキング AnalyticsUtil.pushPreferenceCategory(getActivity().getApplicationContext(), getArguments().getString("xml_name")); } @Override public void onStop() { super.onStop(); // 設定画面名をGAでトラッキング AnalyticsUtil.pushPreferenceCategory(getActivity().getApplicationContext(), getArguments().getString("xml_name")); } } public static class ModImmersivePreferenceFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.pref_mod_immersive_full_screen_mode); Preference masterPreference = findPreference("master_mod_immersive_full_screen_mode_enabled"); Preference modePreference = findPreference("immersive_mode"); final Preference immersiveModeApps = findPreference("immersive_mode_packages"); final Preference hideNaviBarApps = findPreference("immersive_navi_bar_packages"); final SharedPreferences sp = PreferenceManager .getDefaultSharedPreferences(getActivity() .getApplicationContext()); Boolean isCustom = sp .getBoolean("master_mod_immersive_full_screen_mode_enabled", false) && sp.getString("immersive_mode", getString(R.string.immersive_mode_disable)).equals( getString(R.string.immersive_mode_custom)); immersiveModeApps.setEnabled(isCustom); hideNaviBarApps.setEnabled(isCustom); OnPreferenceChangeListener onPreferenceChangeListener = new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { String key = preference.getKey(); Boolean isCustom; if (key.equals("master_mod_immersive_full_screen_mode_enabled")) { isCustom = (Boolean) newValue && sp.getString("immersive_mode", getString(R.string.immersive_mode_disable)).equals( getString(R.string.immersive_mode_custom)); } else { isCustom = sp .getBoolean("master_mod_immersive_full_screen_mode_enabled", false) && newValue.equals(getString(R.string.immersive_mode_custom)); } immersiveModeApps.setEnabled(isCustom); hideNaviBarApps.setEnabled(isCustom); return true; } }; masterPreference.setOnPreferenceChangeListener(onPreferenceChangeListener); modePreference.setOnPreferenceChangeListener(onPreferenceChangeListener); } @Override public void onResume() { super.onResume(); // ナビの戻るボタンを表示 getActivity().getActionBar().setDisplayShowHomeEnabled(true); getActivity().getActionBar().setDisplayHomeAsUpEnabled(true); } } }