/* * Copyright (C) 2015 The Dirty Unicorns 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.aokp.romcontrol.fragments.general; import android.app.Fragment; import android.content.Context; import android.os.Bundle; import android.os.PowerManager; import android.view.View; import android.view.ViewGroup; import android.preference.PreferenceFragment; import android.view.LayoutInflater; import android.widget.Switch; import android.widget.ListView; import android.widget.ArrayAdapter; import android.widget.TextView; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.AdapterView; import android.provider.Settings; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.app.AlertDialog; import android.content.DialogInterface; import java.util.List; import java.util.Iterator; import java.util.ArrayList; import java.util.Map; import java.util.HashMap; import java.util.Collections; import com.aokp.romcontrol.R; import com.android.internal.logging.MetricsLogger; public class WakelockBlockerFragment extends Fragment { private static final String TAG = "WakelockBlocker"; private Switch mBlockerEnabled; private ListView mWakeLockList; private List<String> mSeenWakeLocks; private List<String> mBlockedWakeLocks; private LayoutInflater mInflater; private Map<String, Boolean> mWakeLockState; private WakeLockListAdapter mListAdapter; private boolean mEnabled; private AlertDialog mAlertDialog; private boolean mAlertShown = false; private TextView mWakeLockListHeader; private static final int MENU_RELOAD = Menu.FIRST; private static final int MENU_SAVE = Menu.FIRST + 1; public class WakeLockListAdapter extends ArrayAdapter<String> { public WakeLockListAdapter(Context context, int resource, List<String> values) { super(context, R.layout.wakelock_item, resource, values); } @Override public View getView(int position, View convertView, ViewGroup parent) { View rowView = mInflater.inflate(R.layout.wakelock_item, parent, false); final CheckBox check = (CheckBox)rowView.findViewById(R.id.wakelock_blocked); check.setText(mSeenWakeLocks.get(position)); Boolean checked = mWakeLockState.get(check.getText().toString()); check.setChecked(checked.booleanValue()); if(checked.booleanValue()){ check.setTextColor(getResources().getColor(android.R.color.holo_red_light)); } check.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton v, boolean checked) { mWakeLockState.put(v.getText().toString(), new Boolean(checked)); if(checked){ check.setTextColor(getResources().getColor(android.R.color.holo_red_light)); } else { check.setTextColor(getResources().getColor(android.R.color.primary_text_dark)); } } }); return rowView; } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mInflater = inflater; setHasOptionsMenu(true); return inflater.inflate(R.layout.wakelock_blocker, container, false); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mWakeLockState = new HashMap<String, Boolean>(); updateSeenWakeLocksList(); updateBlockedWakeLocksList(); mBlockerEnabled = (Switch) getActivity().findViewById( R.id.wakelock_blocker_switch); mWakeLockList = (ListView) getActivity().findViewById( R.id.wakelock_list); mWakeLockListHeader = (TextView) getActivity().findViewById( R.id.wakelock_list_header); mListAdapter = new WakeLockListAdapter(getActivity(), android.R.layout.simple_list_item_multiple_choice, mSeenWakeLocks); mWakeLockList.setAdapter(mListAdapter); updateSwitches(); // after updateSwitches!!! mBlockerEnabled .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton v, boolean checked) { if (checked && isFirstEnable() && !mAlertShown){ showAlert(); mAlertShown = true; } Settings.System.putInt(getActivity().getContentResolver(), Settings.System.WAKELOCK_BLOCKING_ENABLED, checked?1:0); updateSwitches(); } }); } @Override public void onResume() { super.onResume(); } @Override public void onPause() { super.onPause(); } @Override public void onDestroy() { super.onDestroy(); } private boolean isFirstEnable() { return Settings.System.getString(getActivity().getContentResolver(), Settings.System.WAKELOCK_BLOCKING_ENABLED) == null; } private void updateSwitches() { mBlockerEnabled.setChecked(Settings.System.getInt(getActivity().getContentResolver(), Settings.System.WAKELOCK_BLOCKING_ENABLED, 0)==1?true:false); mEnabled = mBlockerEnabled.isChecked(); //mWakeLockList.setEnabled(mEnabled); mWakeLockList.setVisibility(mEnabled ?View.VISIBLE : View.INVISIBLE); mWakeLockListHeader.setVisibility(mEnabled ?View.VISIBLE : View.INVISIBLE); } private void updateSeenWakeLocksList() { PowerManager pm = (PowerManager) getActivity().getSystemService(Context.POWER_SERVICE); String seenWakeLocks = pm.getSeenWakeLocks(); mSeenWakeLocks = new ArrayList<String>(); if (seenWakeLocks!=null && seenWakeLocks.length()!=0){ String[] parts = seenWakeLocks.split("\\|"); for(int i = 0; i < parts.length; i++){ mSeenWakeLocks.add(parts[i]); mWakeLockState.put(parts[i], new Boolean(false)); } } } private void updateBlockedWakeLocksList() { String blockedWakelockList = Settings.System.getString(getActivity().getContentResolver(), Settings.System.WAKELOCK_BLOCKING_LIST); mBlockedWakeLocks = new ArrayList<String>(); if (blockedWakelockList!=null && blockedWakelockList.length()!=0){ String[] parts = blockedWakelockList.split("\\|"); for(int i = 0; i < parts.length; i++){ mBlockedWakeLocks.add(parts[i]); // add all blocked but not seen so far if(!mSeenWakeLocks.contains(parts[i])){ mSeenWakeLocks.add(parts[i]); } mWakeLockState.put(parts[i], new Boolean(true)); } } Collections.sort(mSeenWakeLocks); } private void save(){ StringBuffer buffer = new StringBuffer(); Iterator<String> nextState = mWakeLockState.keySet().iterator(); while(nextState.hasNext()){ String name = nextState.next(); Boolean state=mWakeLockState.get(name); if(state.booleanValue()){ buffer.append(name + "|"); } } if(buffer.length()>0){ buffer.deleteCharAt(buffer.length() - 1); } Settings.System.putString(getActivity().getContentResolver(), Settings.System.WAKELOCK_BLOCKING_LIST, buffer.toString()); } private void reload(){ mWakeLockState = new HashMap<String, Boolean>(); updateSeenWakeLocksList(); updateBlockedWakeLocksList(); mListAdapter.notifyDataSetChanged(); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { menu.add(0, MENU_RELOAD, 0, R.string.wakelock_blocker_reload) .setIcon(com.android.internal.R.drawable.ic_menu_refresh) .setAlphabeticShortcut('r') .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT); menu.add(0, MENU_SAVE, 0, R.string.wakelock_blocker_save) .setIcon(R.drawable.ic_wakelockblocker_save) .setAlphabeticShortcut('s') .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case MENU_RELOAD: if (mEnabled){ reload(); } return true; case MENU_SAVE: if (mEnabled){ save(); } return true; default: return false; } } private void showAlert() { /* Display the warning dialog */ mAlertDialog = new AlertDialog.Builder(getActivity()).create(); mAlertDialog.setTitle(R.string.wakelock_blocker_warning_title); mAlertDialog.setMessage(getResources().getString(R.string.wakelock_blocker_warning)); mAlertDialog.setButton(DialogInterface.BUTTON_POSITIVE, getResources().getString(com.android.internal.R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { return; } }); mAlertDialog.show(); } }