/*
* AndFHEM - Open Source Android application to control a FHEM home automation
* server.
*
* Copyright (c) 2011, Matthias Klass or third-party contributors as
* indicated by the @author tags or express copyright attribution
* statements applied by the authors. All third-party contributions are
* distributed under license by Red Hat Inc.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU GENERAL PUBLIC LICENSE, as published by the Free Software Foundation.
*
* This program 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 this distribution; if not, write to:
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package li.klass.fhem.appwidget;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import java.io.Serializable;
import java.util.List;
import javax.inject.Inject;
import li.klass.fhem.AndFHEMApplication;
import li.klass.fhem.R;
import li.klass.fhem.appwidget.service.AppWidgetUpdateService;
import li.klass.fhem.appwidget.view.WidgetSize;
import li.klass.fhem.appwidget.view.WidgetType;
import li.klass.fhem.appwidget.view.widget.base.AppWidgetView;
import li.klass.fhem.constants.Actions;
import li.klass.fhem.constants.BundleExtraKeys;
import li.klass.fhem.constants.PreferenceKeys;
import li.klass.fhem.dagger.ApplicationComponent;
import li.klass.fhem.domain.core.FhemDevice;
import li.klass.fhem.util.ApplicationProperties;
import li.klass.fhem.util.DialogUtil;
import static android.appwidget.AppWidgetManager.ACTION_APPWIDGET_CONFIGURE;
import static android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_ID;
import static android.appwidget.AppWidgetManager.INVALID_APPWIDGET_ID;
public abstract class AppWidgetSelectionActivity extends AppCompatActivity implements SelectionCompletedCallback, Serializable {
@Inject
AppWidgetDataHolder appWidgetDataHolder;
@Inject
ApplicationProperties applicationProperties;
private int widgetId;
private WidgetSize widgetSize;
public AppWidgetSelectionActivity(WidgetSize size) {
super();
this.widgetSize = size;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
inject(((AndFHEMApplication) getApplication()).getDaggerComponent());
Intent intent = getIntent();
widgetId = intent.getIntExtra(EXTRA_APPWIDGET_ID, INVALID_APPWIDGET_ID);
if (!ACTION_APPWIDGET_CONFIGURE.equals(intent.getAction())
|| widgetId == INVALID_APPWIDGET_ID) {
setResult(RESULT_CANCELED);
finish();
return;
}
if (applicationProperties.getStringSharedPreference(PreferenceKeys.STARTUP_PASSWORD, null, this) != null) {
DialogUtil.showAlertDialog(this, R.string.app_title, R.string.widget_application_password, new DialogUtil.AlertOnClickListener() {
@Override
public void onClick() {
finish();
setResult(RESULT_CANCELED);
}
});
} else {
setContentView(R.layout.appwidget_selection);
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
assert viewPager != null;
viewPager.setAdapter(new AppWidgetSelectionFragmentAdapter(getSupportFragmentManager(), this, widgetSize, this));
TabLayout tabLayout = (TabLayout) findViewById(R.id.sliding_tabs);
assert tabLayout != null;
tabLayout.setupWithViewPager(viewPager);
}
}
protected abstract void inject(ApplicationComponent applicationComponent);
private void openWidgetTypeSelection(final List<WidgetType> widgetTypes, final String... payload) {
String[] widgetNames = new String[widgetTypes.size()];
for (int i = 0; i < widgetTypes.size(); i++) {
AppWidgetView widgetView = widgetTypes.get(i).widgetView;
widgetNames[i] = getString(widgetView.getWidgetName());
}
new AlertDialog.Builder(this)
.setTitle(R.string.widget_type_selection)
.setItems(widgetNames, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int position) {
dialogInterface.dismiss();
WidgetType type = widgetTypes.get(position);
createWidget(type, payload);
}
}).show();
}
private void createWidget(WidgetType type, String... payload) {
type.createWidgetConfiguration(this, widgetId, new WidgetConfigurationCreatedCallback() {
@Override
public void widgetConfigurationCreated(WidgetConfiguration widgetConfiguration) {
appWidgetDataHolder.saveWidgetConfigurationToPreferences(widgetConfiguration, AppWidgetSelectionActivity.this);
Intent intent = new Intent(Actions.REDRAW_WIDGET);
intent.setClass(AppWidgetSelectionActivity.this, AppWidgetUpdateService.class);
intent.putExtra(BundleExtraKeys.APP_WIDGET_ID, widgetId);
startService(intent);
Intent resultIntent = new Intent();
resultIntent.putExtra(EXTRA_APPWIDGET_ID, widgetId);
setResult(RESULT_OK, resultIntent);
finish();
}
}, payload);
}
@Override
public void onRoomSelect(String roomName) {
List<WidgetType> widgetTypes = WidgetType.getSupportedRoomWidgetsFor(widgetSize);
openWidgetTypeSelection(widgetTypes, roomName);
}
@Override
public void onDeviceSelect(FhemDevice<?> clickedDevice) {
List<WidgetType> widgetTypes = WidgetType.getSupportedDeviceWidgetsFor(widgetSize, clickedDevice);
openWidgetTypeSelection(widgetTypes, clickedDevice.getName());
}
@Override
public void onOtherWidgetSelect(WidgetType widgetType) {
createWidget(widgetType);
}
}