/*
* Copyright (C) 2015-2016 Willi Ye <williye97@gmail.com>
*
* This file is part of Kernel Adiutor.
*
* Kernel Adiutor is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Kernel Adiutor is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Kernel Adiutor. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.grarak.kerneladiutor.services.profile;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.widget.RemoteViews;
import android.widget.RemoteViewsService;
import com.grarak.kerneladiutor.R;
import com.grarak.kerneladiutor.database.tools.profiles.Profiles;
import com.grarak.kerneladiutor.services.boot.Service;
import com.grarak.kerneladiutor.utils.Prefs;
import com.grarak.kerneladiutor.utils.Utils;
import com.grarak.kerneladiutor.utils.kernel.cpu.CPUFreq;
import com.grarak.kerneladiutor.utils.root.RootUtils;
import java.util.ArrayList;
import java.util.List;
/**
* Created by willi on 17.07.16.
*/
public class Widget extends AppWidgetProvider {
private static final String TAG = Widget.class.getSimpleName();
private static final String LIST_ITEM_CLICK = "list_item";
private static final String ITEM_ARG = "item_extra";
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
for (int appWidgetId : appWidgetIds) {
Intent svcIntent = new Intent(context, WidgetService.class);
svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
svcIntent.setData(Uri.parse(svcIntent.toUri(Intent.URI_INTENT_SCHEME)));
RemoteViews widget = new RemoteViews(context.getPackageName(), R.layout.widget_profile);
widget.setRemoteAdapter(R.id.profile_list, svcIntent);
widget.setPendingIntentTemplate(R.id.profile_list, getPendingIntent(context, LIST_ITEM_CLICK));
appWidgetManager.updateAppWidget(appWidgetId, widget);
}
}
private PendingIntent getPendingIntent(Context context, String action) {
Intent intent = new Intent(context, getClass());
intent.setAction(action);
return PendingIntent.getBroadcast(context, 0, intent, 0);
}
@Override
public void onReceive(final Context context, Intent intent) {
super.onReceive(context, intent);
if (intent.getAction().equals(LIST_ITEM_CLICK)) {
final int position = intent.getIntExtra(ITEM_ARG, 0);
Profiles.ProfileItem profileItem = new Profiles(context).getAllProfiles().get(position);
if (!Prefs.getBoolean("profileclicked" + position, false, context)) {
Prefs.saveBoolean("profileclicked" + position, true, context);
Utils.toast(context.getString(R.string.press_again_to_apply, profileItem.getName()),
context);
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
Prefs.saveBoolean("profileclicked" + position, false, context);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
} else {
Prefs.saveBoolean("profileclicked" + position, false, context);
RootUtils.SU su = new RootUtils.SU(true, TAG);
List<String> adjustedCommands = new ArrayList<>();
for (Profiles.ProfileItem.CommandItem command : profileItem.getCommands()) {
CPUFreq.ApplyCpu applyCpu;
synchronized (this) {
if (command.getCommand().startsWith("#")
&& (applyCpu = new CPUFreq.ApplyCpu(command.getCommand()
.substring(1))).toString() != null) {
adjustedCommands.addAll(Service.getApplyCpu(applyCpu, su));
} else {
adjustedCommands.add(command.getCommand());
}
}
}
for (String command : adjustedCommands) {
su.runCommand(command);
}
su.close();
Utils.toast(context.getString(R.string.applied), context);
}
}
}
private static class ListViewFactory implements RemoteViewsService.RemoteViewsFactory {
private final Context mContext;
private List<Profiles.ProfileItem> mItems;
private ListViewFactory(Context context) {
mContext = context;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public void onCreate() {
mItems = new Profiles(mContext).getAllProfiles();
}
@Override
public int getCount() {
return mItems.size();
}
@Override
public void onDataSetChanged() {
onCreate();
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public RemoteViews getViewAt(int position) {
RemoteViews row = new RemoteViews(mContext.getPackageName(), R.layout.widget_profile_item);
row.setTextViewText(R.id.text, mItems.get(position).getName());
Intent i = new Intent();
Bundle extras = new Bundle();
extras.putInt(ITEM_ARG, position);
i.putExtras(extras);
row.setOnClickFillInIntent(R.id.text, i);
return (row);
}
@Override
public RemoteViews getLoadingView() {
return null;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public void onDestroy() {
}
}
public static class WidgetService extends RemoteViewsService {
@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {
return new ListViewFactory(getApplicationContext());
}
}
}